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

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

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

【芯片驗(yàn)證】異步電路碎碎念(十)在靜態(tài)對(duì)象內(nèi)構(gòu)建可控隨機(jī)·方案一

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
匿名  發(fā)表于 2024-10-30 12:16:00 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
上一篇文章中對(duì)兩個(gè)典型的隨機(jī)方法在靜態(tài)對(duì)象中的隨機(jī)特性進(jìn)行了探究:
【芯片驗(yàn)證】異步電路碎碎念(九)靜態(tài)對(duì)象中的隨機(jī)函數(shù)特性探究
在此基礎(chǔ)上這一篇來(lái)討論如何在靜態(tài)對(duì)象內(nèi)構(gòu)建可控的隨機(jī)方法。先把上一篇的結(jié)論拿出來(lái):
1.縱向看,無(wú)論是$random還是$urandom都實(shí)現(xiàn)了隨機(jī)功能,且每次隨機(jī)值不同;
2.橫向看,兩個(gè)例化模塊對(duì)比,$random每次隨機(jī)的結(jié)果不同,而$urandom每次隨機(jī)的結(jié)果相同;
3.以不同的種子進(jìn)行仿真時(shí),同一個(gè)例化模塊,$random的隨機(jī)結(jié)果每次都相同,而$urandom每次的隨機(jī)結(jié)果是不同的;

再把我們的需求明確下:
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ò)誤值;

基于這兩個(gè)表格,很容易想到一種比較容易實(shí)現(xiàn)的可控隨機(jī)方法:$random+$urandom,既然你來(lái)都是有YES有NO,那兩個(gè)加在一起不就都是YES了么!

多說(shuō)無(wú)益,咱們來(lái)做一做實(shí)驗(yàn)看看吧,修改之前實(shí)驗(yàn)的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三個(gè)種子進(jìn)行三次仿真: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通過(guò)觀察這個(gè)結(jié)果不難得出結(jié)論,無(wú)論從時(shí)間維度、例化維度還是仿真種子的維度看,隨機(jī)結(jié)果都是不同的,初步分析是可以滿足我們的需求。再看看是否可以穩(wěn)定復(fù)現(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確實(shí)可以穩(wěn)定復(fù)現(xiàn)隨機(jī)的結(jié)果。從實(shí)驗(yàn)結(jié)果上看,$random+$urandom是能夠滿足我們的需求的。那么進(jìn)一步對(duì)這個(gè)方法進(jìn)行分析,從之前的特性上能夠看出來(lái),我們最常用的$urandom之所以不能滿足需求是因?yàn)閷?duì)于靜態(tài)模塊的不同例化體而言,同一回合的$urandom會(huì)隨機(jī)出完全一樣結(jié)果,可以理解為其不感知靜態(tài)模塊的多個(gè)例化實(shí)體。而此時(shí)以能夠感知靜態(tài)模塊不同例化實(shí)體的$random作為補(bǔ)充把這個(gè)作為隨機(jī)的“地基”引入到$urandom的結(jié)果上來(lái),那么就填補(bǔ)了$urandom的“功能缺失”。而$random這個(gè)地基恰好又是在每個(gè)回合隨機(jī)結(jié)果也不一樣,缺失是對(duì)于不同的seed同樣的模塊中隨機(jī)結(jié)果一致,這也沒(méi)關(guān)系,$urandom補(bǔ)充了這個(gè)功能上的問(wèn)題。這樣以$random和$urandom互為補(bǔ)充的方式,滿足了我們構(gòu)造可控隨機(jī)的需求,同樣這兩個(gè)函數(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

系列文章入口——
【芯片設(shè)計(jì)】SoC 101(一):緒論
【芯片設(shè)計(jì)】FIFO漫談(零)從無(wú)處不在的FIFO開(kāi)始說(shuō)起
【芯片設(shè)計(jì)】計(jì)算機(jī)體系結(jié)構(gòu)(一)虛擬內(nèi)存
【芯片設(shè)計(jì)】深入理解AMBA總線(零)緒論
【芯片設(shè)計(jì)】握手協(xié)議的介紹與時(shí)序說(shuō)明
【芯片設(shè)計(jì)】復(fù)位那些小事 —— 復(fù)位消抖
【芯片設(shè)計(jì)】快速入門(mén)數(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í)不能要求太多了
入職芯片開(kāi)發(fā)部門(mén)后,每天摸魚(yú)之外的時(shí)間我們要做些什么呢
如何計(jì)算系統(tǒng)的outstanding 和 burst length?
芯片搬磚日常·逼死強(qiáng)迫癥的關(guān)鍵詞不對(duì)齊事件
熟人社會(huì)里,一群沒(méi)有社會(huì)價(jià)值的局外人

本帖子中包含更多資源

您需要 登錄 才可以下載或查看,沒(méi)有賬號(hào)?立即注冊(cè)

x
回復(fù)

使用道具

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

本版積分規(guī)則


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