天天看點

SystemVerilog----關于foreach

foreach結構指定在數組元素上的疊代。它的自變量是一個指明任意類型數組(固定尺寸的、動态的、及聯合數組)的辨別符,然後緊跟着一個包圍在方括号内的循環變量的清單。每一個循環變量對應于數組的某一維。foreach結構類似于一個使用數組範圍替代一個表達式來指定重複次數的repeat循環。 

例子:

Copy Code

string words[2] = {"hello", "world"};
int prod[1:8][1:3];

foreach (words[j])
    $display(j, words[j]); // 列印每一個索引和值

foreach (prod[k,m])
    prod[k][m] = k * m;    // 初始化      

循環變量的數目必須比對數組變量的維數。空循環變量可以用來訓示在對應的數組維數上沒有疊代,并且趨向于尾部的連續空循環變量可以被忽略。循環變量是自動的、隻讀的,并且它們的作用範圍對于循環來講是本地的。每一個循環變量的類型被隐含地聲明成與數組索引的類型一緻。數組中任何具有相同辨別符的循環變量都是錯誤的。 

循環變量到數組索引的映射由維基數确定,如23.7節所描述的那樣。對于foreach循環,更高基數的索引變化也更快。

Copy Code

//     1  2  3         3    4       1   2 -> 維數
int A [2][3][4]; bit [3:0][2:1] B [5:1][4];

foreach(A[i, j, k]) ...
foreach(B[q, r, , s]) ...      

對于第一條foreach子句,i從0到1疊代,j從0到2疊代,k從0到3疊代。對第二條foreach子句,q從5到1疊代,r從0到3疊代、s從2到1疊代(第三個索引的疊代被忽略)。 

多個循環變量對應于在指定索引上疊代的嵌套循環。循環的嵌套由維基數确定;外層循環對應于較低的基數索引。在上面的第一個例子中,最外層的循環在i上疊代,最内層的循環在k上疊代。 

當循環變量用在表達式當中而不是作為指定數組的索引的時候,它們被自動地強制轉換到與索引類型一緻的類型。對于固定尺寸或動态數組,強制轉換類型時int。對于以特定索引類型索引的聯合數組,強制轉換類型與索引類型一緻。對于使用通配符索引(*)進行索引的聯合數組,強制轉換類型是無符号的longint類型。為了使用不同的類型,可以使用一個顯式的強制類型轉換。

Group