SystemVerilog中的多維數組

2021-03-02 路科驗證

20200630把零零碎碎收拾一下

在上次關於 SystemVerilog 數組網絡研討會之後,我收到了幾個有關數組和結構體之間的差異以及如何跨模塊共享聲明的問題。關於這個以及相關的更多內容將涵蓋在我的下一個網絡研討會-SystemVerilog的結構體和包。會議前半部分關於結構體,包含的主題有,何時該選擇組合結構體(packed structure)或非組合結構體(unpacked structure)。包是組織相關定義(如 USB 測試平臺的所有類或 PCI 硬體定義)的一種好方法。但是導入包意味著什麼呢?在網絡研討會的後半部分,你將了解導入包的最佳位置,以及如何編寫代碼,來避免在多個包中有重名定義的問題。例如,為什麼以下代碼不編譯,RED 和 GREEN 名稱的 Bug 是什麼?調試並找出答案。

20200609SystemVerilog中的多維數組

謝謝所有註冊並參加了有關SystemVerilog數組的網絡研討會的人。有很多很棒的問題,在這裡(https://verificationacademy.com/sessions/taking-systemverilog-arrays-to-the-next-dimension/questions-and-answers)我已經回答了很多。「SystemVerilog數組」是一個大話題,我不得不省略許多想法。有關多維數組(Multidimensional Arrays,MDA)的問題很多,因此這裡僅作簡短介紹。複製並粘貼這些代碼,然後在你喜歡的模擬器上運行。搞亂,犯錯,再進行調試–——你是驗證工程師,請牢記這一點!讓我們從一個固定大小的一維數組開始,其中包含4個元素和一些代碼對其進行初始化。


int one[4];
foreach (one[i]) one[i] = i;

考慮MDA的最佳方法是它們是數組的數組。因此,如下所示的二維數組由3個數組組成,每個數組包含4個元素。

int two[3][4]; //簡明寫法,等價於

two = '{ 3 { one } };
$display("two = %p", two); // '{'{0, 1, 2, 3}, '{0, 1, 2, 3}, '{0, 1, 2, 3}}

到目前為止,你們知道我最喜歡的遍歷數組的方法是使用foreach循環。SystemVerilog在這裡有一個獨特之處 ——foreach用逗號來分隔索引變量列表,而不是用括號將索引括起來。這兒有一個例子。

foreach (two[i,j]) // Not two[i][j]
$display("two[%0d][%0d]=%0d", i, j, two[i][j]);

two[0][0]=0
two[0][1]=1
two[0][2]=2
two[0][3]=3
two[1][0]=0
two[1][1]=1
two[1][2]=2
two[1][3]=3
two[2][0]=0
two[2][1]=1
two[2][2]=2
two[2][3]=3

你可以將數組類型與MDA混合使用。包含幾個動態數組的固定大小的數組如何?更好的是,動態數組不必具有相同的大小,因此最終數組可以是三角形

int triangle[3][];
initial begin
$display("Start: triangle = %p\n", triangle);

foreach (triangle[i]) begin
$display("Construct: triangle[%0d]", i);
triangle[i] = new[i+1];
end
$display("Constructed: triangle = %p\n", triangle);


foreach (triangle[i,j]) begin
$display("Initialize: triangle[%0d][%0d]", i, j);
triangle[i][j] = i*10 + j;
end
$display("Final: triangle = %p", triangle); // '{'{0}, '{0, 0}, '{0, 0, 0}}
end

在構建測試平臺時,記分板需要保存期望的結果,直到將其與設計中的實際值進行比較。如果它可以對transaction重新排序,則可以將transaction存儲在關聯數組中,你便可輕鬆地查找它們,而且鍵值不會隨著transaction在系統中的移動而改變。例如,可能有一個地址欄位,因此可以將地址作為索引,將該transaction存入關聯數組中。除非兩個transaction具有相同的地址,否則該方法很有效。因為這兩個有相同地址的transaction都將存儲在關聯數組中的相同位置,這是不可能的。因此,應該使得transaction隊列裡的每個元素都具有唯一的地址。這話我已經說了幾十年了,但實際上從未這樣做過。這是多簡單的一件事呀!首先,這裡先給出一個僅包含整數的簡化版本。

int sb[int][$];
initial begin
$display("Start: sb = %p\n", sb);
for (int i=0; i<22; i=i+2) begin
sb[i%10].push_front((i/10)*10);
end
$display("Init: sb = %p\n", sb);
end

現在,這裡有一個更詳細的例子。Transaction類具有地址和數據屬性。如果使用 new(12)來構造對象,構造函數將該值拆分為十位和個位的數字,因此數據為10,地址為2。

typedef bit[23:0] addr_t;
class Xact;
addr_t addr;
int data;
function new(input int i);
addr = i%10; // Use one's digit
data = (i/10) * 10; // Use 10's digit
endfunction
endclass

Xact scoreboard[addr_t][$], t;

function void sb_add(input Xact t);
scoreboard[t.addr].push_front(t);
endfunction

最後,以下的代碼將用賦值為0,1,2....21的transaction填入記分板。

initial begin
// Fill scoreboard with 0, 1, 2, ... 21
for (int i=0; i<22; i++) begin
t = new(i);
sb_add(t);
end
// Display the scoreboard contents
foreach (scoreboard[i,j]) begin
if (j==0) $write("\n scoreboard[%0d] = ", i);
$write("%0d ", scoreboard[i][j].data);
end
end

在你最喜歡的模擬器上試試這段代碼,特別是當它從Q開始的時候。https://blogs.sw.siemens.com/verificationhorizons/?s=Chris+Spear&submit=Search

相關焦點

  • MATLAB多維數組常用方法
    8 多維數組在實際應用的過程中,經常需要構造多於二維的數組,我們將多於二維的數組統稱為多維數組。對於二維數組,人們習慣於把數組的第1維稱為「行」,把第2維稱為「列」,我們將第3維稱為「頁」。由於更多維的數組的顯示並不直觀,所以本節以三維數組為例來介紹多維數組的使用。8.1 多維數組的創建創建多維數組最常用的方法有以下4種。(1)直接通過「全下標」元素賦值的方式創建多維數組。
  • Java語法 | 多維數組
    但是,在本篇,查老師將帶你學習一種更為高級的方式:多維數組。概述上一篇,我們學的用來存儲多個數據的數組,它們被稱為一維數組。多維數組,類似於前面學過的嵌套 if、嵌套循環。查老師覺得,你也可以把多維數組稱之為 "嵌套數組"。它的常見表現形式有:二維數組、三維數組。
  • C/C++編程筆記:數組和字符串丨多維數組詳解
    數組基礎在C / C ++中,我們可以用簡單的單詞將多維數組定義為數組數組。多維數組中的數據以表格形式(以行主要順序)存儲。
  • 記錄集賦值給數組後,利用轉置函數處理多維數組的方法
    大家好,今日繼續講解VBA資料庫解決方案,今日講解的是第76講,內容是:記錄集賦值給數組後,利用轉置函數處理多維數組的方法。我在第一冊的第43講中,我講了將記錄集存入數組的方案,並通過一個Index函數在工作表中恢復數組數據的方法。今日講的是利用轉置函數來完成同樣的功能。
  • VBA多維數組的「扁平化處理」—— On Error Resume Next
    這是我今天碰到的來自一個妹子工作中的實際問題:需要對下面數據進行清洗轉換。
  • Python數據分析筆記#5.1 Numpy-多維數組
    創建多維數組多維數組的數據類型Numpy數組的運算Numpy數組的索引和切片數組轉置和軸對換Numpy簡介Numpy(Numerical Python)是Python數值計算最重要的基礎包。Numpy的ndaray:多維數組ndarray是一個快速而靈活的大數據集容器,我們可以利用這種數組對整塊數據執行數學運算。ndarray中所有元素必須相同類型。
  • SystemVerilog語言簡介(與Verilog的30點對比)
    數組在Verilog中可以聲明一個數組類型,reg和線網類型還可以具有一個向量寬度。在一個對象名前面聲明的尺寸表示向量的寬度,在一個對象名後面聲明的尺寸表示數組的深度。例如:reg [7:0] r1 [1:256]; // 256個8位的變量在SystemVerilog中我們使用不同的術語表示數組:使用「壓縮數組(packed array)」這一術語表示在對象名前聲明尺寸的數組;使用「非壓縮數組(unpacked array)」這一術語表示在對象名後面聲明尺寸的數組。
  • c+中的動態數組使用
    C++的new操作符是該語言一個非常好的語法特性,然而實際使用中卻發現new操作符有不少限制,為突出的一點便是用new操作符分配多維數組空間時,不能讓數組的每一維都動態可變。本文將對此提出一個簡單直觀的解決方案,在一個實際問題的簡化模型中加以說明,並以此釋清許多初學者對C++中new操作符與多維數組的誤區。1.
  • 3分鐘短文|PHP 多維數組按值排序,別抓狂看這裡
    引言如果你經常寫 PHP,要說你沒用過數組,那簡直是不可能的。PHP 一個數組可以走遍大街小巷,行遍萬水千山。數組相關的函數也馬虎不得,如影隨形。今天說說一個稍顯棘手的問題,多維數組的排序。學習時間比如下面的數組,如果想要根據 order 的值進行排序(升序,降序),怎麼做呢?
  • 《利用python進行數據分析》4.1 ndarray:多維數組對象
    是生成隨機數,為2行3列,隨機數是-1~1之間的小數運算:乘法運算(點積)data * 10data + data兩個屬性:data.shape 用元組表示的數組維度data.dtype 顯示多維數組的數據類型
  • D02 Numpy常用函數,如何優雅的遍歷一個多維數組?
    當我們想要遍歷一個多維數組的時候,如果通過不停的使用循環去遍歷,這會讓我們的代碼可讀性與性能都變得很差,numpy提供了一個函數nditer,以幫助我們遍歷數組。nditer的入參是一個數組,返回值是一個可迭代對象。nditer 默認會優先遍歷行序,通過order參數可以使其優先遍歷列序。
  • NumPy數組中的廣播機制及結構化數組
    前面講過,在NumPy中,如何通過用表示數組各個維度長度的元素(也就是數組的型)把數組轉換成多維數組。因此,若兩個數組的各維度兼容,也就是兩個數組的每一維等長,或其中一個數組為一維,那麼廣播機制就適用。如果這兩個條件都不能滿足,NumPy就會拋出異常,說這兩個數組不兼容。執行完代碼之後,我們就得到了兩個數組:4x4的數組以及一個一行四列的數組。
  • 共享在SystemVerilog中的通用庫讓編程更有趣
    數據類型必須是比特類型(bit,logic,reg)、枚舉類型或者打包數組、打包結構體。以下示例展示了如何利用其中的一個函數將打包的數組轉化為解包的數組。這些類可以根據數據類型和數組的大小進行設定。數據類型可以是任意類型。以下示例展示了一個顛倒被解包數組元素的reverse函數。
  • numpy中數組的遍歷技巧
    在numpy中,當需要循環處理數組中的元素時,能用內置通函數實現的肯定首選通函數,只有當沒有可用的通函數的情況下,再來手動進行遍歷,遍歷的方法有以下幾種
  • 面向對象編程從小白到王者系列-認識程序中的數組
    有很多老鐵對C#中數組的理解不是很清楚,所以今天我就出一片文章來解釋一下數組這個神秘的東東是什麼,它和我們日常生活中有什麼關係,在日常生活中我們有哪些地方用到。但是在實際的生活中或真正的程序中是不會這樣做的!
  • 3分鐘短文|PHP多維數組搜索值,就只能for循環?這樣寫更高效
    引言我們講解了很多種PHP數組操作的引用場景。今天我們接著分享這方面的知識,說一說對於多維數組,如何根據值搜索,並返回數組的索引值。,如果匹配上就將數組的索引返回,如果不存在則返回 null。對於上述 $userdb 關聯數組的結構,顯然,使用PHP內置的函數操作起來,更為直觀和快捷。我們只需要先把 uid 列的元素全部取出,因為上層結構是默認數字索引,所以此處不用手動指定索引值;然後,在提取的數組中搜索值,使用 array_search 執行返回鍵。
  • PHP數組的處理方法
    > 3、統計數組的長度:count():  count函數有兩個參數:  0(或COUNT_NORMAL)為默認,不檢測多維數組(數組中的數組);  1(或COUNT_RECURSIVE)為檢測多維數組  $arr=array(  0=>array('title' => '蘋果', 'viewnum'
  • Java基礎——數組例題&二維數組
    數組例題:例題1:申請String字符串數組,並拿出裡面的數據。先申請一個String字符串,然後最裡面輸入要存儲的值,使用for循環申請變量i,i小於String數組的長度(.Length),然後列印String數組的第i個值就可以取出裡面的數組。
  • SystemVerilog教程之Data Types Part-4
    隊列中的每個元素都由一個序號表示,該序號表示其在隊列中的位置,0表示第一個,$表示最後一個。 隊列類似於自動增長和收縮的一維 unpacked array。因此,與數組一樣,可以對數組進行使用索引,連接,切片和比較運算。
  • 零基礎學FPGA(三)Verilog語法基基礎基礎(上)
    關於功能定義是模塊中最重要的部分,有三種方法可在模塊中產生邏輯  (1)用assign聲明語句,assign 語句主要用於組合邏輯電路  (2)用實例元件,例如 and #2 u1(q,a,b);(這個我自己概念也有點模糊,不知道怎麼解釋)  (3)用always塊,例如 always @(clk or clr)  begin