==赋值语句中的运算符(Verilog)

==赋值语句中的运算符(Verilog),verilog,system-verilog,ternary-operator,assign,hdl,Verilog,System Verilog,Ternary Operator,Assign,Hdl,我试图理解一些系统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 an

我试图理解一些系统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_位是uwire,我无法将其与lo进行比较,但为什么在上面的示例中允许它?这两项作业不相等吗


非常感谢你的帮助

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

如果要使用过程性
If
,则它需要位于由always/initial块实例化的过程性代码块内

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

我明白了,我将尝试以这种方式实现它,但这回答了我的主要问题。非常感谢您的解释!