Verilog inout 双向口使用和仿真(2)
 
- UID
- 1029342
- 性别
- 男
|

Verilog inout 双向口使用和仿真(2)
这是一个self-checking testbench,可以自动检查仿真结果是否正确,并在Modelsim控制台上打印出提示信息。图中Monitor完成信号采样、结果自动比较的功能。
testbench的工作过程为
1)out_en=1时,双向端口处于输出状态,testbench给inner_port_tb_reg信号赋值,然后读取outer_port_tb_wire的值,如果两者一致,双向端口工作正常。
2)out_en=0时,双向端口处于输如状态,testbench给outer_port_tb_reg信号赋值,然后读取inner_port_tb_wire的值,如果两者一致,双向端口工作正常。
用Verilog代码编写的testbench如下,其中使用了自动结果比较,随机化激励产生等技术。
- timescale 1ns/10ps
- module tb();
- reg[7:0] inner_port_tb_reg;
- wire[7:0] inner_port_tb_wire;
- reg[7:0] outer_port_tb_reg;
- wire[7:0] outer_port_tb_wire;
- reg out_en_tb;
- integer i;
- initial
- begin
- out_en_tb=0;
- inner_port_tb_reg=0;
- outer_port_tb_reg=0;
- i=0;
- repeat(20)
- begin
- #50
- i=$random;
- out_en_tb=i[0]; //randomize out_en_tb
- inner_port_tb_reg=$random; //randomize data
- outer_port_tb_reg=$random;
- end
- end
- //**** drive the ports connecting to bidirction_io
- assign inner_port_tb_wire=(out_en_tb==1)?inner_port_tb_reg:8'hzz;
- assign outer_port_tb_wire=(out_en_tb==0)?outer_port_tb_reg:8'hzz;
- //最不懂的就是这儿了,估计也是最重要的地儿
- //instatiate the bidirction_io module
- bidirection_io bidirection_io_inst(.inner_port(inner_port_tb_wire),
- .out_en(out_en_tb),
- .outer_port(outer_port_tb_wire));
- //***** monitor ******
- always@(out_en_tb,inner_port_tb_wire,outer_port_tb_wire)
- begin
- #1;
- if(outer_port_tb_wire===inner_port_tb_wire)
- begin
- $display("\n **** time=%t ****",$time);
- $display("OK! out_en=%d",out_en_tb);
- $display("OK! outer_port_tb_wire=%d,inner_port_tb_wire=%d",
- outer_port_tb_wire,inner_port_tb_wire);
- end
- else
- begin
- $display("\n **** time=%t ****",$time);
- $display("ERROR! out_en=%d",out_en_tb);
- $display("ERROR! outer_port_tb_wire != inner_port_tb_wire" );
- $display("ERROR! outer_port_tb_wire=%d, inner_port_tb_wire=%d",
- outer_port_tb_wire,inner_port_tb_wire);
- end
- end
- endmodule
|
|
|
|
|
|