新浪博客

SystemVerilog仿真时间单位-`timescale+$timformat

2020-11-13 21:28阅读:
使用SystemVerilog搭建的Testbench,仿真过程离不开仿真时间单位,使用'`timescale 单位/精度'可以指定本次仿真过程的仿真时间单位/精度。
如下面的例子,在testbench.sv中定义”`timescale 10ns/1ps“,就是向仿真器说明,本次仿真的​时间单位是10ns,精度是1ps。所以,line7的”#5“;实际指的就是delay 50ns;精度的最大用处,会被当成%t打印时默认的单位,所以我们看到line8用%t打印出来是50000ps。
timescale可以在多个位置指定,如compile options,任何一个文件中。优先级是后者生效,即后面的会覆盖前面的。如例子中,compile options中指定单位是1ns,由于testbench.sv中又重新指定,所以,compile options的1ns会被覆盖。也可以在多个文件中定义timescale,如先后include的两个文件,分别是module_A.v和module_B.v中都定义timescale,则module_A.v会使用自己定义的timescale,module_B.v由于会用自己的timescale覆盖前面timescale,所以,两个module都会用各自的timescale。
SystemVerilog仿真时间单位-`timescale+$timformat例1
另一个与仿真时间关系密切的是$timeformat,
它是Systemverilog定义的内部函数。功能如名字,只是会影响时间打印的格式(如:%t),并不影响时间单位和精度。
$timeformat(Units, Precision, Suffix, MinFieldWidth );
Units: 指打印的时间的单位,即10Units秒,取值范围是 0 -15 之间的整数值,0表示100秒(即:1秒), -1表示10-1秒(即:0.1秒), -2表示10-2秒(即:0.01秒)-3表示10-3秒(即:毫秒),-15表示10-15秒(即:飞秒)。默认值是timescale指定的仿真精度。
Precision: 指在小数点后面要打印的小数位数。默认值为0
Suffix:是在时间值后面打印的一个字符串,可以是任意字符串。默认值为空字符串。
MinFieldWidth: 指打印的最小数量字符,包括前面的空格。如果要求更多字符,那么打印的字符更多。默认值是20 个字符。
​例1中加入$timeformat(line10)后,同样是%t则以ns和格式输出了,delay两个5*10ns后,也就是10ns,可以看出$timeformat只会让打印好看一点,对单位/精度并没有影响。
如果在同一个环境中有多次定义`timescale,如果你某一个文件没有定义,则其仿真时间单位无法预期,这样看来,所有文件均需要定义timescale,势必有点繁琐,有没有简单的方法呢?
如下的例2,在compile options中加入-override_timescale=1ns/10ps的option,它会override所有timescale的定义,可以起到全局控制的效果。​
SystemVerilog仿真时间单位-`timescale+$timformat例2
避坑指南:
1)compile option中加入-override_timescale=1ns/10ps,​避免到处timescale更改你的时间精度。
2)​使用$timeformat(-9, 2, ”ns“, 10),让你的时间打印更直观。

我的更多文章

下载客户端阅读体验更佳

APP专享