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

问题描述 投票:1回答:1

我正在尝试了解一些系统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进行比较,但是为什么在上面的示例中允许它?这两个作业不相等吗?

非常感谢您的帮助!

verilog system-verilog ternary-operator assign hdl
1个回答
2
投票

[区别是结构/声明上下文与程序上下文。在声明性上下文中使用if子句时(在这种情况下,它与声明连接和变量的位置相同),它被视为条件生成构造(请参见1800年的27.5节) -2017 LRM)。这意味着condition在仿真开始之前已得到求值,并且必须仅包含常量表达式,并且在仿真期间不能更改任何信号。 lo是常量参数,但不是lo_bits

如果要使用过程if,它必须位于由始终/初始块实例化的代码的过程块内。

logic [n:0] answer;
always_comb
  if (lo == lo_bits)
    answer = lo_bits + hi_bits;
else
    answer = lo_bits;
© www.soinside.com 2019 - 2024. All rights reserved.