简介
在verilog里反引号开始的语句都是编译指令,编译指令是用于指示编译器如何综合我们的程序,它不会被综合到硬件里,只是起到指示作用,timescale
是用于仿真的编译指令,它只能用于testbench
,也就是tb
文件,它的主要作用是定义仿真环境中的时间精度。
单位
它有两个时间刻度单位分别是time_unit
和time_precision
。
time_unit
时间单位,任何与时间相关的语句都会使用该精度
,例如时间延迟语句#1
, unit定义为1ns
,那么#1
就代表1ns
,如果定义为1ps
,那么#1就代表1ps
,如果定义为100ns
,那么#1就代表100ns
time_precision
精度控制,用于控制仿真的时间精度
,也就是最小时间精度
,可以理解为最小步长
,时间刻度
。
下面举个例子:
unit是1ns
, precision也是1ns
,那么时序语句#1.23
,由于精度是1ns
,所以1.23ns
会被精度转换为2ns
,precision
可以理解为时间单位的颗粒度
,如果它是ps也就意味着可以精确到皮秒
,一句话概括就是precision
定义的是unit的精度
。
precision
的单位不能大于
unit (可以等于),因为它主要是定义unit精度
如果它的单位大于unit就不正确了,因为精度不能大于原时间单位
,否则就无法表示精度,仿真综合也会失败。
可以用钟表来进行简单比喻,例如钟表的单位是时,精度到分,那么在钟表上可以看到几小时几分,如果是秒的话那么可以看到几小时几分几秒,也就是时间刻度
。
Tips
一般情况下verilog限制precision是unit的1的10幂次
。
示例
100ns延迟
`timescale 1ns / 1ns
#100
12.70ns延迟
`timescale 1ns / 1ps
#12.70
12.50ns延迟
这里的精度被设置为了500ps
,而500ps是0.5ns,所以步长精度最小是0.5ns,由于写成了12.70,这里步长为0.70ns,比0.50ns多了20ns,那么会按这20ns取整,而20ns不满足四舍五入条件,它不站50ns的一半,所以会被忽略掉,这里的12.70会被取舍为12.50ns
`timescale 1ns / 500ps
#12.70
取舍计算方法
可以使用下面的公式来计算你的延迟是不是会被取舍:
以12.70ns为例,首先将12.70转换为精度单位12.70ns=12700ps
,例如精度是500ps:
12700/500=25.4
,不是整数也就意味着精度无法表示就会被取舍,但如果是5ps的话12700/5=2540,整数可以表示,也就意味着不会被取舍
精度计算方法
与取舍类似,先将单位转换为对应精度单位,以为例1ns / 1ps
:
1ns转换为ps是1000ps
在用单位除去精度:
1000ps / 1ps = 1000ps
在计算1的倒数得到时间刻度:
1 / 1000ps = 0.001
由此可以得出最小步长可以为0.001,只要在精确到小数点后三位的任意时间单位都可以被表示。
注意事项
precision
也关系到仿真的时间颗粒度,precision不是精度越高越好,与你的电路时序有关,例如在仿真I2C、UART
这类低速总线一般可以设置大一点,因为这类低速总线不需要那么高的精度,精度越高意味着仿真时间越久
,颗粒越细仿真软件会进行多次迭代
,例如单位是1ns,精度是1ps,也就意味着1ns里要进行1000
次仿真采样。
这里的采样次数可以用取舍的计算公式计算,采样次数越多代表仿真迭代次数越多,但是可以查看的时间刻度越细,但是仿真时间会越高,所以精度与仿真时间成正比
。