== assign 语句中的运算符 (Verilog)

== operator in assign statement (Verilog)

我正在尝试了解一些 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 进行比较,但是为什么在上面的例子中允许它呢?这两个赋值不是等价的吗?

非常感谢您的帮助!

区别在于 structural/declarative 上下文与程序上下文。当您在声明性上下文中使用 if 子句时(在这种情况下,它与您声明连线和变量的顶层相同),它被视为 条件生成构造 (参见 1800-2017 LRM 中的第 27.5 节)。这意味着 condition 在仿真开始之前得到评估,并且必须仅包含常量表达式并且没有在仿真期间可以更改的信号。 lo是常量参数,但lo_bits不是。

如果您想使用程序 if,它需要位于由 always/initial 块实例化的程序代码块内。

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