電子產(chǎn)業(yè)一站式賦能平臺

PCB聯(lián)盟網(wǎng)

搜索
查看: 98|回復(fù): 0
收起左側(cè)

【芯片驗證】異步電路碎碎念(九)靜態(tài)對象中的隨機函數(shù)特性探究

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
匿名  發(fā)表于 2024-10-23 12:04:00 回帖獎勵 |倒序瀏覽 |閱讀模式
好,在前面鋪墊了八篇文章之后,終于來到了這個專欄里最想討論的地方了。
為什么好好地要在探究異步邏輯的專欄中討論起隨機的事情了呢?因為想聊一聊對跨異步模塊的仿真隨機問題。這個問題本身是一個挺龐大的話題,而我也沒有太多的經(jīng)驗因此主要以探究和談?wù)摓橹。說到對跨異步模塊和邏輯進行功能仿真,很多地方都提到了在模塊里引入隨機延時的思路,這個思路沒有什么問題但是引入的隨機卻很容易讓我們掉坑里。
在驗證環(huán)境中我們見得最多的隨機函數(shù)有兩個:$random和$urandom(臨時抽查:在環(huán)境中進行隨機時要用哪個?為什么?),對于這兩個函數(shù)在環(huán)境中的隨機特性相信大家都是非常熟悉并牢記了用$urandom進行隨機而不要使用$random。但是一旦在靜態(tài)對象中(環(huán)境是automatic記得吧)比如module、interface中使用這兩個函數(shù),他們的特性就和在環(huán)境中不一樣了。
實驗環(huán)境搭建為了直觀的總結(jié)特性,我先做了一個簡單的模塊,核心代碼就是這樣:
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時會分別進行一次$random和$urandom的隨機并將隨機結(jié)果打印出來。之后通過auto_testbench生成環(huán)境,并在環(huán)境中例化了兩個rand_test模塊:
rand_test
u_rand_test0(.power(power));
rand_test
u_rand_test1(.power(power));而后在testbench驅(qū)動power信號,共使能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實驗環(huán)境搭建完成。
實驗現(xiàn)象為展示結(jié)果,分別以seed=0/1234/5678三個種子進行了三次仿真,仿真結(jié)果如下:



這樣看起來并不是很直觀,那么通過表格對三次仿真結(jié)果進行匯總:





特性分析先對單一仿真結(jié)果如seed=4567進行分析,將時間軸稱之為縱向維度,將并行例化軸稱之為橫向維度:

觀察仿真結(jié)果可以發(fā)現(xiàn)如下的特性:
1.縱向看,無論是$random還是$urandom都實現(xiàn)了隨機功能,且每次隨機值不同;
2.橫向看,兩個例化模塊對比,$random每次隨機的結(jié)果不同,而$urandom每次隨機的結(jié)果相同;
之后觀察三次仿真結(jié)果,進一步得出另外的特性:
3.以不同的種子進行仿真時,同一個例化模塊,$random的隨機結(jié)果每次都相同,而$urandom每次的隨機結(jié)果是不同的;
將這三個結(jié)論匯總在表格上:

而在我們的需求是什么呢?讓我們思考下,假設(shè)我們現(xiàn)在是對多比特信號進行跨異步的處理,在異步路徑上我們對每個比特加入了隨機延遲(或者在同步器出口亞穩(wěn)態(tài)隨機恢復(fù)為正確值或錯誤值),那么在通過驗證環(huán)境進行仿真時,我們必然希望:
1.隨機數(shù)值是可控且可以復(fù)現(xiàn)的,不同的種子隨機出不同的結(jié)果,相同的種子隨機出相同的結(jié)果,這樣可以充分覆蓋隨機場景,且出錯后穩(wěn)定可復(fù)現(xiàn);
2.橫向看,不同的比特(即每條異步走線路徑)隨機的結(jié)果不同,例如隨機延遲時,每條路徑的延遲本身就不同,如果隨機結(jié)果一致那就沒有意義了;
3.縱向看,單比特走線每次隨機的結(jié)果不同,例如這次跳變隨機恢復(fù)為正確值,下次隨機恢復(fù)為錯誤值;
因此最符合我們預(yù)期的特性應(yīng)該是這樣的:

那么顯然,$random和$urandom都是不符合我們的需求的,$urandom_range(min, max)、std:randomize()甚至randcase都和$urandom有相近的性質(zhì),也無法解決問題。
所以在靜態(tài)模塊中怎么構(gòu)造我們需要特性的隨機方法呢?

系列文章入口——
【芯片設(shè)計】SoC 101(一):緒論
【芯片設(shè)計】FIFO漫談(零)從無處不在的FIFO開始說起
【芯片設(shè)計】計算機體系結(jié)構(gòu)(一)虛擬內(nèi)存
【芯片設(shè)計】深入理解AMBA總線(零)緒論
【芯片設(shè)計】握手協(xié)議的介紹與時序說明
【芯片設(shè)計】復(fù)位那些小事 —— 復(fù)位消抖
【芯片設(shè)計】快速入門數(shù)字芯片設(shè)計(一)Introduction
【芯片驗證】UVM源碼計劃(零)下定決心讀源碼前的自測環(huán)節(jié)
【芯片設(shè)計】異步電路碎碎念(一) 到底什么是異步電路
【芯片設(shè)計】從RTL到GDS(一):Introduction
其他文章鏈接——
【芯片驗證】sva_assertion: 15道助力飛升的斷言練習(xí)
【芯片驗證】可能是RTL定向驗證的巔峰之作
【芯片驗證】RTL仿真中X態(tài)行為的傳播 —— 從xprop說起
【芯片驗證】年輕人的第一個systemVerilog驗證環(huán)境全工程與解析
【芯片設(shè)計】verilog中有符號數(shù)和無符號數(shù)的本質(zhì)探究
【芯片設(shè)計】論RTL中always語法的消失術(shù)
【芯片設(shè)計】代碼即注釋,注釋即代碼
【芯片設(shè)計】700行代碼的risc處理器你確實不能要求太多了
入職芯片開發(fā)部門后,每天摸魚之外的時間我們要做些什么呢
如何計算系統(tǒng)的outstanding 和 burst length?
芯片搬磚日!け扑缽娖劝Y的關(guān)鍵詞不對齊事件
熟人社會里,一群沒有社會價值的局外人

本帖子中包含更多資源

您需要 登錄 才可以下載或查看,沒有賬號?立即注冊

x
回復(fù)

使用道具

發(fā)表回復(fù)

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則


聯(lián)系客服 關(guān)注微信 下載APP 返回頂部 返回列表