Answers:
我确定在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
在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()之外,没有一个答案是真正令人满意的,但这可能是最广泛的工具中最简单的答案。