2014-09-09 4 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, выходная переменная из блока синхронизации не должна считываться тестовым узлом, и если это так, то симулятор выплевывает ошибку (или предупреждение в моем случае).

Так я изменил интерфейс:

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 

Проблема теперь, в моей форме волны я вижу два сигнала создается - x_bus и x_bus__o. Я понимаю, почему Questasim сделал это - он должен отделить объявление inout, чтобы я мог просматривать обе версии. Однако проблема заключается в том, что мой тактовый диск задерживается на один такт! поэтому x_bus__o, который подключен к тестируемому устройству, является одним тактовым циклом позже, чем x_bus. Это воодушевляет меня, явным образом заявляя, что выходное отклонение равно # 0.

Любая идея, почему это происходит? Я что-то делаю неправильно или неправильно понял?

ответ

2

Я разместил ваш код на EDAPlayground и попробовал его. Кажется, он работает так, как ожидалось. Вот мой тест Жгут:

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 

Ссылка здесь, если вы хотите попробовать его в Интернете: http://www.edaplayground.com/x/Utf

Если я вожу x_bus на posedge, то значение будет записано сразу, как и следовало ожидать из-за к выходной задержке #0. Если я отвечу x_bus при отказе (или в любое другое время в стороне от posedge), он будет ждать, пока следующий posedge не будет управлять значением. Я вижу это поведение независимо от того, объявлен ли x_bus как output или inout.

Проверьте, когда вы планируете свою запись; это может быть причиной того, что вы видите некоторые задержки на своих волнах.

Смежные вопросы