== 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;
我正在尝试了解一些 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;