“数组遍历顺序和中国古代的丞相有什么关系?”
来源| 杰瑞IC验证(ID:Jerry_IC) |原创 作者| Jerry Ren
Jerry问大家,SystemVerilog中的数组会玩吗?
有人说了“ 请把那个“吗”字去掉!哥们虽是初学验证也不至于不会玩数组吧?”
哥们儿,今天先帮我看下这个数组:
logic [3:0][7:0][5:0]jerry_play[15:0][7:0][4:0];
这个数组怎么遍历?这个数组是什么引用顺序? 怎么样?有没有小小的晕晕乎乎?
有人又说了,这个数组现实中谁会这么用?没用过这么多维的!
这个理由不错,但是这个复杂的梳理不清楚,你就敢保证简单的数组能理解的很清晰吗?万一碰到需要维数稍微多点的数组怎么办呢?
01
好了,闲话不多说,我们直接来一段代码,先告诉你想遍历这个数组应该怎么写:
foreach(jerry_play[i,j,k,l,m,n])
begin
jerry_play[i][j][k][l][m][n] = 1;
end
对于初学者中的初学者,Jerry还是要提醒一句,请注意这个写法的细节:
foreach括号里面jerry_play[i,j,k,l,m,n]中间的循环因子是逗号隔开这样列出来的哦!
注意绝对不能写成这样:
foreach(jerry_play[i][j][k][l][m][n])❌
而里面用的时候是这样写:
jerry_play[i][j][k][l][m][n] = 1;
里面的i、j、k等这些字母就是代表各个维度的循环变量,名字你可以自己起哦。
又有人问了:我有的维度不想遍历怎么办?
告诉你,你可以“不写字母但是把坑留上”,结合代码自己理解,比如:
foreach(jerry_play[ ,j,k,l,m,n])
begin
jerry_play[0][j][k][l][m][n] = 1;
end
02
说了半天,什么i、j、k、l、m、n,到底和我们的jerry_play这个数组怎么对应的??
我们再把这个数组请出来,告诉大家对应关系如下:
即, i 对应15:0维度
j 对应7:0维度
k 对应4:0维度
l 对应3:0维度
m 对应7:0维度
n 对应5:0维度
相信不清楚这个顺序的看到这里应该很清楚了,但是也许你过两天就忘了!!
不要怕!! 帮你记住它是Jerry的义务:
一种方法呢就是可以尝试理解下为什么是这个顺序,这个原因其实是和SystemVerilog的仿真器存储数组元素的方式有点关系。先走非合并数组的维度、再走合并数组的维度。感兴趣可以自己查更多的资料研究研究。
如果那种想不清楚也没关系,来粗暴点!老规矩,上Jerry的心法口诀:
“先右边再左边,每边保持从左到右的汉字读法”
为什么先右边再左边呢?因为自古右为上嘛,中国古代丞相分为左右丞相,往往也是右丞相更大嘛,哈哈。到了各自的那一边后,像读课文一样从左到右就OK了!又扯远了, 但是只要你记住了我就很欣慰了~
03
不过说真的,说到数组呢,其实还有很多好玩的,比如:
byte [3:0] JERRY_AA [2][ ][ $ ];
这个数组你会玩吗?
再比如:
int JERRY_BB [1][2][ ]=new[4];
这句话Jerry明确告诉你是错的!你真的知道错在哪里吗?
哈哈哈,关注杰瑞IC验证,来日方长!Jerry以后和大家一起慢慢玩!
今天就先聊到这里,祝各位同学天天开心,大吉大利~