2

我正在尝试将一些 SystemVerilog 代码移植到 C++/SystemC,并且有点卡在我看到奇怪数组索引的几行上。这是我所看到的简化版本。

typedef enum bit [2:0] {enu_red, enu_blue, enu_green} typ_enum; 

typedef struct packed {
    bit [3:0] field1;
    bit [3:0] field2;
} typ_struct;

...

var int arr_ints[typ_struct];
var int que_ints[$];

typ_struct obj_struct;
typ_enum   obj_enum;

int i = 3;

// assume all the declared variables hold valid values at this point
// also assume que_ints[i] is valid

if ((!arr_ints[obj_struct][1]) // these two lines are the problem
    && (que_ints[i][obj_struct])
)
begin
    // do something
end

现在,在我移植此代码后,我得到了一些我完全理解的编译器错误,因为原始代码对我来说看起来并不完全正确。在 if 语句的第一行,它看起来像是试图用布尔值索引一个整数类型。在第二个中,它看起来像是试图用枚举值索引一个整数类型。然而,这段代码显然有效。有人可以解释它在做什么吗?

4

2 回答 2

2

这会对整数类型进行位切片。您将访问底层int表示的实际位。

如果que_ints[5]是整数0xdeadbeef,那么:

  • que_ints[5][3]是 1
  • que_ints[5][7:4]0xe

在 SystemC 中,range()函数是推论。

于 2012-12-11T17:03:03.053 回答
1

arr_ints是 type 的关联数组int,其中用作键的类型是typ_struct

所以arr_ints[obj_struct]会给你一个整数。

使用索引整数类型[n]将为您提供索引 n 处的位。

所以arr_ints[obj_struct][1]会给你整数的第 1 位arr_ints[obj_struct]


在有问题的第二行:

que_ints是一个类型的队列int

所以que_ints[i]会给你i队列中位置的整数。

que_ints[i][obj_struct]中,它会将枚举类型隐式转换为整数值(实际上是 bit[2:0]),并基于此为您提供位索引。

于 2012-12-11T17:04:56.237 回答