Сравнение производительности симуляции

Что из этого мешает производительности симуляции в моем тестовом стенде и почему (в поисках ответа с точки зрения компилятора системного verilog):

task A;
wait(dut_if.a==1);
.
.
endtask 

ИЛИ ЖЕ

task A;
  forever @(posedge clk) begin 
    if(dut_if.a==1).. 
  end
endtask

PS: "а" - это дут-сигнал, который утверждается на некотором фронте тактового сигнала во время симуляции. Предположим, эта задача вызывается только один раз.

4 ответа

Два не являются функционально эквивалентными. Первый фрагмент ждет до a идет высоко (то есть тот же цикл), тогда как второй фрагмент ждет до a "видно", чтобы быть высоким в тактовом цикле:

       _   _   _   _   _
clk  _| |_| |_| |_| |_| |_
            ______________
a    ______|

           |  |
           1  2

Цифры показывают, когда каждый из них срабатывает. То, что вы действительно хотите, это:

@(posedge clk iff dut_if.a);

Это семантически эквивалентно фрагменту 2. Комментарии @Coverify, сделанные здесь, должны также применяться и здесь (быстрее, потому что нет переключений контекста).

Первый вариант будет иметь лучшую производительность. Я предполагаю, что в контексте вашего использования оба варианта являются функционально правильными.

Второй фрагмент кода ждет на каждом такте, а затем проверяет состояние. Поскольку ожидание находится внутри цикла forever, этот код приведет к переключению контекста на каждом этапе clk. С другой стороны, код в варианте 1 переключает контекст только один раз.

Который имеет лучшую производительность? Это зависит от реализации симулятора. В симуляторе истинных событий случай 1 будет иметь лучшую производительность, потому что код оценки не активируется на каждом фронте такта. Тем не менее, я подозреваю, что случай 2 будет иметь лучшую производительность в реальном мире, поскольку код оценки хорошо согласован с тактовой частотой.

Если ваш код не моделирует асинхронную логику, я рекомендую придерживаться варианта 2. Код легче отслеживать и понимать. Выравнивание всего с часами делает вашу жизнь намного проще.

Оба варианта не являются функционально эквивалентными.

Но в этом случае 2-й вариант будет лучше, чем 1-й вариант, по производительности моделирования.

Поскольку в первом варианте инструмент должен проверять значение a на каждом временном шаге, тогда как во втором варианте инструмент будет проверять только на шаге, а не на каждом временном шаге.

Другие вопросы по тегам