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

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

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

ИЛИ

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

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


person Omkar Manjunath    schedule 13.04.2016    source источник
comment
Спасибо за ваши комментарии. Итак, насколько я понимаю, навсегда и всегда блокировка после преобразования в язык низкого уровня будет на самом деле своего рода процедурой обслуживания прерывания, а операторы ожидания будут чем-то вроде инструкции ветвления. Поправьте меня если я ошибаюсь. Было бы здорово, если бы вы могли указать мне на какой-нибудь источник, который говорит о системном Verilog с точки зрения компилятора.   -  person Omkar Manjunath    schedule 14.04.2016


Ответы (4)


Они не являются функционально эквивалентными. Первый фрагмент ожидает, пока a не перейдет в высокий уровень (т. Е. Тот же самый цикл), тогда как второй фрагмент ожидает, пока a не будет «замечен» как высокий в тактовом цикле:

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

           |  |
           1  2

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

@(posedge clk iff dut_if.a);

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

person Tudor Timi    schedule 13.04.2016

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

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

person Puneet Goel    schedule 13.04.2016

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

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

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

person Karan Shah    schedule 15.04.2016

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

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

person hevangel    schedule 18.05.2016