системверилог, сравнивающий два способа ожидания сигнала;1) @ (часы при условии), 2) пока (! Условие) @ (часы); - PullRequest
0 голосов
/ 22 февраля 2019

Я ищу некоторое интуитивное понимание метода systemverilog ожидания определенного сигнала на интерфейсе для 1) захвата транзакции на мониторе или 2) управления транзакцией в ответ на некоторый сигнал от DUT.Давайте предположим, что проверяемое устройство выдает сигнал готовности, и драйвер должен вести два такта данных (значения 1 и 2) вплотную, одновременно выдавая действительный сигнал, чтобы тестируемое устройство знало, когда собирать данные.

Существует два способа ожидания готового сингла от DUT, о котором я знаю;1) один - если обусловленное событие синхронизации, а другой - 2) потребление тактовых импульсов, в то время как некоторый сигнал не соответствует действительности (например, уровень готовности низок).Код тестового стенда может быть найден EDA детская площадка (строка 37 my_driver.sv) .

Первый метод использует @(posedge dut_vif.clock iff(dut_vif.ready == 1));, а второй метод while( ! dut_vif.ready) @(posedge dut_vif.clock);, и есть одинразница часов между двумя методами, как показано в форме волны.Мое лучшее понимание -

@(posedge dut_vif.clock iff(dut_vif.ready == 1));

Этот метод ожидает события повышения тактового импульса «при условии» готовности == 1. Поэтому данные и действительные значения находятся на высоком уровне25 нс.

while( ! dut_vif.ready) @(posedge dut_vif.clock);

С другой стороны, это утверждение означает, что симуляция должна потреблять часы, когда уровень готовности низок.Однако эта интерпретация и реальное поведение systemverilog очень разные.При 15 нс сигнал готовности становится высоким, и действительные данные передаются в одном и том же цикле.Насколько я понимаю, при 15 нс тестовая среда должна по-прежнему фиксировать готовность, и симуляция должна занимать один такт.Следовательно, второй метод должен вести себя так же, как и первый.

Могу ли я получить некоторую интерпретацию того, как понять эту разницу?

Я прилагаю форму волны здесь.

waveform comparison of two methods

Ответы [ 2 ]

0 голосов
/ 01 июля 2019
@(event iff (expression));

эквивалентно

do @event; while (!expression);

, а не

while (!expression); @event;

, как Дейв упоминал в здесь , возможно, он забыл это.Вот почему вы пропустили один такт.

0 голосов
/ 22 февраля 2019

Проблема заключается в скрытой дельта-задержке внутри вызова к get_next_item() Несмотря на то, что время все еще равно 15, counter и, таким образом, ready теперь имеют свои новые значения после возврата извызов.Использование iff дает более четкую выборку значений по фронту тактовой частоты.Это также позволяет избежать проблем, когда !ready равно x, потому что это равно false.

...