'timescale是Verilog HDL中的一种时间尺度预编译指令,它用来定义模块仿真时的时间单位和时间精度。
格式如下
'timescale 仿真时间单位/时间精度
注意:用于说名仿真时间单位和时间精度的数字只能是1、10、100,不能为其它数字。而且时间精度不能比时间单位大。
最多两者一样大。比如,下面定义都是对的:
`timescale 1ns / 1ps
`timescale 100ns / 100ns
下面的定义是错的
`timescale 100ns / 100ns
时间精度就是模块仿真时间和延时的精确程度,比如:定义时间精度为10ns,那么时序中所有的延时至多能精确到10ns,而8ns或者18ns是不可能做到的。
‘timescale 100ns/10ns
module muti_delay(
din,
dout1
);
input din;
output dout1;
wire din;
reg dout1;
always @(din)
#3.14 dout1 = din;
endmodule
仿真波形如下:
我们可以看到,本意是要延时100*3.14=314ns后将din的值赋给dout1,但是它在310ns的时候就赋值了,为什么呢?这就是时间精度的问题了。时间精度定义为10ns,因此不能精确到4ns,经过四舍五入后,”#3.14“变成了”#3.1“。当然就是在310ns的时候赋值了。
在书写testbench时,一定要注意`timescale所定义的模块仿真时间单位和时间精度。
对于可以除尽的时钟,可以不用考虑;
对于除不尽的时钟,在用always定义时钟时,时钟间隔一定要定义到时间精度所精确的位数,否则会出现时钟异步的问题。
举例说明:
`timescale 1ns / 1ps
always # 6.25 DCONV_CLK_80 = ~ DCONV_CLK_80 ; //60M*4/3 = 80M 80M的时钟可以除尽
always # 8.3 CLK_60M = ~ CLK_60M; //60MHZ 8.3ns
always # 8.333 CLK_60M = ~ CLK_60M; //60MHZ 8.333ns
8.3ns和8.333ns在仿真时对仿真结果的影响特别大。