隊(duì)列是大小可變的有序集合,隊(duì)列中元素必須是同一個(gè)類型的。隊(duì)列支持對(duì)其所有元素的訪問(wèn)以及在隊(duì)列的開始或結(jié)束處插入和刪除。
第0個(gè)位置表示第一個(gè)元素,第$個(gè)位置表示隊(duì)列的最后一個(gè)元素。
隊(duì)列也是一個(gè)一維unpacked數(shù)組。隊(duì)列可用于建模后進(jìn)先出(LIFO)或先進(jìn)先出(FIFO) buffer。
data_type queue_name [$ :];
下面是隊(duì)列的示例
module dq; // A queue of 8-bit bytes – unbounded queue bit[7:0] dq1[$]; // A queue of strings – unbounded queue string mname[$] = { "Bob" }; // An initialized queue – unbounded queue bit[15:0] dq2[$] = { 3, 2, 7, 1 }; // A bounded queue – size = 256. Maximum index @255. bit q2[$:255]; //bit q2[255:$]; // Compile ERROR – invalid syntax int dq2_size; initial begin dq1[0] = 'hff; dq1[1] = 'h00; dq1[$] = 'h01; //last entry - will override dq1[1]='h00 $display($stime,,,"dq1=",dq1); dq1[1] = 'h02; $display($stime,,,"dq1=", dq1); mname[1] = "mike"; //push-in - grow the queue $display($stime,,, "mname=", mname); //displays initialized 4 entries $display($stime,,,"dq2=", dq2); dq2[4] = {16'h 1111}; $display($stime,,,"dq2=", dq2); q2[0] = 1; q2[1] = 0; $display($stime,,, "q2=",q2); q2[3] = 1; //skipped entry '2' - so no 3rd entry $display($stime,,, "q2=",q2); dq2_size = dq2.size( ); $display($stime,,,"dq2 size = %0d",dq2_size); for (int i = 0; i < dq2_size; i++) //read the entire queue $display($stime,,,"dq2[%0d] = %0h", i, dq2[i]); //insert a value at index 256 which is out of bound //dq2.insert(256,1); //You get a run-time Error end endmodule
上面的例子中聲明了兩種類型的隊(duì)列:有界隊(duì)列和
無(wú)界隊(duì)列。
有界隊(duì)列:
“q2[$:255];”有界的意思是最大下標(biāo)
隊(duì)列是有界的。在本例中,最大索引是255,這意味著它可以存儲(chǔ)的元素是256(0到255)。如果你想在index 256插入元素,就會(huì)出現(xiàn)溢出,數(shù)據(jù)就會(huì)丟失。
無(wú)界隊(duì)列為:
bit[7:0] dq1[$]; // A queue of 8-bit bytes – unbounded queue string mname[$] = { "Bob" }; // A queue of strings – unbounded queue bit[15:0] dq2[$] = { 3, 2, 7, 1 }; // An initialized queue – unbounded queue
無(wú)界隊(duì)列的大小沒(méi)有上限。
仿真log:
0 dq1='{'hff, 'h1} 0 dq1='{'hff, 'h2} 0 mname='{"Bob", "mike"} 0 dq2='{'h3, 'h2, 'h7, 'h1} 0 dq2='{'h3, 'h2, 'h7, 'h1, 'h1111} 0 q2='{'h1, 'h0} 0 q2='{'h1, 'h0} 0 dq2 size = 5 0 dq2[0] = 3 0 dq2[1] = 2 0 dq2[2] = 7 0 dq2[3] = 1 0 dq2[4] = 1111 V C S S i m u l a t i o n R e p o r t
將值'ff'和'00" 賦給dq1的前兩個(gè)元素(dq1[0]和dq1[1])。之后,賦值最后一個(gè)條目(dq1[$])為'h01。此時(shí)dq1[1]就是'h01。最后在賦值dq1[1]為'h02,實(shí)際打?。?/p>
0 dq1='{'hff, 'h1} 0 dq1='{'hff, 'h2}
push一個(gè)新值“mike”到隊(duì)列“mname”
0 mname='{"Bob", "mike"}
打印初始化的隊(duì)列dq2,然后push一個(gè)值16'h1111
0 dq2='{'h3, 'h2, 'h7, 'h1} 0 dq2='{'h3, 'h2, 'h7, 'h1, 'h1111}
然后,賦值q2[0] = 1, q2[1] = 0。
0 q2='{'h1, 'h0}
賦值q2[3] = 1。但請(qǐng)注意,由于這個(gè)時(shí)候q2[2]還不存在,所以會(huì)忽略或者報(bào)錯(cuò)。
0 q2='{'h1, 'h0}
然后,讀取整個(gè)隊(duì)列dq2。首先得到隊(duì)列的大小并將其存儲(chǔ)在dq2_size中,遍歷整個(gè)隊(duì)列并顯示每個(gè)元素。
0 dq2 size = 5 0 dq2[0] = 3 0 dq2[1] = 2 0 dq2[2] = 7 0 dq2[3] = 1 0 dq2[4] = 1111
最后,在索引256處插入一個(gè)值
dq2.insert(256);
由于" dq2 "是一個(gè)最大下標(biāo)為255的有界數(shù)組,試圖插入索引為256的值會(huì)報(bào)錯(cuò):
Error-[DT-MCWII] Method called with invalid index testbench.sv, 45 "insert" method called with invalid index (index:256) Please make sure that the index is positive and less than size.
審核編輯:湯梓紅
-
Verilog
+關(guān)注
關(guān)注
28文章
1345瀏覽量
109996 -
System
+關(guān)注
關(guān)注
0文章
165瀏覽量
36888 -
隊(duì)列
+關(guān)注
關(guān)注
1文章
46瀏覽量
10889
原文標(biāo)題:SystemVerilog中的隊(duì)列
文章出處:【微信號(hào):芯片驗(yàn)證工程師,微信公眾號(hào):芯片驗(yàn)證工程師】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論