首页 文章

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

提问于
浏览
5

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

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

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

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

    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”的正边沿和负边沿

  • 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

    不 . verilog中没有任何内容可以解决这个问题 . 你不能在编译时这样做 .

    但是你可以做一些事情来转储错误并在模拟中的时间'0'退出 .

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

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

    要不就

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

    否则这样的事情:

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

    两者都将在模拟开始时提供消息 .

相关问题