inout端口作爲輸入輸出口,其在綜合中以三態門的硬件形式而存在。但在波形仿真中,其具有輸入輸出性質就需要特別的操作手法纔可以觀察到正確的仿真波形。
- 在inout端口信號的仿真中,測試激勵文件中Inout口必須定義爲wire類型;
- 建議inout口的輸入仿真和輸出仿真分開來做,尤其是在IIC等互有交互變換時,因爲這樣會增加仿真激勵文件的書寫難度;
- 在進行inout口輸入仿真時,把該端口在測試激勵文件中視爲單純的wire類型,儘管你可能會在仿真波形中看到被測試模塊輸出的高阻信號;
- 在進行inout口的輸出仿真時,需要在測試激勵文件中定義一個三態門和該端口相連,這樣纔可以在仿真中看到該端口的正確輸入波形信號。
下面,以Inout口的輸入爲特別示例(IIC主機讀從機),其中sda爲inout口:
module iic_tb(
);
reg clk,rst_n;
wire sda;
reg[7:0]data_in;
reg data_v;
wire scl;
wire[7:0]data_rd;
wire wr,rd;
/////////////////////////////////////////////////////
//建立輸入仿真三態門
reg SDA_R;
reg SDA_LINK;
wire SDA;
assign SDA = SDA_LINK ? 1'bz : SDA_R;
assign sda = SDA;
/////////////////////////////////////////////////////
IIC IIC_U1(
.clk(clk),
.rst_n(rst_n),
.sda(sda),
.data_in(data_in),
.data_v(data_v),
.scl(scl),
.data_rd(data_rd),
.wr(wr),
.rd(rd)
);
initial begin
clk <= 0;
rst_n = 1;
data_in <= 8'd0;
data_v <= 0;
SDA_R <= 0;
SDA_LINK <= 1;
#100 rst_n = 0;
#100 rst_n = 1;
/////////////////////////////////////////////////////////////////
#20 begin
data_in <= 8'b11110001;
data_v <= 1'b1;
end
#20 data_v <= 1'b0;
#87440 SDA_LINK = 1'b0;
#7500 begin
SDA_R = 1'b1;
end
#10000 SDA_R = 1'b0;
#10000 SDA_R = 1'b1;
#10000 SDA_R = 1'b0;
#10000 SDA_R = 1'b1;
#10000 SDA_R = 1'b0;
#10000 SDA_R = 1'b1;
#10000 SDA_R = 1'b0;
#10000 SDA_LINK = 1'b1;
end
always #10 clk = ~clk;
endmodule
測試出的波形如下:
可以看到在被測試模塊sda輸出高阻的情況下(link = 1),觀察到了sda輸入的正確波形