== оператор в операторе присваивания (Verilog) - PullRequest
1 голос
/ 08 октября 2019

Я пытаюсь понять синтаксис System Verilog. Я изо всех сил пытался закончить назначение, и я столкнулся с этим решением, но я не понимаю, почему оно работает.

localparam int lo = w;
uwire [n:0] lo_bits, hi_bits;
assign answer = lo_bits == nlo ? lo_bits + hi_bits : lo_bits;

Это не совсем то, что я имею в своем коде, но мой вопрос заключается в следующем:Почему я не могу переписать это в простой блок if-else как таковой?

if (lo == lo_bits)
    assign answer = lo_bits + hi_bits;
else
    assign answer = lo_bits;

Verilog жалуется, что lo_bits - это uwire, и я не могу сравнить его с lo, но тогда почему это разрешено в примеревыше? Разве эти два задания не эквивалентны?

Большое спасибо за помощь!

1 Ответ

2 голосов
/ 08 октября 2019

Разница между структурным / декларативным контекстом и процедурным контекстом. Когда вы используете предложение if в декларативном контексте (в этом случае оно находится на том же самом верхнем уровне, где вы объявляете свои провода и переменные), оно считается условной генерацией конструкции (см. Раздел 27.5 в1800-2017 LRM). Это означает, что условие оценивается до начала симуляции и должно содержать только постоянные выражения и никакие сигналы, которые могут измениться во время симуляции. lo - это постоянный параметр, но не lo_bits.

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

logic [n:0] answer;
always_comb
  if (lo == lo_bits)
    answer = lo_bits + hi_bits;
else
    answer = lo_bits;
...