`timescale指令指定了其后面module模块的时间单位和时间精度。时间单位是时间值(如仿真时间和延迟值)的测量单位。
要在同一设计中使用不同时间单位的模块,可以使用以下时间刻度结构:
- `timescale编译器指令用于指定设计中模块的时间计量单位和时间精度
- $printtimescale系统任务用于显示模块的时间单位和精度
- $time 和 $realtime 系统函数、$timeformat 系统任务和 %t 格式规范,用于指定如何报告时间信息
`timescale编译器指令指定了时间和延迟值的测量单位,以及在读取另一条`timescale编译器指令之前,该指令后续所有模块中延迟的精确度。如果没有指定`timescale编译器指令,或该指令已被 `resetall指令重置,则时间单位和精度取决于仿真器。如果一个系统中某些模块指定了`timescale,而其他模块没有,这将是一个错误。
`timescale指令的语法如下表所示:
其中time_unit 参数指定时间和延迟的测量单位。time_precision 参数指定在仿真中使用延迟值之前的四舍五入方式。即使设计中其他地方的 time_precision 参数更小,所使用的值也会精确到此处指定的时间单位。设计中所有 `timescale 编译器指令的最小 time_precision 参数决定仿真时间单位的精度。time_precision 参数的精度至少应与 time_unit 参数的精度相同,不能指定比 time_unit 更长的时间单位。这些参数中的整数指定了数值大小的数量级,有效整数为 1、10 和 100。字符串代表度量单位;有效字符串为 s、ms、us、ns、ps 和 fs。
下表列出了这些字符串指定的测量单位:
例如下面的示例展示了如何使用该指令:
`timescale 1 ns / 1 ps
在这里,由于 time_unit 参数为 “1 ns”,因此指令后面模块中的所有时间值都是 1 ns 的倍数。由于 time_precision 参数为 “1 ps ”或纳秒的千分之一,因此延迟值被四舍五入为小数点后三位的实数,或精确到纳秒的千分之一。
请看下面的示例:
`timescale 10 us / 100 ns
由于 time_unit 参数为 “10 us”,因此该指令后面的模块中的时间值都是 10 us 的倍数。 由于 time_precision 参数为 “100 ns”,即十分之一微秒,因此延迟被四舍五入到十分之一微秒以内。
下面的示例显示了模块中的 `timescale 指令:
编译器指令 `timescale 10 ns / 1 ns 指定模块测试的时间单位为 10 ns。因此,模块中的时间值都是 10 ns 的倍数,四舍五入到最接近的 1 ns;因此,参数 d 中存储的值按比例放大到 16 ns 的延迟。换句话说,在仿真时间 16 ns(1.6 × 10 ns)时,值 0 被分配给变量set,而在仿真时间 32 ns 时,值1被分配给变量set。无论采用何种时间尺度,参数 d 都会保留其值。
上述例子的仿真时间确定方法如下:
a) 根据时间精度,参数 d 的值从 1.55 四舍五入到 1.6。
b) 模块的时间单位为 10 ns,精度为 1 ns,因此参数 d 的延迟时间按比例从 1.6 调整为 16。
c)在仿真时间 16 ns时,值0被分配给变量set;在仿真时间 32 ns时,值1被分配给变量set。在赋值时,时间值不四舍五入。
点赞加关注博主(ID:FPGA小飞)的博文,咱们一起系统学习verilog最终标准IEEE Std 1364-2005吧!