Timescale

'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在仿真时对仿真结果的影响特别大。



你可能感兴趣的:(FPGA)