Verilog错误 - 精化时间常数

时间:2014-10-19 20:25:57

标签: verilog

变量声明:

output reg a, b, c;

以下内容有什么问题,以Verilog编码:

generate

if (!a && !b && !c)
    call    call1(param1, param2, param3);

endgenerate

我在if语句行中收到以下错误:

Error - unknown or bad value for genvar
Elaboration time unknown or bad value encountered for generate if-statement
condition expression. 
Please make sure it is elaboration time constant.

我甚至尝试了以下内容:

always @* begin

if (!a && !b && !c)
    call    call1(param1, param2, param3);

end

当我执行上面的操作时(始终阻止),我收到以下语法错误:

Token is '('

call    call1(param1, param2, param3);
                     ^

1 个答案:

答案 0 :(得分:3)

您使用verilog的方式看起来有些混淆,特别是您使用的命名约定。

使用生成on EDA Playground的示例的编译版本:

module test;

  localparam a = 0;
  localparam b = 0;
  localparam c = 0;

  generate
    if (!a && !b && !c) begin
      call    call1(param1, param2, param3);
    end
  endgenerate

endmodule

module call(
  input param1,
  input param2,
  input param3
);
endmodule

这实例化调用,即如果a,b和c为0则创建硬件。由于我们无法创建和销毁硬件a,b,c必须是常量。

您已将模块调用调用,这听起来像是在查看软件函数调用。它不是硬件块。

您的端口已命名为 param ,端口不是参数,它们代表将模块相互连接的硬件中的物理线路。

听起来你实际上试图选择逻辑,在这种情况下你需要组合硬件来选择使用哪个输出。

wire out1,out2,result;

call         call1     (input1, input2, out1); //<-- Hardware always exists
othercall    instance_2(input1, input2, out2);

always @* begin
  if (!a && !b && !c)
    result = out1;     //<-- Output from different modules selected
  else 
    result  = out2;
end

如果您没有在两个输出之间进行选择:

call         call1     (input1, input2, out1); //<-- Hardware always exists

always @* begin
  if (!a && !b && !c)
    result = out1;     //<-- Output from module selected
  else 
    result  = 'b0;     // Otherwise drive 0
end