FPGA设计中inout端口信号的仿真测试

inout端口作为输入输出口,其在综合中以三态门的硬件形式而存在。但在波形仿真中,其具有输入输出性质就需要特别的操作手法才可以观察到正确的仿真波形。

  1. 在inout端口信号的仿真中,测试激励文件中Inout口必须定义为wire类型;
  2. 建议inout口的输入仿真和输出仿真分开来做,尤其是在IIC等互有交互变换时,因为这样会增加仿真激励文件的书写难度;
  3. 在进行inout口输入仿真时,把该端口在测试激励文件中视为单纯的wire类型,尽管你可能会在仿真波形中看到被测试模块输出的高阻信号;
  4. 在进行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输入的正确波形

FPGA设计中inout端口信号的仿真测试_第1张图片

你可能感兴趣的:(FPGA)