在编译时抛出错误的LINT / synthesis安全语句是什么?

时间:2017-06-21 20:41:18

标签: verilog hdl

我有一个传递parameter的模块,然后实例化与定义的参数对应的另一个模块。

但是,如果没有为特定的参数组合定义一个案例,我想在编译时抛出一个错误来突出显示问题,如下所示:

generate
if (PARAM1 == 1 && PARAM2 == 2) begin

   // instantiate module logic_A

end else if (PARAM1 == 2 && PARAM2 == 1) begin              

   // instantiate module logic_B

end else begin

   // throw an error at compile time if we haven't
   // defined a case for those parameters 

end
endgenerate

但是,这段代码仍然需要是可综合的(在Verilog中,而不是SystemVerilog)并传递LINTing,尽管插入错误。

有谁知道在这种情况下我可以使用什么?提前谢谢。

3 个答案:

答案 0 :(得分:4)

我在姐妹网站Electronics StackExchange上回答了非常类似的问题" a way of conditionally triggering a compile-time error in verilog。"解决方案是有条件地实例化不存在的模块。我建议不存在的模块有一个很长的名称和有意义的名称来解释错误。这也降低了不存在的模块意外与现有模块同名的风险。

generate
if (PARAM1 == 1 && PARAM2 == 2) begin : use_logicA
   // instantiate module logic_A
end
else if (PARAM1 == 2 && PARAM2 == 1) begin : use_logicB
   // instantiate module logic_B
end
else begin : illegal
   illegal_parameter_condition_triggered_will_instantiate_an non_existing_module();
end
endgenerate

这是有效的,因为在精化阶段评估参数值之前,不会检查是否存在不存在的模块。

更好的解决方案是使用SystemVerilog方法;特别是与IEEE Std 1800-2009标准或更新的模拟器补充。然后,您可以使用$error()并提供更有意义的消息以处理错误(例如,打印触发错误条件的参数值)。您可以在IEEE Std 1800-2012 20.11 精化系统任务

中详细了解它
generate
if (PARAM1 == 1 && PARAM2 == 2) begin : use_logicA
   // instantiate module logic_A
end
else if (PARAM1 == 2 && PARAM2 == 1) begin : use_logicB
   // instantiate module logic_B
end
else begin : illegal
   $error("Expected PRAM1/2 to be 1/2 or 2/1, but was %0d/%0d", PARAM1, PARAM2 );
end
endgenerate

答案 1 :(得分:1)

它有点笨重,我不知道你的棉绒工具在检查什么,但是这个怎么样:

generate
  if (PARAM1 == 1 && PARAM2 == 2) begin

    // instantiate module logic_A

  end else if (PARAM1 == 2 && PARAM2 == 1) begin              

    // instantiate module logic_B

  end else begin

    reg ILLEGAL_VALUES_ON_PARAM1_AND_PARAM2;
    reg DUMMYO, DUMMYI;
    always @(posedge ILLEGAL_VALUES_ON_PARAM1_AND_PARAM2 or negedge ILLEGAL_VALUES_ON_PARAM1_AND_PARAM2)
      DUMMYO <= DUMMYI;

  end
endgenerate

当我将PARAM1设置为3时,Quartus上会出现以下错误:

  

错误(10239):Verilog HDL始终在synth_assertion.v(18)处构造错误:事件控制无法测试变量“ILLEGAL_VALUES_ON_PARAM1_AND_PARAM2”的正边沿和负边缘

答案 2 :(得分:0)

不。在verilog中没有任何内容可以做到这一点。你不能在编译时这样做。

但你可以做一些事情来转储错误并在时间退出&#39; 0&#39;在模拟中。

在系统verilog中,您可以添加一个断言:

initial assert(0) else $fatal("--error--");

或只是

initial $fatal("--error--");

否则就是这样:

 initial begin $display("--error--"); $finish; end

两者都会在模拟开始时提供一条消息。