timescale指令的用法
FPGA技术联盟 2025-01-03

1、什么是`timescale指令?

`timescale指令我相信大家应该都不陌生,或多或少都见过,可能绝大部分人都能运用,但其实这个常用指令用起来还是有一些需要注意的。


`timescale是Verilog语法中的一条预编译指令,通常用来指定仿真中时间的单位与精度。


2、`timescale的用法

`timescale包含时间单位时间精度两部分,设定格式为`timescale timeunit / timeprecision。


timeunit 表示仿真时间单位,而timeprecision则表示仿真时间精度。


例如:`timescale 1ns/1ps 或者 `timescale 1us/1ns 等等。


注意:


  • 时间单位和时间精度只能是1、10和100这3个整数中的某个

  • 单位可以是s、ms、us、ns、ps和fs

  • 时间精度必须小于或等于时间单位

下面看一个简单的例子来了解下`timescale的使用方法:



  • 时间单位设置为10ns,精度设置为1ns

  • 第1次在#1时对set赋值0,此时延时时间为10ns,因为时间单位为10ns,#1表示延时1个时间单位

  • 第2次在#d时对set赋值1,此时延时时间为16+10ns,因为时间单位为10ns,#d表示延时1.6个时间单位,即16ns


仿真波形图如下:



set未给初值,所以为不定态;在10ns处赋值0,在26ns处赋值1,且测量尺度的最小单位为1ns,即精度1ns。以上均满足推断。


通过上面的例子可以了解时间单位的使用,但是无法看出来时间精度的设置是如何影响延时的,接下来我们把上面的TB代码稍微改一下,如下:



  • 时间单位设置为10ns,精度设置为1ns

  • 第1次在#1时对set赋值0,此时延时时间为10ns,因为时间单位为10ns,#1表示延时1个时间单位

  • 第2次在#d1时对set赋值1,此时延时时间为15+10ns,因为时间单位为10ns,#d1表示延时1.54个时间单位,即15.4ns,因为时间精度为1ns,所以其无法表示15.4ns,就会四舍五入到15ns

  • 第3次在#d2时对set赋值0,此时延时时间为16+15+10ns,因为时间单位为10ns,#d2表示延时1.55个时间单位,即15.5ns,因为时间精度为1ns,所以其无法表示15.5ns,就会四舍五入到16ns

仿真波形图如下:



set未给初值,所以为不定态;在10ns处赋值0,在25ns处赋值1,又在41ns处赋值0,且测量尺度的最小单位为1ns,即精度1ns。以上均满足推断。


3、需要注意的

`timescale指令用起来并不难,但还是有些需要注意的地方。


3.1、不要设置无意义的高精度

时间精度越高,仿真所消耗的资源和时间就越多,根据Clifford E. Cummings的文章《VERILOG CODING STYLES FOR IMPROVED SIMULATION EFFICIENCY》第8节所述,设置`timescale 1ns/1ps消耗的资源是设置`timescale 1ns/1ns的256%,而仿真所消耗的时间则是将近2倍。


我经常看到一些代码上来直接就是`timescale 1ns/1ps,但是仿真过程中其实根据就不需要看到ps级别的结果,完全就是图省事。在RTL不是很大的情况下,其所带来的的影响很难直观察觉出来,但是随着设计的复杂化和大型化,这无疑会成为一个灾难。


所以以后在写TB的时候,不妨问问自己:“你真的需要这么高的精度吗?”


3.2、注意多个`timescale的编译顺序

`timescale是Verilog语法的预编译指令,而预编译指令通常都是顺序执行的,这意味着,一旦`timescale被编译后,则会对其后的所有仿真时间与精度都产生影响,直到遇到了另一条`timescale指令(即上一条指令被覆盖,重新对时间与精度进行预编译)或者`resetall指令(重置所有预编译指令)。


当然了,我还是建议你统一使用一条`timescale指令,以便于工程管理和避免不必要的麻烦。  


声明: 本文转载自其它媒体或授权刊载,目的在于信息传递,并不代表本站赞同其观点和对其真实性负责,如有新闻稿件和图片作品的内容、版权以及其它问题的,请联系我们及时删除。(联系我们,邮箱:evan.li@aspencore.com )
0
评论
  • 相关技术文库
  • C语言
  • 编程
  • 软件开发
  • 程序
下载排行榜
更多
评测报告
更多
EE直播间
更多
广告