2017-12-14 26 views
1

예 : IOs 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; 

양방향 전송 지연은 어떻게 모델링해야합니까?

답변

2

양방향 전송 지연은 두 가지 단방향 전송 지연으로 드라이버 강도를 사용하여 달성 할 수 있습니다. 모델은 I/O 드라이버의 약한 드라이브 강도에 그물을 할당해야합니다. 이것은 실제 운전자에게 우선권을 부여하고 운전자 충돌을 방지합니다.

피드백 루프를 방지하려면 드라이브 강도를 한정자로 사용하여 전송 지연에서 소스 값 또는 높은 Z를 지정해야하는지 결정하십시오. 드라이브 강도를 결정하는 쉬운 방법은 %v와 함께 볼 수있다 IEEE Std 1800-2012 강도 형식

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 

Aldec의 리비에라, 이카루스의 Verilog 및 GPL Cver와 EDAplayground에서 테스트 § 21.2.1.5