Verilog поддерживает оценку короткого замыкания? - PullRequest
3 голосов
/ 12 июля 2010

Если у меня есть оператор if, например:

if(risingEdge && cnt == 3'b111)
begin
  ...
end

Будет ли он проверять cnt, еслиisingEdge не соответствует действительности?

Имеет ли это значение даже в HDL?

Ответы [ 2 ]

6 голосов
/ 12 июля 2010

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

См. Поправка № 52 в статье «Verilog and SystemVerilog Gotchas: 101 Распространенные ошибки кодирования и как их избежать», автор Стюарт Сазерленд и Дон Миллс.

2 голосов
/ 03 октября 2010

С точки зрения того, имеет ли это значение в HDL, я предполагаю, что вы спрашиваете, будет ли это иметь значение при синтезе. Короткий ответ, что это будет. Например, следующий код является синтезируемым SystemVerilog:

if(risingEdge && cnt++ == 3'b111)
begin
  ...
end

В Verilog (не SV) постинкремент можно заменить функцией verilog, которая имеет другие назначения для переменных модуля, чтобы показать то же самое. Так что да, это актуальный вопрос.

Пол Р. в целом прав, а ссылка на Сазерленд - отличная (много хороших вещей, подобных описанным в этих Гочах). Для справки, это изменилось с SystemVerilog, по крайней мере, что касается спецификации. В то время как Verilog указывает, что короткозамкнутые операции могут выполняться или не выполняться, SV устраняет неоднозначность, указывая, что реализации не должны оценивать короткозамкнутые операнды (аналогично C ++, Java и т. Д.). См. IEEE-1800-2009 раздел 11.3.5, если вы заинтересованы. Хотя это замечательно, послужной список для соблюдения спецификации SV не является звездным для всех поставщиков инструментов, поэтому будьте внимательны, полагаясь на него в SV.

...