timescale
预编译
`timescale是Verilog、Systemverilog的预编译指令,按照编译顺序,在此指令之后编译的component (module/program/interface…)都要按照timescale中规定的时间规则进行仿真,直到出现下一个timescale,
timescale是跟编译顺序密切相关的。
定义方式:
`timescale time_unit / time_precision
有定义方式可知,timescale定义了两种时间规则:
- time unit
- time precision
time unit
描述仿真系统中,描述delay的时间单位。在仿真中:
delay = delay_value * time_unit
例如 time_unit = 10ns,那么在code中 #10,代表的是延时 10 * 10 = 100 ns
支持的时间单位有:
而timeunit中时间粒度支持的是1,10,100。
time precision
时间精度描述的是仿真器的仿真时间精度。仿真中的时间间隔不会比时间精度更小。
如果在code中指定的delay精度比系统要大时,系统需要对delay做rounding。
例如 time precsion = 100ps,time unit = 1ns 而制定的delay为#2.72,系统仿真时会将delay rounding为2.7
Keyword
另外系统提供了两个keyword:
- timeunit
- timeprecision
用于在component内部定义不同于timescale的时间规则,作用域只在定义keyword的component内部,此component之外,依然按照timescale定义。
Compile options in VCS
一些DUT file声明了timescale,一些没有。
如果没有指定`timescale并且在cmd line中位置在最前面,VCS就会报错(没有timescale)。
-timescale=time_unit/time_precision
通过上述option就可以避免这个错误,并且 :
- 为没有声明timescale的file应用此timescale。
- 同时将定义timescale的file编译在没有定义的file之前 (防止定义的timescale被覆盖)。
-unit_timescale[=<default_timescale>]
The -unit_timescale option enables you to specify the default time unit for the compilation-unit scope
Example
`timescale 1ns/1psmodule A;initial begin$printtimescale(); end
endmodule `timescale 1ns/1ns
module B;initial begin$printtimescale(); end
endmodule module C;initial begin$printtimescale(); end
endmodulemodule D;timeunit 1ps;timeprecision 1ps;initial begin$printtimescale(); end
endmodulemodule E;timeunit 1ps/1ps;initial begin$printtimescale(); end
endmodulemodule F;timeunit 10ns;initial begin$printtimescale(); end
endmodulemodule G;timeprecision 1fs;initial begin$printtimescale(); end
endmodulemodule H;initial begin$printtimescale(); end
endmodule
仿真结果如下:
TimeScale of A is 1 ns / 1 ps
TimeScale of B is 1 ns / 1 ns
TimeScale of C is 1 ns / 1 ns
TimeScale of D is 1 ps / 1 ps
TimeScale of E is 1 ps / 1 ps
TimeScale of F is 10 ns / 1 ns
TimeScale of G is 1 ns / 1 fs
TimeScale of H is 1 ns / 1 ns