【发布时间】:2015-04-22 16:23:10
【问题描述】:
我创建了一个模块,它接受一个指定模块数据线字节宽度的参数。它看起来像:
module wrapper#
(
parameter DATA_BYTE_WIDTH = 1
)
(
din, dout, ..
);
localparam DATA_BIT_WIDTH = 8*DATA_BYTE_WIDTH;
input [DATA_BIT_WIDTH-1:0] din;
output [DATA_BIT_WIDTH-1:0] dout;
.....
generate
if( DATA_BYTE_WIDTH == 1 ) begin
// Various modules and interconnects for 1-byte data
else if( DATA_BYTE_WIDTH == 2) begin
// Various modules and interconnects for 2-byte data
else if....
// and so on, for 4, 8, and 16
else
// DATA_BYTE_WIDTH is not a valid value
// HERE is where I want to throw an error
end
endgenerate
// other code
endmodule
问题是唯一有效的宽度是 1、2、4、8 或 16 字节。如果 DATA_BYTE_WIDTH 使用任何其他值,则根本不会生成互连。但赛灵思似乎并不关心这一点。如果提供了无效值,它将很高兴地“生成”任何内容:生成的设计合成但根本不起作用。
有没有办法检查参数的值,如果无效则抛出错误?我试过$error 和assert(如here 所述),以及$display(如here)。 Xilinx 拒绝使用任何这些函数,而是抛出语法错误并拒绝继续。
理想情况下,我希望在generate 的最后一个else 中添加一些内容,但此时我会满足于几乎任何事情。
【问题讨论】:
-
第一个link 的接受答案应该有效。
generate if (/*...*/) /*...*/ else call_a_module_that_does_not_exists to_throw_as_a_custom_error_msg(); endgenerate。不存在的模块名称和实例名称是您的自定义错误消息。$error仅适用于 SystemVerilog IEEE Std 1800-2009 及更高版本。 -
@toolic 这是一个错字;我的错。上面已经修复了。我在
localparam中混合了 BIT 和 BYTE 宽度。 -
@Greg 是的,我注意到了这一点,但我真的希望有更多的东西......我想是的。类似于 c/c++ 中的
#error... 但如果module_that_does_not_exist肮脏是唯一的方法,那么它就可以了。
标签: verilog hdl xilinx-ise