2017-12-14 12 views
1

たとえば、IOs AとBが接続されている間にIOnsとIOの間に10nsの遅延があります。 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上の各方向の1つを作成すると、複数のドライバとフィードバックループが発生します。

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; 

双方向トランスポート遅延をモデル化する方法はありますか。

答えて

2

双方向転送遅延は、2つの一方向転送遅延を使用してドライバ強度を使用して達成できます。モデルはIOドライバーの弱いドライブ強度にネットを割り当てる必要があります。これにより、実際のドライバーに優先順位を与え、ドライバーの競合を防ぎます。

フィードバックループを回避するには、ドライブの強さを修飾子として使用して、転送遅延でソース値または高Zを割り当てる必要があるかどうかを決定します。ドライブ強度を決定する簡単な方法は、%vとしている、IEEE Std 1800-2012 § 21.2.1.5 強度フォーマットAldec社リビエラ、イカルスのVerilog、およびGPL CVER

EDAplaygroundでテスト

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 

を見ます

関連する問題