2012-12-11 65 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]),併爲您提供基於此的位索引。