Как правильно реализовать задержку в модуле SystemVerilog, который использует конструкцию Always_comb? - PullRequest
0 голосов
/ 25 марта 2020

Я надеюсь, что кто-то может объяснить, как правильно реализовать задержки на входе для комбинационной функции в SystemVerilog. Почему нормально реализовывать временные задержки, используя # (1) в блоке Always, а не в Always_comb? Приведенный ниже код дает эту ошибку ...

Заявления в Always_comb не должны включать в себя те, которые блокируют, имеют блокировку синхронизации или элементы управления событиями,> или операторы forkjoin.

module compare( input logic [3:0] a,
                input logic [3:0] b,
                output logic eq );
  always_comb
    if (a != b) 
      #(1) eq = 1'b0;
    else
      #(1) eq = 1'b1;
endmodule 

Изменение Always_comb всегда избавляет от ошибки и реализует задержки. Но как бы вы смоделировали задержку распространения и сохранили Always_comb? Я попытался реализовать указанный блок в этом модуле, добавив ...

specify
 (a => eq) = (1);
 (b => eq) = (1);
endspecify

... и это осуществит задержку времени ... но только если я изменю тип a и b из logi c к проводу. Есть ли способ реализовать задержку, сохранить always_comb и сохранить a и b как logi c? Что делает Always_comb таким особенным? Я только начинаю изучать SystemVerilog, поэтому любая оценка будет принята с благодарностью.

1 Ответ

0 голосов
/ 25 марта 2020

У вас проблемы с инструментом. Порты a и b неявно должны быть проводами. Вы можете попробовать другой инструмент или сделать его явным с помощью:

module compare( input wire logic [3:0] a,
                input wire logic [3:0] b,
                output logic eq );
  specify
    (a *> eq) = (1);
    (b *> eq) = (1);
endspecify

  always_comb
    if (a != b) 
       eq = 1'b0;
    else
       eq = 1'b1;
endmodule

Кроме того, поскольку у вас есть пути многие-к-одному, вам нужно изменить => на *>

...