验证Verilog中的参数

验证Verilog中的参数,verilog,hdl,xilinx-ise,Verilog,Hdl,Xilinx Ise,我创建了一个模块,它接受一个指定模块数据行字节宽度的参数。它看起来像: 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; .....

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

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字节。如果数据字节宽度使用任何其他值,则根本不会生成互连。但Xilinx似乎并不在意这一点。如果提供了无效的值,它将很高兴地“生成”任何内容:结果设计是合成的,但根本不起作用

是否有方法检查参数的值,如果无效则抛出错误?我尝试了
$error
assert
(如上所述)以及
$display
(如上所述)。Xilinx拒绝使用这些函数中的任何一个,而是抛出语法错误并拒绝继续


理想情况下,我希望在
生成
中加入最后的
else
,但我现在可以满足于几乎所有的要求

Verilog没有一个干净的解决方案来验证参数。IEEE标准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
这是一个错误的选择,因为大多数合成工具忽略了
$display
(我相信它们也忽略了
$finish
)。在编译后的模拟之前,您也不会知道存在参数问题。不存在的模块更优越,因为它是一个语法清晰的参数条件编译错误。它只缺少显示违规参数值的消息

从IEEE Std 1800-2009开始,SystemVerilog中确实存在一个干净的解决方案,其中添加了精化系统任务。看起来Xilinx ISE不支持SystemVerilog。Xilinx Vivado有,但我不确定这是否完全是LRM的投诉。如果可以的话,试试看。阅读§20.11精化系统任务中的完整说明。(*-2012是免费下载的,以促进SV的采用。*-2009更老了,仍然处于付费墙后面。关于精化系统任务的部分在两个版本之间是逐字的。)


你的第一个答案应该是可行的<代码>生成if(/*…*/)/*…*/else调用不存在的模块以抛出自定义错误消息();endgenerate。不存在的模块名和实例名是您的自定义错误消息。
$error
仅适用于SystemVerilog IEEE Std 1800-2009及更高版本。@这是一个输入错误;我的错误。上面已经修好了。我在
localparam
@Greg中混淆了位和字节宽度是的,我注意到了,但我真的希望得到更多。。。。我想是的。类似于c/c++中的
#error
。。。但是如果不存在的
module\u
nastitus是唯一的方法,那么它就可以了。非常感谢你,格雷格!这清楚地表明了我所发现的各个组成部分之间的联系;模拟vs synth vs SV语法。我也没有意识到ISE不支持SVI,只是发现您可以使用
$display
功能让synth日志显示错误、警告或信息消息:
$display(“:”)但错误不会导致synth停止;仍然需要
$finish(0)
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