【system verilog】非合併數組、合併數組、混合數組和多維數組的小探討

前言

來了的話點個贊吱一聲在走呀~~~

因爲需要解決一個問題,所以決定對合並數組/非合併數組以及混合場景進行進行一下探索。

問題

已知一個多維混合數組的定義爲:

bit [3:0][7:0][15:0] Array [3:0][7][6];

那麼當我們寫下

Array[2][3][2][2] = xxxx;

的時候,到底是對哪個位置賦值了??

話不多說,直接看解答好啦~最後的答案其實很簡單,因爲有一個簡單的圖示估計很多人知道,就是逆時針索引法:

因此可以得到結論:

好的,接下來進入學習時間,拿出書搞一搞。

非合併數組

當索引位於數組名稱後方時候,我們定義的就是非合併數組:

bit [7:0] array1 [3];

其實我覺得上面這個數組可以認爲是混合數組了,畢竟左側也有索引,所以不妨用這個方式做示例,二者在內部存儲上是等價的:

byte array1[3];

非合併數組在數據存儲中,一般以字爲邊界(即32bit)來存儲數據,典型的byte/int/shortint都是存儲在一個字中,longint因爲超出了一個字的邊界因此存儲在兩個字當中(64bit空間)。如果數組元素位寬不足一個字,則使用低位存放數據,高位閒置不用。

 

 

非合併數組由於存儲空間並不連續,因此無法對整體賦值只能夠分開賦值,比如下面這種寫法會報編譯錯誤:

bit [7:0] array1[4];
array1 = '1;

多維的非合併數組

由於非合併數組是獨立空間存儲的,那麼多維的也很好理解,牢記上面的逆時針索引規則,對於:

byte array[4][5][6];

可以直接理解爲:獨立的4個(獨立的5個(獨立的6個位寬爲1byte的數據)),那麼也就是4*5*6個byte獨立數據。

合併數組

如果想能夠整體進行賦值的話,那麼就必須使用合併數組來進行定義,把數組名稱右邊的索引移到左邊最前面去就可以了:

bit [3:0][7:0] array2;

此時合併數組的存儲方式爲:

 

那麼更多維的合併數組也就很好理解了,就是在二維合併數組的基礎上繼續拼接,索引的時候按照逆時針原則從左往右看。

來看一個簡單的例子:
 

bit [1:0][1:0][1:0]array3;
array3 = 8'h6B;

先預期以下,array3是被定義的8bit合併數組(2*2*2),整體賦值之後應該被賦值爲下圖形式:

此時我們如果取值array3[1]則會取到6,取值array3[1][1]則會取到1;

那麼我們上機跑一下遍歷打印看看:

bit [1:0][1:0][1:0]array3;
array3 = 8'h6B;
foreach(array3[i]) begin
    $display("array3[%0d] = 'h%0h", i, array3[i]);
    foreach(array3[i][j]) begin
        $display("    array3[%0d][%0d] = 'h%0h", i, j, array3[i][j]);
	foreach(array3[i][j][k]) begin
	    $display("        array3[%0d][%0d][%0d] = 'h%0h", i, j, k, array3[i][j][k]);
	end
    end
end

 跟我們的預測是一摸一樣的:

混合數組

合併和非合併數組都研究的差不多了,最後就可以看下混合數組。其實看混合數組時候就是先看右側的非合併數組,再看左側的合併數組,看數組時都是從左往右看,那麼總結起來就是逆時針規則了。

因此我認爲前面理解清楚後,就沒必要繼續寫了~~~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章