尝试使用if/else块时,verilog(vcs)中出现奇怪错误

尝试使用if/else块时,verilog(vcs)中出现奇怪错误,verilog,Verilog,我正试图写一个“反相器”功能为2的恭维加法器。我的讲师希望我使用if/else语句来实现它。该模块应采用8位数字并翻转位(因此0到1/1到0)。我写了这个模块: 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; e

我正试图写一个“反相器”功能为2的恭维加法器。我的讲师希望我使用if/else语句来实现它。该模块应采用8位数字并翻转位(因此0到1/1到0)。我写了这个模块:

    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.

有人能给我解释一下我做错了什么吗?对这一切都很陌生,也很困惑:)。谢谢

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

两种解决方案:

使用三元运算符选择该值

assign bnot[0] = b[0] ? 1'b0 : 1'b1;
这与
分配bnot[0]=~b[0]
相同

或者使用组合始终块,输出必须声明为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 not wire,我们使用ALWAYST@*包装代码,并且不使用assign关键字

Verliog reg vs wire是一个模拟器优化,您只需使用正确的一个,详细说明的进一步答案是