好,在前面鋪墊了八篇文章之后,終于來(lái)到了這個(gè)專欄里最想討論的地方了。
為什么好好地要在探究異步邏輯的專欄中討論起隨機(jī)的事情了呢?因?yàn)橄肓囊涣膶?duì)跨異步模塊的仿真隨機(jī)問(wèn)題。這個(gè)問(wèn)題本身是一個(gè)挺龐大的話題,而我也沒(méi)有太多的經(jīng)驗(yàn)因此主要以探究和談?wù)摓橹。說(shuō)到對(duì)跨異步模塊和邏輯進(jìn)行功能仿真,很多地方都提到了在模塊里引入隨機(jī)延時(shí)的思路,這個(gè)思路沒(méi)有什么問(wèn)題但是引入的隨機(jī)卻很容易讓我們掉坑里。
在驗(yàn)證環(huán)境中我們見(jiàn)得最多的隨機(jī)函數(shù)有兩個(gè):$random和$urandom(臨時(shí)抽查:在環(huán)境中進(jìn)行隨機(jī)時(shí)要用哪個(gè)?為什么?),對(duì)于這兩個(gè)函數(shù)在環(huán)境中的隨機(jī)特性相信大家都是非常熟悉并牢記了用$urandom進(jìn)行隨機(jī)而不要使用$random。但是一旦在靜態(tài)對(duì)象中(環(huán)境是automatic記得吧)比如module、interface中使用這兩個(gè)函數(shù),他們的特性就和在環(huán)境中不一樣了。
實(shí)驗(yàn)環(huán)境搭建為了直觀的總結(jié)特性,我先做了一個(gè)簡(jiǎn)單的模塊,核心代碼就是這樣:
reg [7:0]rand_value, urand_value;
always @*begin
if(power)begin
rand_value = $random;
urand_value = $urandom;
$display("----------------------------------------------");
$display("%m rand_value = 'h%0h", rand_value);
$display("%m urand_value = 'h%0h", urand_value);
$display("----------------------------------------------");
end
endpower是輸入接口,每當(dāng)power跳轉(zhuǎn)為1時(shí)會(huì)分別進(jìn)行一次$random和$urandom的隨機(jī)并將隨機(jī)結(jié)果打印出來(lái)。之后通過(guò)auto_testbench生成環(huán)境,并在環(huán)境中例化了兩個(gè)rand_test模塊:
rand_test
u_rand_test0(.power(power));
rand_test
u_rand_test1(.power(power));而后在testbench驅(qū)動(dòng)power信號(hào),共使能3次:
logic power;
initial begin
wait(sim_start === 1'b1);
`DELAY(10, clk);
power = 1'b1;
`DELAY(1, clk);
power = 1'b0;
`DELAY(10, clk);
power = 1'b1;
`DELAY(1, clk);
power = 1'b0;
`DELAY(10, clk);
power = 1'b1;
`DELAY(1, clk);
power = 1'b0;
sim_finish = 1'b1;
end實(shí)驗(yàn)環(huán)境搭建完成。
實(shí)驗(yàn)現(xiàn)象為展示結(jié)果,分別以seed=0/1234/5678三個(gè)種子進(jìn)行了三次仿真,仿真結(jié)果如下:
這樣看起來(lái)并不是很直觀,那么通過(guò)表格對(duì)三次仿真結(jié)果進(jìn)行匯總:
特性分析先對(duì)單一仿真結(jié)果如seed=4567進(jìn)行分析,將時(shí)間軸稱之為縱向維度,將并行例化軸稱之為橫向維度:
觀察仿真結(jié)果可以發(fā)現(xiàn)如下的特性:
1.縱向看,無(wú)論是$random還是$urandom都實(shí)現(xiàn)了隨機(jī)功能,且每次隨機(jī)值不同;
2.橫向看,兩個(gè)例化模塊對(duì)比,$random每次隨機(jī)的結(jié)果不同,而$urandom每次隨機(jī)的結(jié)果相同;
之后觀察三次仿真結(jié)果,進(jìn)一步得出另外的特性:
3.以不同的種子進(jìn)行仿真時(shí),同一個(gè)例化模塊,$random的隨機(jī)結(jié)果每次都相同,而$urandom每次的隨機(jī)結(jié)果是不同的;
將這三個(gè)結(jié)論匯總在表格上:
而在我們的需求是什么呢?讓我們思考下,假設(shè)我們現(xiàn)在是對(duì)多比特信號(hào)進(jìn)行跨異步的處理,在異步路徑上我們對(duì)每個(gè)比特加入了隨機(jī)延遲(或者在同步器出口亞穩(wěn)態(tài)隨機(jī)恢復(fù)為正確值或錯(cuò)誤值),那么在通過(guò)驗(yàn)證環(huán)境進(jìn)行仿真時(shí),我們必然希望:
1.隨機(jī)數(shù)值是可控且可以復(fù)現(xiàn)的,不同的種子隨機(jī)出不同的結(jié)果,相同的種子隨機(jī)出相同的結(jié)果,這樣可以充分覆蓋隨機(jī)場(chǎng)景,且出錯(cuò)后穩(wěn)定可復(fù)現(xiàn);
2.橫向看,不同的比特(即每條異步走線路徑)隨機(jī)的結(jié)果不同,例如隨機(jī)延遲時(shí),每條路徑的延遲本身就不同,如果隨機(jī)結(jié)果一致那就沒(méi)有意義了;
3.縱向看,單比特走線每次隨機(jī)的結(jié)果不同,例如這次跳變隨機(jī)恢復(fù)為正確值,下次隨機(jī)恢復(fù)為錯(cuò)誤值;
因此最符合我們預(yù)期的特性應(yīng)該是這樣的:
那么顯然,$random和$urandom都是不符合我們的需求的,$urandom_range(min, max)、std:randomize()甚至randcase都和$urandom有相近的性質(zhì),也無(wú)法解決問(wèn)題。
所以在靜態(tài)模塊中怎么構(gòu)造我們需要特性的隨機(jī)方法呢?
系列文章入口——
【芯片設(shè)計(jì)】SoC 101(一):緒論 | 【芯片設(shè)計(jì)】FIFO漫談(零)從無(wú)處不在的FIFO開始說(shuō)起 | 【芯片設(shè)計(jì)】計(jì)算機(jī)體系結(jié)構(gòu)(一)虛擬內(nèi)存 | 【芯片設(shè)計(jì)】深入理解AMBA總線(零)緒論
| 【芯片設(shè)計(jì)】握手協(xié)議的介紹與時(shí)序說(shuō)明 | 【芯片設(shè)計(jì)】復(fù)位那些小事 —— 復(fù)位消抖 | 【芯片設(shè)計(jì)】快速入門數(shù)字芯片設(shè)計(jì)(一)Introduction | 【芯片驗(yàn)證】UVM源碼計(jì)劃(零)下定決心讀源碼前的自測(cè)環(huán)節(jié)
| 【芯片設(shè)計(jì)】異步電路碎碎念(一) 到底什么是異步電路
| 【芯片設(shè)計(jì)】從RTL到GDS(一):Introduction
| 其他文章鏈接——
【芯片驗(yàn)證】sva_assertion: 15道助力飛升的斷言練習(xí) | 【芯片驗(yàn)證】可能是RTL定向驗(yàn)證的巔峰之作 | 【芯片驗(yàn)證】RTL仿真中X態(tài)行為的傳播 —— 從xprop說(shuō)起 | 【芯片驗(yàn)證】年輕人的第一個(gè)systemVerilog驗(yàn)證環(huán)境全工程與解析 |
【芯片設(shè)計(jì)】verilog中有符號(hào)數(shù)和無(wú)符號(hào)數(shù)的本質(zhì)探究
| 【芯片設(shè)計(jì)】論RTL中always語(yǔ)法的消失術(shù) | 【芯片設(shè)計(jì)】代碼即注釋,注釋即代碼 | 【芯片設(shè)計(jì)】700行代碼的risc處理器你確實(shí)不能要求太多了 |
入職芯片開發(fā)部門后,每天摸魚之外的時(shí)間我們要做些什么呢 | 如何計(jì)算系統(tǒng)的outstanding 和 burst length? | 芯片搬磚日!け扑缽(qiáng)迫癥的關(guān)鍵詞不對(duì)齊事件 | 熟人社會(huì)里,一群沒(méi)有社會(huì)價(jià)值的局外人 |
|