gpt4 book ai didi

verilog - 验证 Verilog 中的参数

转载 作者:行者123 更新时间:2023-12-02 15:41:44 27 4
gpt4 key购买 nike

我创建了一个模块,它接受一个指定模块数据线字节宽度的参数。它看起来像:

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 使用任何其他值,则根本不会生成互连。但Xilinx似乎并不关心这一点。如果提供了无效值,它会很高兴地“生成”任何内容:生成的设计可以综合,但根本不起作用。

有没有办法检查参数的值并在无效时抛出错误?我尝试过 $errorassert (如所讨论的 here ),以及 $display (如所提到的 here )。 Xilinx 拒绝使用任何这些函数,而是抛出语法错误并拒绝继续。

理想情况下,我希望在 generate 中的最后一个 else 中添加一些内容,但此时我会满足几乎所有内容。

最佳答案

Verilog 没有一个干净的解决方案来验证参数。至少有一个在 IEEE Std 1364 的任何版本中都没有被提及。最好的 Verilog 唯一解决方法是使用不存在的模块。

generate
// ...
else begin // invalid parameter configuration
nonexistent_module_to_throw_a_custom_error_message_for invalid_parameters();
end
endgenerate

false替代方案是将不存在的模块行替换为:

initial begin
$display("Runtime error for invalid parameter value %b",DATA_BYTE_WIDTH);
$finish(1);
end

这是一个false替代方案,因为大多数综合工具都会忽略$display(我相信它们会忽略$finish以及)。您也不会知道存在参数问题,直到编译后进行仿真。不存在的模块更优越,因为它是语法干净的参数条件编译错误。它只是缺少显示有问题参数值的消息。

自 IEEE Std 1800-2009 起,SystemVerilog 中确实存在一个干净的解决方案,其中添加了详细系统任务。 Xilinx ISE 似乎不支持 SystemVerilog。 Xilinx Vivado 确实如此,但我不确定它是否完全符合 LRM。如果可以的话尝试一下。阅读 IEEE Std 1800-2012 中的完整说明§ 20.11细化系统任务(*-2012 可免费下载,以促进 SV 采用。*-2009 较旧,且仍处于付费墙后面。有关详细化系统任务的部分在两个版本之间是逐字记录的。)

generate
// ...
else begin // invalid parameter configuration
$error("Elaboration error for invalid parameter value %b in", DATA_BYTE_WIDTH);

/* alternative $fatal. This prevents further elaboration from
happening. $error allows the rest of the design to elaborate.
Both block simulation. */
//$fatal(1,"Fatal elab. error for invalid parameter value %b in", DATA_BYTE_WIDTH);
end
endgenerate

关于verilog - 验证 Verilog 中的参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29803526/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com