有没有办法在Verilog中有条件地触发编译时错误?


9

我在verilog中有一个参数化模块,其中的参数是时钟速率和刷新速率,用于计算在重复操作实例之间插入了多少个不活动的周期。但是,设置无法达到的参数非常容易(因为该操作花费了很短的时间,所以重复操作必须在完成之前进行),并且目前设计还没有给出任何反馈在此。

我想知道是否有某种方式可以在综合(或模拟之前的编译)期间触发错误(如果一个局部参数小于另一个局部参数)?也许相当于流行的C / C ++编译时断言黑客。

Answers:


10

我确定在C / C ++编译时回调中可以使用某种方法进行绑定。但是,只要您的支持generate模块(在IEEE Std 1364-2001中引入),您就可以执行以下操作:

generate
if (CONDITION > MAX_ALLOWED /* your condition check */ ) begin
    illegal_parameter_condition_triggered_will_instantiate_an non_existing_module();
end
endgenerate

如果条件为真,则编译器将给出错误,因为存在对不存在的请求。如果条件为假,则跳过该操作。唯一的要求是,非法条件的代码遵循合法的Verilog语法,并且非法条件永远不会意外变为有效(因此,冗长而冗长的不存在的模块名称)。

如果您的模拟器和综合工具支持IEEE Std 1800-2009(2009年发布的SystemVerilog修订版)或更高版本,则可以使用$error()该错误并给出更有意义的信息。我不确定是否有任何供应商实现了此功能。大多数供应商实施之后,它应该成为首选方法,因此,我举一个例子:

generate
if (CONDITION > MAX_ALLOWED /* your condition check */ ) begin
    $error("%m ** Illegal Condition ** CONDITION(%d) > MAX_ALLOWED(%d)", CONDITION, MAX_ALLOWED);
end
endgenerate

1

您可以执行以下操作:

module test();

  parameter VALUE=16;

  // VALUE should be between 16 and 64
  wire [64:16] range_for_value;
  assign range_for_value[VALUE] = 1'b0;

endmodule

工具可能会对此稍有不同,但是如果VALUE不在预期范围内,则这确实应该是错误的,因为assign语句的位索引将超出的范围range_for_value


1

在Verilog中确实没有像“声明”之类的东西吗?这是非常基本的东西!

如果您的工具支持混合语言,则可以添加一个模块,该模块只是具有必需端口或泛型以及明显的ASSERT语句的VHDL实体。对于编译或详细说明时间可确定的条件,这在sim或综合中(至少在XST或Synplicity上)同样有效。

entity CheckSize is
   generic (depth : natural := 16);
   port (data : std_logic_vector);
end CheckSize;

architecture empty of CheckSize is
begin
   Assert depth * data'length <= 256 Report "Size too large!" 
      severity Failure;
end empty;

到目前为止,除了“ System Verilog 2009” $ error()之外,没有一个答案是真正令人满意的,但这可能是最广泛的工具中最简单的答案。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.