如果在dut中声明为inout类型的信号,处理的方式如下:
例如dut中声明的信号为inout [7:0] data;
在interface声明3个信号,一个是wire型的信号: wire logic [7:0] data;一个是将外部信号赋值给data的 input 类型的信号:logic [7:0] in_data; 第三个是将data赋值给外部的信号:logic [7:0] out_data; 在interface中利用条件语句将外部变量赋值给data,将data赋值给外部变量,这里注意当外部变量不向data赋值时,需要将data赋值为高组态;当data不向外部变量赋值时,需要将外部变量赋值为0。赋值示例如下:
- assign data=(a==1) ?in_data :'hzz;
- assign out_data=(a==0) ?data :'h00;
完整的示例如下:
- module top(clk,a,data,rst,addr);
-
- input clk,a,rst;
- inout [7:0] data;
- input [7:0] addr;
-
- logic [7:0] data_reg ,data_reg_reg;
-
- always @(posedge clk or negedge rst)
- if(!rst)
- begin
- data_reg<=0; data_reg_reg<=0;
- end
- else if (a==1)
- data_reg<=data;
- else if (a==0)
- begin
-
- //data_reg<=data_reg+1;
- data_reg_reg<=data_reg_reg+2;
- end
-
- assign data= (a==0) ? data_reg_reg : 'hzz;
-
-
-
- endmodule
- interface simple_bus;
- logic clk,a,rst;
- wire logic [7:0] data;
- logic [7:0] addr;
- logic [7:0] in_data;
- logic [7:0] out_data;
-
- assign data=(a==1) ?in_data :'hzz;
- assign out_data=(a==0) ?data :'h00;
-
- endinterface
- class testbench ;
- virtual simple_bus this_s;
- function new (virtual simple_bus s);
- this_s=s;
- endfunction
- task assignment;
- repeat(10) @(posedge this_s.clk);
- //force
- this_s.a=1;
- this_s.in_data=66;
- repeat (10) @(posedge this_s.clk);
- //force
- this_s.a=1;
- this_s.in_data=33;
-
- repeat(10) @(posedge this_s.clk);
- this_s.a=0;
- // force this_s.data='h77;
- endtask
-
-
- endclass
-
- module tb;
-
- simple_bus bus();
-
- top inst(.clk(bus.clk),.a(bus.a) ,.rst(bus.rst), .data(bus.data) ,.addr(bus.addr) );
-
-
- testbench class_test=new(bus);;
- //class_test =new(bus);
-
- initial
- begin
- bus.clk=0;
- bus.rst=0;
- #1000;
- bus.rst=1;
- class_test.assignment;
- //bus.a=0;
-
- /* #10000;
- bus.a=1; force bus.data='d8;
- #100; force bus.data='d3;
- #100 ; force bus.data='d7;
-
- #10000;
- bus.a=0; */
-
-
- end
- always #5 bus.clk= ~bus.clk;
-
- endmodule
注意:
不能在class中的task中向wire型变量使用force强制赋值,或者不能使用assign向wire变量连续赋值。
不能在tb中的initial 语句中对interface中的wire型变量强制赋值。