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

use*_*411 -1 verilog

我正在尝试为2的恭维加法器编写"逆变器"功能.我的导师希望我使用if/else语句来实现它.该模块应该采用8位数字并翻转位(零到1/1到零).我写了这个模块:

    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
Run Code Online (Sandbox Code Playgroud)

当我尝试使用此命令编译和编译时,我收到以下错误:

    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.
Run Code Online (Sandbox Code Playgroud)

所以我添加了-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.
Run Code Online (Sandbox Code Playgroud)

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

Mor*_*gan 5

assign像这样的语句声明驱动指定线路的组合硬件.由于你已经把if/else放在它周围,看起来你正在根据需要动态生成硬件,这是你无法做到的.生成语句远离基于常量参数的变量实例的参数化代码,这就是为什么在这种情况下你会得到相当混乱的错误.

两种解决方案

使用三元运算符选择值.

assign bnot[0] = b[0] ? 1'b0 : 1'b1;
Run Code Online (Sandbox Code Playgroud)

哪个是一样的assign 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
Run Code Online (Sandbox Code Playgroud)

请注意,在上面的示例中,输出声明为reg not wire,我们使用always @*包装代码,并且不使用assign关键字.

Verliog reg vs wire是一个模拟器优化,你只需要使用正确的,进一步的答案,详细说明这是Verilog输入输出类型,SystemVerilog数据类型.