索引操作对SystemVerilog中的整数类型执行什么操作?

时间:2012-12-11 15:22:14

标签: arrays indexing system-verilog

我正在尝试将一些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语句的第一行中,它看起来像尝试使用布尔值索引整数类型。在第二个中,它看起来像尝试使用枚举值索引整数类型。然而,这段代码显然有效。有人可以解释它在做什么吗?

2 个答案:

答案 0 :(得分:2)

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

如果que_ints[5]为整数0xdeadbeef,则为:

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

在SystemC中,range()函数是必然结果。

答案 1 :(得分:1)

arr_intsint类型的关联数组,其中用作键的类型为typ_struct

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

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

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

<小时/> 在第二行:

que_intsint类型的队列。

因此que_ints[i]将为您提供队列中i位置的整数。

que_ints[i][obj_struct]中,它会隐式地将枚举类型转换为整数值(实际上是位[2:0]),并根据该值给出位索引。