我正在尝试将一些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语句的第一行中,它看起来像尝试使用布尔值索引整数类型。在第二个中,它看起来像尝试使用枚举值索引整数类型。然而,这段代码显然有效。有人可以解释它在做什么吗?
答案 0 :(得分:2)
这会对整数类型进行位切片。您将访问基础int
表示的实际位。
如果que_ints[5]
为整数0xdeadbeef
,则为:
que_ints[5][3]
是1 que_ints[5][7:4]
是0xe
。在SystemC中,range()
函数是必然结果。
答案 1 :(得分:1)
arr_ints
是int
类型的关联数组,其中用作键的类型为typ_struct
。
所以arr_ints[obj_struct]
会给你一个整数。
使用[n]
索引整数类型将为您提供索引n处的位。
所以arr_ints[obj_struct][1]
会在arr_ints[obj_struct]
给出整数的第1位
que_ints
是int
类型的队列。
因此que_ints[i]
将为您提供队列中i
位置的整数。
在que_ints[i][obj_struct]
中,它会隐式地将枚举类型转换为整数值(实际上是位[2:0]),并根据该值给出位索引。