【问题标题】:Verify Parameters in Verilog验证 Verilog 中的参数
【发布时间】: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 使用任何其他值,则根本不会生成互连。但赛灵思似乎并不关心这一点。如果提供了无效值,它将很高兴地“生成”任何内容:生成的设计合成但根本不起作用。

有没有办法检查参数的值,如果无效则抛出错误?我试过$errorassert(如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


【解决方案1】:

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

这是一个错误替代方案,因为大多数综合工具会忽略$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

【讨论】:

  • 非常感谢格雷格!这清楚地显示了我一直在寻找的各个组件之间的联系;模拟 vs 合成器 vs SV 语法。我也没有意识到 ISE 不支持 SV
  • 我刚刚发现您可以使用$display 函数让合成器日志显示错误、警告或信息消息:$display("<ERROR,WARNING,INFO>: <msg>"); 但错误不会导致合成器停止;仍然需要$finish(0);
猜你喜欢
  • 2014-06-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-05
  • 2019-06-01
  • 1970-01-01
相关资源
最近更新 更多