上一篇文章中對兩個典型的隨機方法在靜態(tài)對象中的隨機特性進行了探究:
【芯片驗證】異步電路碎碎念(九)靜態(tài)對象中的隨機函數(shù)特性探究
在此基礎上這一篇來討論如何在靜態(tài)對象內構建可控的隨機方法。先把上一篇的結論拿出來:
1.縱向看,無論是$random還是$urandom都實現(xiàn)了隨機功能,且每次隨機值不同;
2.橫向看,兩個例化模塊對比,$random每次隨機的結果不同,而$urandom每次隨機的結果相同;
3.以不同的種子進行仿真時,同一個例化模塊,$random的隨機結果每次都相同,而$urandom每次的隨機結果是不同的;
再把我們的需求明確下:
1.隨機數(shù)值是可控且可以復現(xiàn)的,不同的種子隨機出不同的結果,相同的種子隨機出相同的結果,這樣可以充分覆蓋隨機場景,且出錯后穩(wěn)定可復現(xiàn);
2.橫向看,不同的比特(即每條異步走線路徑)隨機的結果不同,例如隨機延遲時,每條路徑的延遲本身就不同,如果隨機結果一致那就沒有意義了;
3.縱向看,單比特走線每次隨機的結果不同,例如這次跳變隨機恢復為正確值,下次隨機恢復為錯誤值;
基于這兩個表格,很容易想到一種比較容易實現(xiàn)的可控隨機方法:$random+$urandom,既然你來都是有YES有NO,那兩個加在一起不就都是YES了么!
多說無益,咱們來做一做實驗看看吧,修改之前實驗的RTL代碼為:
reg [7:0]rand_value, urand_value;
reg [7:0]new_rand_value;
always @*begin
if(power)begin
rand_value = $random;
urand_value = $urandom;
new_rand_value = $random + $urandom;
//$display("----------------------------------------------");
//$display("%m rand_value = 'h%0h", rand_value);
//$display("%m urand_value = 'h%0h", urand_value);
$display("%m new_rand_value = 'h%0h", new_rand_value);
//$display("----------------------------------------------");
end
end仍舊以0/1234/5678三個種子進行三次仿真:tc seed = 0
testbench.u_rand_test1 new_rand_value = 'hbd
testbench.u_rand_test0 new_rand_value = 'h9f
testbench.u_rand_test1 new_rand_value = 'h6f
testbench.u_rand_test0 new_rand_value = 'hf4
testbench.u_rand_test1 new_rand_value = 'hec
testbench.u_rand_test0 new_rand_value = 'h1c
tc seed = 1234
testbench.u_rand_test1 new_rand_value = 'hd8
testbench.u_rand_test0 new_rand_value = 'hba
testbench.u_rand_test1 new_rand_value = 'h7
testbench.u_rand_test0 new_rand_value = 'h8c
testbench.u_rand_test1 new_rand_value = 'h37
testbench.u_rand_test0 new_rand_value = 'h67
tc seed = 5678
testbench.u_rand_test1 new_rand_value = 'h78
testbench.u_rand_test0 new_rand_value = 'h5a
testbench.u_rand_test1 new_rand_value = 'h24
testbench.u_rand_test0 new_rand_value = 'ha9
testbench.u_rand_test1 new_rand_value = 'ha0
testbench.u_rand_test0 new_rand_value = 'hd0通過觀察這個結果不難得出結論,無論從時間維度、例化維度還是仿真種子的維度看,隨機結果都是不同的,初步分析是可以滿足我們的需求。再看看是否可以穩(wěn)定復現(xiàn),重新以seed=1234跑一下仿真看下:tc seed = 1234
testbench.u_rand_test1 new_rand_value = 'hd8
testbench.u_rand_test0 new_rand_value = 'hba
testbench.u_rand_test1 new_rand_value = 'h7
testbench.u_rand_test0 new_rand_value = 'h8c
testbench.u_rand_test1 new_rand_value = 'h37
testbench.u_rand_test0 new_rand_value = 'h67確實可以穩(wěn)定復現(xiàn)隨機的結果。從實驗結果上看,$random+$urandom是能夠滿足我們的需求的。那么進一步對這個方法進行分析,從之前的特性上能夠看出來,我們最常用的$urandom之所以不能滿足需求是因為對于靜態(tài)模塊的不同例化體而言,同一回合的$urandom會隨機出完全一樣結果,可以理解為其不感知靜態(tài)模塊的多個例化實體。而此時以能夠感知靜態(tài)模塊不同例化實體的$random作為補充把這個作為隨機的“地基”引入到$urandom的結果上來,那么就填補了$urandom的“功能缺失”。而$random這個地基恰好又是在每個回合隨機結果也不一樣,缺失是對于不同的seed同樣的模塊中隨機結果一致,這也沒關系,$urandom補充了這個功能上的問題。這樣以$random和$urandom互為補充的方式,滿足了我們構造可控隨機的需求,同樣這兩個函數(shù)的其他組合方式也是可以的,比如$random*$urandom:tc seed = 0
testbench.u_rand_test1 new_rand_value = 'h3c
testbench.u_rand_test0 new_rand_value = 'h34
testbench.u_rand_test1 new_rand_value = 'h7a
testbench.u_rand_test0 new_rand_value = 'he4
testbench.u_rand_test1 new_rand_value = 'h53
testbench.u_rand_test0 new_rand_value = 'h23
tc seed = 1234
testbench.u_rand_test1 new_rand_value = 'hd7
testbench.u_rand_test0 new_rand_value = 'ha5
testbench.u_rand_test1 new_rand_value = 'h32
testbench.u_rand_test0 new_rand_value = 'h94
testbench.u_rand_test1 new_rand_value = 'h22
testbench.u_rand_test0 new_rand_value = 'h2
系列文章入口——
【芯片設計】SoC 101(一):緒論 | 【芯片設計】FIFO漫談(零)從無處不在的FIFO開始說起 | 【芯片設計】計算機體系結構(一)虛擬內存 | 【芯片設計】深入理解AMBA總線(零)緒論
| 【芯片設計】握手協(xié)議的介紹與時序說明 | 【芯片設計】復位那些小事 —— 復位消抖 | 【芯片設計】快速入門數(shù)字芯片設計(一)Introduction | 【芯片驗證】UVM源碼計劃(零)下定決心讀源碼前的自測環(huán)節(jié)
| 【芯片設計】異步電路碎碎念(一) 到底什么是異步電路
| 【芯片設計】從RTL到GDS(一):Introduction
| 其他文章鏈接——
【芯片驗證】sva_assertion: 15道助力飛升的斷言練習 | 【芯片驗證】可能是RTL定向驗證的巔峰之作 | 【芯片驗證】RTL仿真中X態(tài)行為的傳播 —— 從xprop說起 | 【芯片驗證】年輕人的第一個systemVerilog驗證環(huán)境全工程與解析 |
【芯片設計】verilog中有符號數(shù)和無符號數(shù)的本質探究
| 【芯片設計】論RTL中always語法的消失術 | 【芯片設計】代碼即注釋,注釋即代碼 | 【芯片設計】700行代碼的risc處理器你確實不能要求太多了 |
入職芯片開發(fā)部門后,每天摸魚之外的時間我們要做些什么呢 | 如何計算系統(tǒng)的outstanding 和 burst length? | 芯片搬磚日常·逼死強迫癥的關鍵詞不對齊事件 | 熟人社會里,一群沒有社會價值的局外人 |
|