相关阅读
Verilog基础https://blog.csdn.net/weixin_45791458/category_12263729.html?spm=1001.2014.3001.5482
`timescale编译指令用于指定指令后模块的时间单位和时间精度。时间单位是时间值的度量单位,例如延迟值和仿真时间;而仿真精度决定了最小可分辨延迟时间值。
为了在一个(或多个)文件中使用不同的时间单位,下面一些有关时间的结构很有用:
1、`timescale编译指令用于指定其后模块的时间单位和时间精度。
2、$printtimescale系统任务用于显示一个模块的时间单位和时间精度。
3、$time和$realtime系统函数用于以当前模块的时间单位和时间精度显示仿真时间。
4、$timeformat系统任务用于指定格式字符串中转换说明%t的格式。
`timescale编译指令指定了其后模块的时间和延迟值的度量单位和精度,直到遇到了另一个 `timescale编译指令。如果没有使用`timescale编译指令或者使用了`resetall编译指令复位,则时间单位和时间精度默认是由仿真器决定的。如果一些模块有`timescale编译指令,而一些没有,则会报错(简单来说就是,要么所有都用默认值,否则所有模块都需要使用`timescale编译指令),如下两种情况所示。
//错误,因为bbb模块使用默认值,而aaa模块指定了`timescale
`timescale 1ns/1ns
module aaa();
bbb bbb_inst(a);
endmodule
`resetall
module bbb(input a);
initial #5 $display("bbb");
endmodule
//错误,因为bbb模块使用默认值,而aaa模块指定了`timescale(编译指令值影响本文件中定义的模块)
//文件1
`timescale 1ns/1ns
module aaa();
bbb bbb_inst(a);
endmodule
//文件2
module bbb(input a);
initial #5 $display("bbb");
endmodule
`timescale编译指令的语法如下所示。
time_unit参数指定了时间单位。而time_precision参数指定了时间精度,一个层次化设计的所有模块中最小的时间精度决定了仿真的时间精度,需要注意的是,仿真的时间精度并不一定和各模块的时间精度相同,这也就是说一个模块可能显示出比自己仿真精度还小的时间值。同时,时间精度还决定了一个延迟值在被使用前会被四舍五入的位数。上面两点在之后都会举例说明。
时间精度不能比时间单位还大,也就是说精度最大与时间单位相同,这很好理解,如果一个时间精度都大于时间单位了,那它将成为实际意义上的时间单位。
time_unit参数和time_precision参数由两部分组成,一个整数值和一个时间字符串,其中整数值可以是1,10,100,而字符串可以是s,ms,us,ns, ps和fs。时间字符串和时间单位的对应关系如下表所示。
时间字符串 | 时间单位 |
s | 秒 |
ms | 毫秒 |
us | 微秒 |
ns | 纳秒 |
ps | 皮秒 |
fs | 飞秒 |
我们首先说明一个延迟值在被使用前会因为时间精度而四舍五入,下面给出了一个例子。
`timescale 10ns/1ns
module aaa();
initial #1.55 a=1;
endmodule
由于时间单位是10ns,所以1.55代表了15.5ns,而时间精度是1ns,代表需要四舍五入至最低位是1ns,即四舍五入至16ns,因此真正的延迟时间值为16ns。
一个模块的时间精度并不一定代表模块可辨别的最小时间值,而只是代表该模块可辨别的最小延迟时间值,真正决定一个模块可辨别的最小时间值的是仿真的时间精度,下面给出了一个例子。
`timescale 1ps/1ps
module aaa();
reg a;
bbb bbb_inst(a);
initial #5 a=1;
endmodule
`timescale 1ns/1ns
module bbb(input a);
initial @(a) $display($realtime);
endmodule
输出:
0.005
仿真的时间精度为所有模块中最小的时间精度因此是1ps,在5ps时a赋值为1,因此触发了bbb模块中的$display($realtime);语句,$realtime系统函数的作用是以当前模块的时间单位为单位返回当前仿真时间的实数值,即以1ns为单位,返回5ps仿真时间,所以结果为0.005,这小于bbb模块仿真精度1ns。
最后顺带一提,仿真时间精度也是仿真能推进的时间精度,在上例中,无法以500fs为步长推进仿真时间,无论你推进了多少次。
以上内容可以总结为:一个模块的仿真精度,决定了其内延迟值的精度,而层次化设计中所有模块的仿真精度中最小的那个,决定了仿真器维护的仿真时间精度,可以认为是仿真时间的真正单位(没有小数部分)。一个模块的仿真单位决定了其延迟值的单位和$time和$realtime等系统函数返回值的单位。