1.timescale的介绍
timescale包含时间单位和时间精度两部分。设定格式为`timescale timeunit / timeprecision
timeunit和timeprecision由值1、10、和100以及单位s、ms、us、ns、ps和fs组成。
2.timescale对相对时间的影响
如果设定`timescale 1ns/1ps,#100是相对时间,等价于#100ns,而#100.1111会被认为是#100.111ns,因为它的精度高于timescaled的时间精度,而被四舍五入。
3.timescale的作用范围
在编译过程中,`timescale指令影响这一编译器指令后面所有模块中的时延值,直至遇到另一个`timescale指令或`resetall指令。
SystemVerilog可以声明一个时间单位和精度,这与Verilog-2001中的`timescale编译器指令具有等价的功能。这些声明消除了使用编译器指令时对文件顺序的依赖性问题。时间单位和精度可以分别使用timeunit和timeprecision关键字来声明,但这个时间文本值必须是10的幂。
对于任何模块、程序、包或接口,或者在任意编译单元作用域内,最多只能有一个时间单位和一个时间精度。这就会定义一个时间作用域。如果指定了timeunit和timeprecision的话,那么它们应该在任何当前时间作用域内其它条目之前声明。timeunit和timeprecision声明可以作为后续条目重复,但必须与当前时间作用域内之前的声明匹配。
如下例子中:module A的时间单位/精度是100ps/ 1ps,module B的时间单位/精度是1ns/ 10ps,module C的时间单位/精度是1ps/ 1ps,module D的时间单位/精度是1s/1s
`timescale 1ns / 10ps
module A (...);
timeunit 100ps;
timeprecision 1ps;
endmodule
module B (...);
endmodule
`timescale 1ps/1ps
module C (...);
`timescale 1s/1s
endmodule
module D (...);
endmodule
再看一个例子
`timescale 1ns/1ps
module add(input clk,input a,input b,output bit[1:0] sum);
always@(posedge clk)begin
#3;
sum = a+b;
$display("1:time:%t",$realtime);//3300;3.300
$display("2:time:%f",$realtime);//3.300000;3.300000
end
endmodule
`timescale 100ps/10ps
module test();
wire[1:0] get_sum;
reg input_a = 1;
reg input_b = 1;
bit clk;
initial begin
//$timeformat(-9,3,"",5);/*mark1*/
#1;
$display("3:time:%t",$realtime);//100;0.100
$display("4:time:%f",$realtime);//1.000000;1.000000
#2 clk = ~clk;
end
add ADD(.clk(clk),.a(input_a),.b(input_b),.sum(get_sum));
endmodule
4.使用$timeformat和%t统一时间单位/精度
timeformat_task ::= $timeformat[(units_number,precision_number,suffix_string,minimum_field_width)];
上述例子中mark1处注释掉后,打印结果为分号前结果,打开注释后,打印结果为分号后结果。
如果$timeformat没有被调用过,这时%t打印的时间单位是所有`timescale中的最小time precision