system verilog中%m和%0t啥意思
时间: 2023-11-06 16:48:54 浏览: 383
在SystemVerilog中,%m和%0t都是用于时间控制的系统任务。
%m表示当前仿真时间(从仿真开始到当前时刻的时间量),以毫秒为单位。例如,如果仿真时间为1.2秒,则%m的返回值为1200。
%0t表示上一个时间刻度的时间。时间刻度是指仿真时间中的最小单位。例如,如果时间刻度为1纳秒,那么%0t返回的是上一个纳秒的时间。
需要注意的是,%m和%0t都只能在initial块或task/function中使用,不能在always块中使用。
相关问题
I mean I'm quite new to system verilog, so I need you to show me the concrete code after modification, can you show me the code of the 10 ways of modification you just suggested? thanks a lot
Certainly! Here's the code for the 10 modifications I suggested:
1. Modify the values in both `t1` and `t2` class constructors to be random numbers instead of hard-coded values.
```
interface Int();
class t1;
integer a[string];
function new;
a["a"] =$random;
a["b"] =$random;
a["c"] =$random;
endfunction
endclass
class t2;
integer b[string];
function new;
b["aa"] =$random;
b["bb"] =$random;
b["cc"] =$random;
endfunction
endclass
t1 inst1 =new;
t2 inst2 =new;
endinterface
```
2. Add an additional class that extends `t1` and `t2` and overrides specific values with its own.
```
interface Int();
class t1;
integer a[string];
function new;
a["a"] =40;
a["b"] =60;
a["c"] =80;
endfunction
endclass
class t2;
integer b[string];
function new;
b["aa"] =44;
b["bb"] =66;
b["cc"] =88;
endfunction
endclass
class t3 extends t1,t2;
function new;
super.new();
a["a"] =100;
b["bb"] =200;
endfunction
endclass
t1 inst1 =new;
t2 inst2 =new;
t3 inst3 =new;
endinterface
```
3. Use a different data type for the `integer array[string]` variable, such as `real array[string]`.
```
interface Int();
class t1;
real a[string];
function new;
a["a"] =40;
a["b"] =60;
a["c"] =80;
endfunction
endclass
class t2;
real b[string];
function new;
b["aa"] =44;
b["bb"] =66;
b["cc"] =88;
endfunction
endclass
t1 inst1 =new;
t2 inst2 =new;
endinterface
```
4. Change the `virtual` keyword to `pure virtual` in the `Int` interface declaration.
```
interface Int();
pure virtual class t1;
integer a[string];
function new;
a["a"] =40;
a["b"] =60;
a["c"] =80;
endfunction
endclass
pure virtual class t2;
integer b[string];
function new;
b["aa"] =44;
b["bb"] =66;
b["cc"] =88;
endfunction
endclass
t1 inst1 =new;
t2 inst2 =new;
endinterface
```
5. Replace the `initial` block with a `task` or `function` that takes in the `Int` interface as an argument and returns the `array` variable.
```
interface Int();
class t1;
integer a[string];
function new;
a["a"] =40;
a["b"] =60;
a["c"] =80;
endfunction
endclass
class t2;
integer b[string];
function new;
b["aa"] =44;
b["bb"] =66;
b["cc"] =88;
endfunction
endclass
task test;
input Int in;
integer array[string];
begin
#1;
array =in.inst1.a;
$display("testint.inst1.a =%p", in.inst1.a);
$display("array = %p", array);
#2;
array =in.inst2.b;
$display("testint.inst2.b =%p", in.inst2.b);
$display("array =%p", array);
end
endtask
t1 inst1 =new;
t2 inst2 =new;
endinterface
module top;
Int in();
initial begin
test(in);
end
endmodule
```
6. Add a `bit [31:0]` variable to both `t1` and `t2` classes and modify the constructor functions to set it to the sum of the other values.
```
interface Int();
class t1;
integer a[string];
bit [31:0] sum;
function new;
a["a"] =40;
a["b"] =60;
a["c"] =80;
sum =a["a"] +a["b"] +a["c"];
endfunction
endclass
class t2;
integer b[string];
bit [31:0] sum;
function new;
b["aa"] =44;
b["bb"] =66;
b["cc"] =88;
sum =b["aa"] +b["bb"] +b["cc"];
endfunction
endclass
t1 inst1 =new;
t2 inst2 =new;
endinterface
```
7. Create a new interface that extends `Int` and adds additional methods or variables.
```
interface Int();
class t1;
integer a[string];
function new;
a["a"] =40;
a["b"] =60;
a["c"] =80;
endfunction
endclass
class t2;
integer b[string];
function new;
b["aa"] =44;
b["bb"] =66;
b["cc"] =88;
endfunction
endclass
t1 inst1 =new;
t2 inst2 =new;
endinterface
interface Int2 extends Int();
parameter int MAX_ARRAY_SIZE =100;
function void print_array();
for (int i =0; i < MAX_ARRAY_SIZE; i++) begin
$display("a[%0d] = %0d", i, inst1.a[i]);
end
endfunction
endinterface
module top;
Int2 in();
initial begin
in.print_array();
end
endmodule
```
8. Modify the `testint` variable to be a `typedef` of the `Int` interface instead of a `virtual` instance.
```
typedef Int testint_t;
testint_t in =new();
```
9. Change the `integer` data type to `bit [7:0]` for all instances of `integer` in the code.
```
interface Int();
class t1;
bit [7:0] a[string];
function new;
a["a"] =40;
a["b"] =60;
a["c"] =80;
endfunction
endclass
class t2;
bit [7:0] b[string];
function new;
b["aa"] =44;
b["bb"] =66;
b["cc"] =88;
endfunction
endclass
t1 inst1 =new;
t2 inst2 =new;
endinterface
```
10. Add assertions to the code to ensure that the values in `testint.inst1.a` and `testint.inst2.b` are always greater than zero.
```
interface Int();
class t1;
integer a[string];
function new;
a["a"] =40;
a["b"] =60;
a["c"] =80;
assert(a["a"] > 0) else $error("Value of a[a] is not greater than zero");
assert(a["b"] > 0) else $error("Value of a[b] is not greater than zero");
assert(a["c"] > 0) else $error("Value of a[c] is not greater than zero");
endfunction
endclass
class t2;
integer b[string];
function new;
b["aa"] =44;
b["bb"] =66;
b["cc"] =88;
assert(b["aa"] > 0) else $error("Value of b[aa] is not greater than zero");
assert(b["bb"] > 0) else $error("Value of b[bb] is not greater than zero");
assert(b["cc"] > 0) else $error("Value of b[cc] is not greater than zero");
endfunction
endclass
t1 inst1 =new;
t2 inst2 =new;
endinterface
```
阅读全文