2012-12-11 44 views
2

我试图将一些SystemVerilog代码移植到C++/SystemC,并且在一些行中我看到奇怪的数组索引。这是我看到的简化版本。索引操作对SystemVerilog中的整数类型做什么?

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

什么是'true'定义为? – dwikle

+0

我将true替换为1.在实际代码中,它是一个用作true/false布尔值的函数,但实现为一位。我被混淆了与C++等价物,实际上使用bool类型 – Rich

回答

2

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

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

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

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

+0

谢谢,我没有意识到整数可以隐式地位比特索引比特/逻辑数组。 – Rich

1

arr_ints是类型为int的关联数组,其中用作关键字的类型是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]),并为您提供基于此的位索引。