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