verilog中inout双向口的使用和仿真

标签:
宋体端口三态门高阻模块 |
分类: iFPGA |
//////////////////////////////////////////////////////////////////////////////////////
很多读者反映仿真双向端口的时候遇到困难,这里介绍一下双向端口的仿真方法。一个典型的双向端口如图1所示。
http://hiphotos.baidu.com/zaoyuan1217/pic/item/fe31880a20125e9763d9861e.jpg
其中inner_port与芯片内部其他逻辑相连,outer_port为芯片外部管脚,out_en用于控制双向端口的方向,out_en为1时,端口为输出方向,out_en为0时,端口为输入方向。
用Verilog语言描述如下:
module
input
inout[7:0]
inout[7:0]
assign
assign
endmodule
用VHDL语言描述双向端口如下:
library
use
entity
port
out_en
outer_port
end
architecture
begin
outer_port<=inner_port
inner_port<=outer_port
end
这是一个self-checking
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
module
reg[7:0]
wire[7:0]
reg[7:0]
wire[7:0]
reg
integer
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];
inner_port_tb_reg=$random;
outer_port_tb_reg=$random;
end
end
//****
assign
assign
//instantiate
bidirection_io
.out_en(out_en_tb),
.outer_port(outer_port_tb_wire));
//*****
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
$display("OK!
$display("OK!
outer_port_tb_wire,inner_port_tb_wire);
end
else
begin
$display("\n
$display("ERROR!
$display("ERROR!
$display("ERROR!
outer_port_tb_wire,inner_port_tb_wire);
end
end
endmodule