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

【仿真結(jié)果】?

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

【仿真結(jié)果】?

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

【仿真結(jié)果】?

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

【仿真結(jié)果】?

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





