首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

Verilog inout 双向口使用和仿真(2)

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
继承事业,薪火相传
返回列表