用VHDL语言描述双向端口如下: library ieee; use IEEE.STD_LOGIC_1164.ALL; entity bidirection_io is port ( inner_port : inout std_logic_vector(7 downto 0); out_en : in std_logic; outer_port : inout std_logic_vector(7 downto 0) ); end bidirection_io; architecture behavioral of bidirection_io is begin outer_port<=inner_port when out_en='1' else (OTHERS=>'Z'); inner_port<=outer_port when out_en='0' else (OTHERS=>'Z'); end behavioral;
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