timeunit和timeprecision是不允许在systemverilog类中直接使用的,那么我们有什么方法可以设置systemverilog类的时间单位和精度呢?
答案就是讲systemverilog类包起来。
你可以用以下方式设置sv类中的时间精度。
1. 将类定义在program块中,并且在class定义之前,声明timeunit和timeprecision。
`timescale 1ns/1ns
program test;
timeunit 1ps;
timeprecision 1ps;
class C;
...........
$printtimescale; // Will print timescale of 1ps/1ps
endclass
endprogram
-------------------------------------------------------
A sample example is shown as follows:
test.sv:
--------------------------------------------
`timescale 1ns/10ps
module tb_top;
test_p test_p();
initial begin
$printtimescale;
end
endmodule
program test_p;
timeunit 1ps;
timeprecision 1ps;
class test;
function disp;
$printtimescale;
$display("%t",$time);
endfunction
endclass
test T;
initial
begin
T = new();
T.disp;
end
endprogram
--------------------------------------------
To run vcs -sverilog test.sv -R
Output:
--------------------------------------------
TimeScale of tb_top is 1 ns / 10 ps
TimeScale of test_p is 1 ps / 1 ps
--------------------------------------------
2.将类用包管理起来,即可以直接将类声明在package中,也可以声明在包外,用include“***.sv”包含进来。
`timescale 1ns/10ps
module tb_top;
test test();
initial begin
$printtimescale;
end
endmodule
package PACK;
timeunit 1ps;
timeprecision 1ps;
class test;
function disp;
$printtimescale;
$display("%t",$time);
endfunction
endclass
endpackage
program test;
import PACK::*;
test T;
initial
begin
T = new();
T.disp;
end
endprogram
-------------------------------------------
To run vcs -sverilog package_test.sv -ntb_opts dtm
Output:
-----------------------------------
TimeScale of tb_top is 1 ns / 10 ps
TimeScale of test_p is 1 ps / 1 ps
------------------------------------