【问题标题】:== operator in assign statement (Verilog)赋值语句中的 == 运算符 (Verilog)
【发布时间】:2019-10-08 18:06:28
【问题描述】:

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

非常感谢您的帮助!

【问题讨论】:

    标签: verilog system-verilog ternary-operator assign hdl


    【解决方案1】:

    区别在于结构/声明性上下文与程序性上下文。当您在声明性上下文中使用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;
    

    【讨论】:

    • 我明白了,我将尝试以这种方式实现它,但这回答了我的主要问题。非常感谢您的解释!
    猜你喜欢
    • 1970-01-01
    • 2017-03-27
    • 2014-05-04
    • 2013-07-28
    • 1970-01-01
    • 1970-01-01
    • 2013-07-15
    • 1970-01-01
    • 2016-06-08
    相关资源
    最近更新 更多