2014-09-09 3 views
0

신호 앨리어싱을 위해 클럭 블럭을 사용하고 있습니다. 나는 비트를 연결하여 버스를 형성하고 내 운전자에게이 버스를 운전하고 싶다. 따라서, 예를 들어 :클로킹 블럭을 사용할 때 출력 왜곡

interface bus_intf (clk); 
    input logic  clk; 
      logic[1:0] x_lsb; 
      logic[1:0] x_msb; 

    clocking driver_bus @(posedge clk) 
     default input #1step output #0; 
     output x_bus = {x_msb, x_lsb}; 
    endclocking 
endinterface 

지금이 가진 문제는, 내 주장 중 하나에, 나는 bus_intf.driver_bus.x_bus를 읽을 필요가있다. SV 매뉴얼에 명시된 바와 같이, 클럭킹 블록의 출력 변수는 테스트 벤치에서 읽혀서는 안되며, 그렇다면 시뮬레이터가 오류 (또는 내 경우 경고)를 울립니다. - x_busx_bus__o 지금, 내 파형 나는 두 신호가 생성되는 것을 볼

interface bus_intf (clk); 
    input logic  clk; 
      logic[1:0] x_lsb; 
      logic[1:0] x_msb; 

    clocking driver_bus @(posedge clk) 
     default input #1step output #0; 
     inout x_bus = {x_msb, x_lsb}; 
    endclocking 
endinterface 

문제 :

그래서 나는 인터페이스를 수정했습니다. 나는 Questasim이 이것을 한 이유를 이해합니다 - 두 버전을 볼 수 있도록 inout 선언을 분리하는 것입니다. 그러나 지금 문제는 내 클러킹 드라이브가 한 클럭 사이클 지연되었습니다! 따라서 DUT에 연결된 x_bus__ox_bus보다 1 클럭 사이클 늦습니다. 이것은 출력 skew가 # 0이라는 명시 적으로 나에게 영감입니다.

왜 이런 일이 발생하는지 알고 싶습니다. 내가 잘못한 일을하고 있거나 오해 한 적이 있습니까?

답변

2

EDAPlayground에 코드를 삽입하고 테스트 해 보았습니다. 예상대로 작동하는 것 같습니다.

나는 posedge에서 x_bus를 운전하면 http://www.edaplayground.com/x/Utf는, 값이 즉시 기록됩니다 인해 예상되는대로 : 당신이 온라인을 시도하려는 경우

module top; 
    bit clk; 
    always #1 clk = ~clk; 

    bus_intf busif(clk); 

    initial begin 
    @busif.driver_bus; 
    $display("time = ", $time); 
    busif.driver_bus.x_bus <= 'hf; 

    repeat (2) 
     @(negedge clk); 
    $display("time = ", $time); 
    busif.driver_bus.x_bus <= 'ha; 

    #100; 
    $finish(); 
    end 

    always @(busif.x_lsb) 
    $display("time = ", $time, " x_lsb = ", busif.x_lsb); 

    always @(busif.x_msb) 
    $display("time = ", $time, " x_msb = ", busif.x_msb); 
endmodule 

링크는 여기에 있습니다 : 여기 내 테스트 장치의 출력 지연은 #0입니다. 내가 (또는 posedge 옆에 다른 시간에) negedge에서 x_bus을 운전하면, 다음 posedge가 값을 운전할 때까지 기다릴 것입니다. x_busoutput 또는 inout으로 선언되었는지 여부에 관계없이이 동작을 참조하십시오.

쓰기를 예약 할 때 확인하십시오. 이것은 당신의 파도에 약간의 지연을 볼 수있는 이유가 될 수 있습니다.

관련 문제