timeprecision和timescale混合使用听谁的
在SystemVerilog和Verilog进行设计验证时,为了使仿真器对代码中的时序行为进行准确的仿真模拟,需要对时间信息指定对应的时间单位(time unit)和时间精度(time precision)。常用的指定时间单位和时间精度的方式有:预编译命令`timescale和timeunit/timeprecision两种方式,关于这两种使用方式的具体使用方法和注意事项可以参考之前的《Verilog系列:【14】timescale去哪儿了》和《验证语言系列:【76】timeunit和timeprecision设置时间单位和精度》。但是两篇没有说明两种使用方式同时使用时会出现什么情况,本文将对这种混合使用的方式进行示例说明。
上实操例子!
【示例】
【仿真结果】
通过仿真我们可以看到,在module top_tb之前虽然使用了“`timescale 10ns/1ps”指定了磨人的时间单位和时间精度,但是实际在module top_tb中两个过程块(initial)使用的是top_tb开始之后timeunit和timeprecision指定的时间精度和时间单位,虽然test在top_tb中例化,但是test中指定延时使用的时间单位和精度都是“`timescale 10ns/1ps”指定的默认值,而不是top_tb中timeunit和timeprecision指定的时间精度和时间单位,可见timeunit和timeprecision的作用范围仅限于其声明的当前模块内,并且不具有穿越层次传递的特性。同时,通过这个示例我们也可以看出,“`timescale”作用于其当前编译空间中编译时位于其后的设计代码的默认时间单位和时间精度,而timeunit和timeprecision则用于具体的模块内部,并且具有比“`timescale”更高的优先级。同时需要注意,在IEEE1800中,规定timeunit和timeprecision必须先于当其时间空间所有元素定义,也就是其必须出现在module、program的最开始的位置,但是实际使用过程中,不同的仿真器对于这一点的处理是不一样的,比如VCSMX-2015是允许其出现在任何位置,例如top_tb中两个initial块之间,但是这样的使用方式在QuestaSim中是不支持的,为此,安全起见,还是严格按照IEEE要求,将其放在最开始的位置,这样所有的仿真器处理结果会是一致的。同时,在具体的使用过程中,最好不要同时使用两种方式制定时间单位和时间精度,避免导致实际结果与想当然不同。