首页 文章

如何建模双向传输延迟

提问于
浏览
1

例如:IO A和B连接在它们之间有10ns的io到io延迟 . IO以500MHz(2ns周期)运行 .

默认情况下,Verilog使用惯性延迟作为滤波器 . 因此,将互连线定义为 wire #(10ns) io; 将不起作用,因为它将过滤掉数据 .

wire #(10ns) io;

assign io = io_a_en ? a_data_500MHz : 'z;
assign io = io_b_en ? b_data_500MHz : 'z;

传输延迟是单向的 . 为IO上的每个方向创建一个将导致多个驱动程序和反馈循环 .

always @(a) b_reg <= #(10ns) a;
always @(b) a_reg <= #(10ns) b;
assign a = b_reg; // feedback b_reg = b = a_reg = a ... and multi-driver
assign b = a_reg; // feedback a_reg = a = b_reg = b ... and multi-driver

assign a = io_a_en ? a_data_500MHz : 'z;
assign b = io_b_en ? b_data_500MHz : 'z;

一个人应该如何模拟双向传输延迟?

1 回答

  • 2

    使用具有两个单向传输延迟的驱动器强度可以实现双向传输延迟 . 该模型应该将网络分配给IO驱动程序的较弱驱动强度 . 这将优先考虑真正的驱动程序并防止驱动程序冲突 .

    要防止反馈循环,请使用驱动强度作为限定符来确定传输延迟是应分配源值还是高Z值 . 确定驱动强度的简便方法是使用 %v ,参见IEEE Std 1800-2012§21.2.1.5强度格式

    module bidi_delay #( parameter INERTIAL=0, TRANSPORT=10 ) (
        inout a, b
      );
    
      reg a2b, b2a;
      reg [23:0] a_strength, b_strength;
    
      always @(a) begin
        $sformat(a_strength, "%v", a);
        a2b <= #(TRANSPORT) (a_strength[23:16] == "S") ? a : 1'bz;
      end
      always @(b) begin
        $sformat(b_strength, "%v", b);
        b2a <= #(TRANSPORT) (b_strength[23:16] == "S") ? b : 1'bz;
      end
    
      assign (weak0,weak1) #(INERTIAL) a = b2a;
      assign (weak0,weak1) #(INERTIAL) b = a2b;
    endmodule
    

    EDAplayground与Aldec Riviera,Icarus Verilog和GPL Cver进行了测试

相关问题