在SystemVerilog中,輸出信息顯示時(shí)間時(shí),經(jīng)常會(huì)在輸出信息格式中指定“%t”格式符,一般情況下“%t”輸出的格式都是固定的,但是這樣固定的輸出顯示的時(shí)間可能有時(shí)會(huì)讓用戶看起來感覺比較詫異,例如下面的示例。
【示例】
【仿真結(jié)果】
示例中,設(shè)置的timescale是“10ns/1ps”,在$monitor中將$realtime返回的時(shí)間通過格式符“%t”輸出,但是此時(shí)顯示的時(shí)間數(shù)值很大,并且沒有單位,這可能會(huì)讓用戶不知所措,例如在sig為“11”時(shí),此時(shí)顯示的時(shí)間為12343,但是這個(gè)數(shù)字的單位是什么,$relatime本身返回的值并不是這里的12343,示例中顯示的結(jié)果為什么與$realtime返回值不同呢,這是為什么呢?其實(shí)這主要是因?yàn)椤?t”的輸出格式受了任務(wù)$timeformat(注意是任務(wù)不是函數(shù)與!)的影響,雖然這里沒有顯式的調(diào)用$timeformat,但是其默認(rèn)值還是會(huì)影響到“%t”顯示的時(shí)間值,即“%t”默認(rèn)顯示的時(shí)間是按照當(dāng)前module的timescale設(shè)置的精度作為單位的,并且默認(rèn)情況下顯式的時(shí)間后是沒有時(shí)間單位字符串的,所以此時(shí)就可以理解為什么“%t”在sig為“11”時(shí)顯示的時(shí)間是12343了,這是因?yàn)檫@個(gè)此時(shí)顯示的數(shù)字的單位是1ps。其實(shí)在SystemVerilog中,通過$timeformat可以約束“%t”顯示的時(shí)間格式,其中具體參數(shù)對應(yīng)關(guān)系如下圖。
其中units_number 是 0 到-15 之間的整數(shù)值,表示打印的時(shí)間值如下表:
Unit Number | Time Unit | Unit Number | Time Unit |
0 | 1 s | -8 | 10 ns |
-1 | 100 ms | -9 | 1 ns |
-2 | 10 ms | -10 | 100 ps |
-3 | 1 ms | -11 | 10 ps |
-4 | 100 us | -12 | 1 ps |
-5 | 10 us | -13 | 100 fs |
-6 | 1 us | -14 | 10 fs |
-7 | 100 ns | -15 | 1 fs |
precision_number 是在打印時(shí)間值時(shí),小數(shù)點(diǎn)后保留的位數(shù),其默認(rèn)值為0。
suffix_string 是在時(shí)間值后面打印的后綴字符串,其默認(rèn)值為空字符串。
MinFieldWidth 是時(shí)間值字符串與后綴字符串合起來的這部分字符串的最小長度,若這部分字符串不足這個(gè)長度,則在這部分字符串左側(cè)補(bǔ)空格,直到總長度達(dá)到設(shè)置的值,如果總字符串比設(shè)置的值大,將按照字符串實(shí)際長度輸出,其默認(rèn)值為20。
下面我們通過一個(gè)示例進(jìn)一步理解下$timeformat是如何使用的。
【示例】
【仿真結(jié)果】
示例中,通過$timeformat指定了“%t”輸出時(shí)間的格式,“-9”表示要顯示的時(shí)間是按照“1ns”為單位得到的,“3”表示顯示的時(shí)間中小數(shù)部分的位數(shù),“HaHaHa”為時(shí)間字符串之后的后綴字符串,這個(gè)字符串一般指定為時(shí)間的單位,最后一個(gè)參數(shù)“2”表示“%t”顯示的整個(gè)字符串長度的最小值,因?yàn)榇藭r(shí)的時(shí)間字符串和后綴字符串的長度大于設(shè)置的最小值,所以此時(shí)按照實(shí)際字符串長度顯示,當(dāng)然也可以把這個(gè)字符串最小長度的值設(shè)置的大于實(shí)際字符串長度,如下例。
【示例】
【仿真結(jié)果】
示例中,通過$timeformat設(shè)置了顯示時(shí)間字符串的最小長度為13,仿真結(jié)果可以看出,實(shí)際字符串的長度沒有13個(gè)字符串那么長,所以此時(shí)字符串按照左對齊,并在字符串左側(cè)補(bǔ)空格直到字符船總長度達(dá)到$timeformat設(shè)置的字符串的最小長度要求為止。另一方面,$timeformat設(shè)置了顯示時(shí)間保留小數(shù)點(diǎn)后的位數(shù)為2,所以時(shí)間顯示的最終結(jié)果保留了2位小數(shù),同時(shí)需要注意,此處進(jìn)行兩位小數(shù)保留時(shí)會(huì)進(jìn)行四舍五入操作。
通過上述幾個(gè)示例,如果我們期望“%t”顯示的時(shí)間值與當(dāng)前仿真時(shí)間一致,那么需要給$timeformat設(shè)置對應(yīng)合適的參數(shù)或者在輸出時(shí)間時(shí)在格式字符串中不要指定“%t”,而是直接將其位置空留出來,這樣輸出的數(shù)據(jù)將完全取決于用戶使用的時(shí)間函數(shù)
最后,在一個(gè)模塊中可以設(shè)置多個(gè)$timeformat,一個(gè)$timeformat生效后會(huì)持續(xù)到下一個(gè)$timeformat,如下例。
【示例】
【仿真結(jié)果】
示例中,通過仿真結(jié)果可以看到第7行設(shè)置的$timeformat僅影響到了第8行“%t”的顯示,并沒有影響到第12行“%t”的顯示,第7行設(shè)置的$timeformat在遇到第11行設(shè)置的$timeformat之后就退出了歷史舞臺,所以第12行“%t”顯示的格式按照第11行設(shè)置的$timeformat顯示了。
審核編輯:劉清
-
仿真器
+關(guān)注
關(guān)注
14文章
1018瀏覽量
83795 -
字符串
+關(guān)注
關(guān)注
1文章
579瀏覽量
20549 -
Verilog語言
+關(guān)注
關(guān)注
0文章
113瀏覽量
8273
原文標(biāo)題:SystemVerilog中的$timeformat是干啥的
文章出處:【微信號:處芯積律,微信公眾號:處芯積律】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論