【问题标题】:Getting strange error in verilog (vcs) when trying to use if/else blocks尝试使用 if/else 块时,verilog (vcs) 中出现奇怪的错误
【发布时间】:2014-10-19 03:46:32
【问题描述】:

我正在尝试为 2 的补码加法器编写“逆变器”函数。我的导师希望我使用 if/else 语句来实现它。该模块应该采用 8 位数字并翻转位(因此从零到一/从一到零)。我写了这个模块:

    module inverter(b, bnot);
    input [7:0] b;
    output [7:0]bnot;

    if (b[0] == 0) begin
    assign bnot[0] = 1;
    end else begin
    assign bnot[0] = 0;
    end

    //repeat for bits 1-7

当我尝试使用此命令进行编译和编译时,出现以下错误:

    vcs +v2k inverter.v
    Error-[V2005S] Verilog 2005 IEEE 1364-2005 syntax used.
    inverter.v, 16
    Please compile with -sverilog or -v2005 to support this construct: generate
   blocks without generate/endgenerate keywords.

所以我添加了 -v2005 参数,然后我得到了这个错误:

  vcs +v2k -v2005 inverter.v
 Elaboration time unknown or bad value encountered for generate if-statement
 condition expression.
 Please make sure it is elaboration time constant.

有人介意向我解释我做错了什么吗?这一切都很新,而且很困惑:)。谢谢!

【问题讨论】:

    标签: verilog


    【解决方案1】:

    assign 这样的语句声明了驱动分配线的组合硬件。由于您已将 if/else 放在它周围,因此您似乎正在根据需要动态生成硬件,这是您无法做到的。 Generate 语句无需使用基于常量参数的变量实例来参数化代码,这就是为什么在这种情况下会出现非常令人困惑的错误。

    两种解决方案:

    使用三元运算符来选择值。

    assign bnot[0] = b[0] ? 1'b0 : 1'b1;
    

    assign bnot[0] = ~b[0]相同。

    或者使用组合的always块,输出必须声明为reg。

    module inverter(
      input      [7:0] b,
      output reg [7:0] bnot
    );
    always @* begin
      if (b[0] == 0) begin
        bnot[0] = 1;
      end else begin
        bnot[0] = 0;
      end
    end
    

    请注意,在上面的示例中,输出被声明为 reg 而不是 wire,我们始终使用 @* 包装代码并且不使用 assign 关键字。

    Verliog reg vs wire 是一种模拟器优化,您只需要使用正确的,详细说明此问题的进一步答案是Verilog Input Output typesSystemVerilog datatypes

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-06-30
      • 2023-03-07
      • 2020-12-27
      • 2019-12-15
      • 2017-12-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多