前言
來了的話點個贊吱一聲在走呀~~~
因爲需要解決一個問題,所以決定對合並數組/非合併數組以及混合場景進行進行一下探索。
問題
已知一個多維混合數組的定義爲:
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
跟我們的預測是一摸一樣的:
混合數組
合併和非合併數組都研究的差不多了,最後就可以看下混合數組。其實看混合數組時候就是先看右側的非合併數組,再看左側的合併數組,看數組時都是從左往右看,那麼總結起來就是逆時針規則了。
因此我認爲前面理解清楚後,就沒必要繼續寫了~~~