前言
副標(biāo)題 —— 驗(yàn)證環(huán)境中bus.mon.sig與@bus.mon同時(shí)使用的反面案例哈哈哈。這個(gè)bug是在是過(guò)于經(jīng)典了所以每過(guò)一段時(shí)間我就會(huì)拿出來(lái)跟人聊聊,要是沒(méi)有這個(gè)的激勵(lì),我一定不會(huì)走上記錄bug的道路的。
事故現(xiàn)場(chǎng)
先來(lái)還原出錯(cuò)的場(chǎng)景。代碼示意如下,驗(yàn)證環(huán)境構(gòu)建于module中,這段代碼的本意是希望對(duì)齊rtl的時(shí)鐘沿,因此在wait到bus.mon.vld(bus是interface,mon是clocking block)后@時(shí)鐘,之后從隊(duì)列中取數(shù)進(jìn)行處理,下面的代碼我將取數(shù)調(diào)整成打印信息,本質(zhì)都是執(zhí)行一個(gè)操作:
initial begin
forever begin
wait (bus.mon.vld == 1'b1);
@bus.mon;
$display("%t, pop_front this cyc", $realtime);
end
end
此時(shí)RTL的波形如下,vld信號(hào)置起一拍:
當(dāng)時(shí)出現(xiàn)的錯(cuò)誤是,發(fā)現(xiàn)只有一拍的valid信號(hào),但是卻發(fā)生了兩次取值行為,且發(fā)生在兩拍,那么對(duì)應(yīng)打印行為就是說(shuō)發(fā)生了兩次打印且在不同時(shí)刻:
2010.000ns, pop_front this cyc
2020.000ns, pop_front this cyc
為了進(jìn)一步確定行為,在wait和@之后分別加入打印:
initial begin
forever begin
wait (bus.mon.vld == 1'b1);
$display("%t, wait dao le!", $realtime);
@bus.mon;
$display("%t, pop_front this cyc", $realtime);
end
end
打印結(jié)果為:
2010.000ns, wait dao le!
2010.000ns, pop_front this cyc
2010.000ns, wait dao le!
2020.000ns, pop_front this cyc
可以確定在2010ns時(shí)刻wait生效了2次,事故現(xiàn)場(chǎng)還原結(jié)束。
事故分析
明確下,這個(gè)現(xiàn)象是不符合代碼本意的,本意應(yīng)該是一拍有效取一個(gè)數(shù)據(jù)出來(lái),那么接下來(lái)具體分析下為什么是這種現(xiàn)象,由本靈魂畫(huà)手把波形畫(huà)一下!
順便在把time slot的圖搬出來(lái)對(duì)著看,因?yàn)榄h(huán)境搭建并啟動(dòng)于于module中,只需要module regions的就夠了:
那么在2010ns時(shí)間點(diǎn),進(jìn)程上在做哪些事呢?
1.2010ns ts之前的1ps(interface中設(shè)置的skew)采樣rtl vld信號(hào)為1,在active-observed之間bus.mon.vld值跳變?yōu)?;
2.時(shí)鐘bus.mon在observed域跳變?yōu)?;對(duì)應(yīng)的時(shí)序結(jié)構(gòu)如下圖,那么也就不難發(fā)現(xiàn)為什么wait會(huì)判定成功2次了:
時(shí)間線(xiàn)也就理清楚了:
*2010ns, bus.mon.vld跳變?yōu)? -->
*wait(bus.mon.vld)在observed之前生效 -->
*@bus.mon成功(observed域)-->
*執(zhí)行環(huán)境語(yǔ)句,不消耗時(shí)間,forever回wait語(yǔ)句 -->
*wait(bus.mon.vld)再次成功,此時(shí)仍為2010ns -->
*@bus.mon不成功(關(guān)于@和wait的區(qū)別請(qǐng)查詢(xún)綠皮書(shū)吧),該進(jìn)程等待在這里,等下一次bus.mon上升沿-->
- 時(shí)間推進(jìn)到2020ns,@bus.mon成功,再一次執(zhí)行下面的語(yǔ)句。
責(zé)任劃分
該波形是符合systemVerilog仿真規(guī)則的,但是不符合本人意圖,最好就別這么搞。乖乖的@bus.mon (if bus,mon.vld) 是最安全的。
-
RTL
+關(guān)注
關(guān)注
1文章
385瀏覽量
59837 -
VLD
+關(guān)注
關(guān)注
0文章
2瀏覽量
7186
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論