/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *。
作者: IT小方
来源: CSDN
原文: 3359 blog.csdn.net/super _ Haifeng/article/details/50110371
声明:本文为博主原创文章。 转载请附上博文链接!
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *。
说明:
timescale是Verilog HDL的时间刻度预编译指令,用于定义模拟模块时的时间单位和时间精度。 格式如下。
` timescale模拟时间单位/时间精度
注:用于说明模拟时间单位和时间精度的数字必须是1、10、100,不能是任何其他数字。 此外,时间精度不能大于时间单位。 最多两个是一样的大小。 例如,以下定义都是正确的。
` timescale 1ns/1ps
` timescale 100ns/100ns
以下定义是错误的:
` timescale 1ps/1ns
时间精度是一个模拟模块时间和延迟的精确程序,例如时间精度定义为10ns,时间序列中的所有延迟最大可精确到10ns,而8ns或18ns是不可能的。
在编译过程中,timescale命令会影响此编译器命令之后的所有模块的延迟值,直到找到另一个timescale命令resetall命令为止。
verilog没有默认的时间比例。 未指定timescale的verilog模块可能会错误地继承以前编译的模块的无效timescale参数。
举个简单的例子来说明:吧
例如,我们取得曲子的当前时间
//nstimeintervaltime=self.player.current time.value/self.player.current time.time scale; 以下转载其他文章
如果一个设计中的多个模块都有自己的timescale编译指令,会怎么样? 在这种情况下,模拟器将始终定位于所有模块的最低延迟精度,所有延迟将相应地转换为最大值
时间延迟精度,例如:
time scale1ns/100 psmoduleandfunc (z,a,b ); 输出z; input A,b; and # (5.22,6.17 ) al ) z、a、b ); end module time scale 10 ns/1 nsmoduletb; reg PutA,PutB; WHRE GetO; initialbeginPutA=0; PutB=0; #5.21 PutB=1; #10.4 PutA=1; #15 PutB=0; endandfuncaf1(geto,PutA,PutB ); 在endMODULE示例中,每个模块都有自己的timescale编译器指令。 timescale编译器指令首次应用于时延。 因此,在第一个模块中,5.22对应于5.2ns,6.17对应于6.2ns。 在第二个模块中,5.21对应于52ns,10.4对应于104ns,15对应于150ns,当对模块TB进行模拟时,设计中的所有模块的最小时间精度为100ps。 因此,所有延迟,特别是模块TB中的延迟,均换算为精度100ps。 延迟52ns现在与520100ps、104与1040100ps、150与1500*100ps相对应,更重要的是,在模拟中使用了100ps作为时间精度。 对于仿真模块AndFunc,模块TB中的timescale程序指令将被禁用,因为模块TB不是模块AndFunc的子模块。