2017-12-14 5 views
1

Zum Beispiel: IOs A und B sind verbunden, haben eine Verzögerung von 10ns io-to-io zwischen ihnen. Die IOs laufen mit 500 MHz (2 ns).So modellieren Sie die bidirektionale Transportverzögerung

Standardmäßig verwendet Verilog die Trägheitsverzögerung, die als Filter fungiert. Daher wird das Definieren der Verbindungsleitung als wire #(10ns) io; nicht funktionieren, da die Daten herausgefiltert werden.

wire #(10ns) io; 

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

Transportverzögerung ist unidirektional. Wenn Sie für jede Richtung auf einer IO einen erstellen, werden mehrere Treiber und eine Rückkopplungsschleife verursacht.

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; 

Wie sollte eine bidirektionale Transportverzögerung modelliert werden?

Antwort

2

Die bidirektionale Transportverzögerung kann mithilfe der Treiberstärke mit den beiden unidirektionalen Transportverzögerungen erreicht werden. Das Modell sollte die Netze einer schwächeren Laufwerkstärke der IO-Treiber zuweisen. Dies wird dem echten Treiber Priorität geben und Treiberkonflikte verhindern.

Um eine Rückkopplungsschleife zu verhindern, verwenden Sie die Laufwerkstärke als Qualifikationsmerkmal, um zu entscheiden, ob die Transportverzögerung den Quellwert oder High-Z zuweisen soll. Eine einfache Möglichkeit, die Antriebskraft zu bestimmen, ist mit %v mit, IEEE Std 1800-2012 § 21.2.1.5 Stärke Format

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 

Getestet auf EDAplayground mit Aldec Riviera, Icarus Verilog und GPL Cver sehen

Verwandte Themen