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

时间:2014-10-19 03:46:32

标签: 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

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

    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.

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

1 个答案:

答案 0 :(得分:5)

像这样的

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

两种解决方案:

使用三元运算符选择值。

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

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

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

Verliog reg vs wire是一个模拟器优化,您只需要使用正确的模拟器,详细说明的更多答案是Verilog Input Output typesSystemVerilog datatypes