天天看点

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