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