SystemVerilog中的time、stime、realtime的一些事兒
掃描二維碼
隨時(shí)隨地手機(jī)看文章
在搭建驗(yàn)證環(huán)境時(shí),經(jīng)常需要在環(huán)境中插入很多info用于輸出一定的log信息用于進(jìn)行debug,在插入這些info方法的時(shí)候,經(jīng)常需要同時(shí)輸出該方法執(zhí)行的具體時(shí)間,用于方便定位問(wèn)題,為此在Verilog和SystemVerilog中提供了一堆關(guān)于time的方法,如果對(duì)于這些方法使用的不是很恰當(dāng),可能顯示出來(lái)的結(jié)果與期望有些許差異,本文將通過(guò)示例,說(shuō)明這一對(duì)time的方法是如何做的妖。
1 $time
當(dāng)$time被調(diào)用時(shí),將會(huì)返回一個(gè)64位的整型變量,用于表示該系統(tǒng)函數(shù)調(diào)用時(shí)的仿真時(shí)刻,返回的這個(gè)值是按照以下步驟得到:
(1)當(dāng)前延遲值依據(jù)模塊設(shè)置的timescale時(shí)間單位和精度得到實(shí)際仿真時(shí)間;
(2)調(diào)用該函數(shù)返回的值為上一步得到的時(shí)間按照timescale設(shè)置的時(shí)間單位縮小表示后四舍五入得到的整型值;
【示例】?

【仿真結(jié)果】?

示例中,時(shí)間變化主要包括仿真器波形顯示時(shí)間和$time調(diào)用返回顯示的時(shí)間,這兩個(gè)時(shí)間的變化過(guò)程如下:
sig從“00”變成“11”發(fā)生在12ns,該時(shí)間由當(dāng)前模塊的時(shí)間單位和時(shí)間精度決定,即(1.234267*10≈12),$time返回的時(shí)間是12ns按照設(shè)置的時(shí)間單位縮小至1.2后四舍五入取整得到的,所以此時(shí)log顯示時(shí)間為1;
sig從“11”變成“01”發(fā)生在24ns,該時(shí)間由當(dāng)前模塊的時(shí)間單位和時(shí)間精度決定,即(第一次延遲值1.234267*10≈12,當(dāng)前延遲值1.225232*10≈12,12+12=24),$time返回的時(shí)間是24ns按照設(shè)置的時(shí)間單位縮小至2.4后四舍五入取整得到的,所以此時(shí)log顯示時(shí)間為2;
sig從“01”變成“10”發(fā)生在36ns,該時(shí)間由當(dāng)前模塊的時(shí)間單位和時(shí)間精度決定,即(第一次延遲值1.234267*10≈12,第二次延遲值1.225232*10≈12,當(dāng)前延遲值1.245678*10≈12,12+12+12=36),$time返回的時(shí)間是36ns按照設(shè)置的時(shí)間單位縮小至3.6后四舍五入取整得到的,所以此時(shí)log顯示時(shí)間為4;
為了進(jìn)一步理解時(shí)間的變化,我們將示例中使用的時(shí)間單位和時(shí)間精度“10ns/1ns”修改為“10ns/1ps”來(lái)看下仿真時(shí)間和$time顯示的時(shí)間之間的關(guān)系。
【示例】?

【仿真結(jié)果】?

通過(guò)仿真結(jié)果可以看到,因?yàn)闀r(shí)間精度的修改,此時(shí)的仿真時(shí)間分別變?yōu)榱耍?/span>12.343ns、24.595ns和37.052ns,但是$time調(diào)用顯示的時(shí)間還是1、2和4??梢姺抡鏁r(shí)間是受當(dāng)前module的時(shí)間單位和時(shí)間精度的影響,sig第一次變化時(shí)$time返回值為1.234267*10≈12.343ns按照設(shè)置的時(shí)間單位級(jí)縮小至1.2343后四舍五入取整得到,所以此時(shí)log顯示1,sig第二次變化時(shí)$time返回值為當(dāng)前延遲值(1.225232*10≈12.252ns)與第一次延遲值(12.343ns)之和24.595ns按照設(shè)置的時(shí)間單位級(jí)縮小至2.4595后四舍五入取整得到,所以此時(shí)log顯示時(shí)間為2,sig第三次變化時(shí)返回值為當(dāng)前延遲值(1.245678*10≈12.457ns)與前兩次延遲值(12.343+12.252)之和37.052ns按照設(shè)置的時(shí)間單位級(jí)縮小至3.7052后四舍五入取整得到,所以log顯示為4。仿真結(jié)果匯總?cè)缦卤怼?/span>
選項(xiàng) | sig值 | 2’b11 | 2’b01 | 2’b10 | Timescale | |
代碼延遲 | 1.234267 | 1.225232 | 1.245678 | 10ns/1ns | 10ns/1ps | |
$time | Log顯示 | 1 | 2 | 4 | 10ns | - |
仿真顯示 | 12 | 24 | 36 | 1ns | - | |
Log顯示 | 1 | 2 | 4 | - | 10ns | |
仿真顯示 | 12.343 | 24.595 | 37.052 | - | 1ps | |
2 $stime
當(dāng)$stime被調(diào)用時(shí),將會(huì)返回一個(gè)32位的無(wú)符號(hào)整型變量,用于表示該系統(tǒng)函數(shù)調(diào)用時(shí)的仿真時(shí)刻,返回的這個(gè)值會(huì)按照當(dāng)前模塊設(shè)置的時(shí)間單位,對(duì)調(diào)用時(shí)刻值進(jìn)行四舍五入后顯示具體時(shí)間,其用法與$time類似,只是$stime返回32位整型變量,所以其調(diào)用時(shí)表示的時(shí)間范圍相較$time小,示例與$time相同,此處不再贅述。
3 $realtime
當(dāng)$realtime被調(diào)用時(shí),將會(huì)返回一個(gè)real型變量,所以其表示出來(lái)的形式一般為小數(shù)形式,用于表示該系統(tǒng)函數(shù)調(diào)用時(shí)的仿真時(shí)刻,時(shí)間單位為當(dāng)前模塊設(shè)置的時(shí)間單位。
【示例】?

【仿真結(jié)果】?

示例中,時(shí)間變化主要包括仿真器波形顯示時(shí)間和$realtime調(diào)用顯示的時(shí)間,這兩個(gè)時(shí)間在之間的關(guān)系以及變化過(guò)程如下:
sig從“00”變成“11”發(fā)生在12ns,該時(shí)間由當(dāng)前模塊的時(shí)間單位和時(shí)間精度決定,即(1.234267*10≈12),$realtime返回的時(shí)間是12ns按照設(shè)置的時(shí)間單位縮小至1.2后得到,所以此時(shí)log顯示時(shí)間為1.2;
sig從“11”變成“01”發(fā)生在24ns,該時(shí)間由當(dāng)前模塊的時(shí)間單位和時(shí)間精度決定,即(第一次延遲值1.234267*10≈12,當(dāng)前延遲值1.225232*10≈12,12+12=24),$realtime返回的時(shí)間是24ns按照設(shè)置的時(shí)間單位縮小至2.4后得到,所以此時(shí)log顯示時(shí)間為2.4;
sig從“01”變成“10”發(fā)生在36ns,該時(shí)間由當(dāng)前模塊的時(shí)間單位和時(shí)間精度決定,即(第一次延遲值1.234267*10≈12,第二次延遲值1.225232*10≈12,當(dāng)前延遲值1.245678*10≈12,12+12+12=36),$realtime返回的時(shí)間是36ns按照設(shè)置的時(shí)間單位縮小至3.6后得到,所以此時(shí)log顯示時(shí)間為3.6;
為了進(jìn)一步理解時(shí)間的變化,我們將示例中使用的時(shí)間單位和時(shí)間精度“10ns/1ns”修改為“10ns/本文示例1ps”來(lái)看下仿真時(shí)間和$realtime顯示的時(shí)間之間的關(guān)系。
【示例】?

【仿真結(jié)果】?

通過(guò)仿真結(jié)果可以看到,因?yàn)闀r(shí)間精度的修改,此時(shí)的仿真時(shí)間分別變?yōu)榱耍?/span>12.343ns、24.595ns和37.052ns,但是$realtime調(diào)用顯示的時(shí)間還是1.2343、2.4595和3.7052。可見仿真時(shí)間是受當(dāng)前module的時(shí)間單位和時(shí)間精度的影響,sig第一次變化時(shí)$realtime返回值為(1.234267*10≈12.343ns)12.343ns按照設(shè)置的時(shí)間單位級(jí)縮小至1.2343后得到,所以log顯示為1.2343。sig第二次變化時(shí)$realtime返回值為當(dāng)前延遲值(1.225232*10≈12.252ns)與第一次延遲值(12.343ns)之和24.595ns按照設(shè)置的時(shí)間單位級(jí)縮小至2.4595后得到,所以log顯示為2.4595,sig第三次變化時(shí)返回值為當(dāng)前延遲值(1.245678*10≈12.457ns)與前兩次延遲值(12.343+12.252)之和37.052ns按照設(shè)置的時(shí)間單位級(jí)縮小至3.7052后得到,所以log顯示為3.7052。仿真結(jié)果匯總?cè)缦卤怼?/span>
選項(xiàng) | sig值 | 2’b11 | 2’b01 | 2’b10 | Timescale | |
代碼延遲 | 1.234267 | 1.225232 | 1.245678 | 10ns/1ns | 10ns/1ps | |
$time | Log顯示 | 1.2 | 2.4 | 3.6 | 10ns | - |
仿真顯示 | 12 | 24 | 36 | 1ns | - | |
Log顯示 | 1.2343 | 2.4595 | 3.7052 | - | 10ns | |
仿真顯示 | 12.343 | 24.595 | 37.052 | - | 1ps | |
通過(guò)仿真結(jié)果可以看到,仿真時(shí)間是按照當(dāng)前module設(shè)置的時(shí)間單位和時(shí)間精度進(jìn)行顯示,而$realtime函數(shù)顯示的時(shí)間為仿真時(shí)間按照時(shí)間單位數(shù)量級(jí)縮小后得到的。
通過(guò)上述示例可以看到,在進(jìn)行仿真時(shí),當(dāng)出現(xiàn)log顯示時(shí)間與波形不一致時(shí),要注意產(chǎn)生log信息使用的關(guān)于time的函數(shù)是什么,同時(shí)也要注意當(dāng)前模塊設(shè)置的時(shí)間單位和精度,如果為了得到與仿真波形時(shí)間吻合的時(shí)間,可以使用$realtime。





