проверка последовательности событий с нулевой задержкой - PullRequest
0 голосов
/ 29 января 2020

Предположим, что я хочу проверить последовательность изменения этих двух сигналов: sigA и sigB. Спецификация проекта заключается в том, что sigB должно измениться раньше, чем sigA (сначала B изменится, а затем изменится A)

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

// buggy RTL
sigB = ~sigA;

В этом коде sigB изменяется после sigA из-за задержки инвертора.

Но в RTL, как правило, мы не можем заметить проблему - это своего рода событие с нулевой задержкой. Только мы можем реализовать это в симуляции на уровне ворот с задержкой, которая неожиданно sigB фактически изменится немного позже, чем sigA.

Я ищу способ использования SVA или другого метода, который может обнаружить эту проблему во время моделирования RTL, а не обнаруживать ее во время моделирования уровня ворот (что слишком поздно).

1 Ответ

0 голосов
/ 29 января 2020

Verilog - это симулятор, управляемый событиями. Он будет планировать выполнение на основе входов / выходов блоков планирования basi c: always и assign.

В симуляциях rtl последовательность событий определяется списками чувствительности блоков always или "входами" операторов assign. Таким образом, следующее будет работать так, как вы ожидаете:

assign sigB = ~sigA;

или

always @(sigA)
   sibB = ~sigA;

Проблема произойдет, если вы пропустите 'sigA' из списка чувствительности блока всегда:

always @(sigC) 
   sibB = ~sigA;

По этой причине veilog 2K предложил оператор always @*, который не требует перечисления всех сигналов в списке чувствительности. Таким образом, следующее также будет работать корректно:

always @(*)
   sibB = ~sigA;

В конце такта симуляции значения всех переменных будут такими же, как в аппаратных средствах из-за последовательности событий в нуле задержка событийно-управляемого моделирования.

...