随机化系统verilog中的dut参数



我正在为dut编写系统verilog测试台架,并且在该领域中,参数DEPTH可能会改变,因此我一直在试图找出如何随机化参数。当前设置为20,但它的范围为7到255。如有任何建议和帮助,我将不胜感激。

我知道你不能直接在脚本中随机化它,但我听说过其他人通过创建一个包来实现它,他们可以在测试中插入随机值作为参数。

不可能随机化参数值,因为这些值需要在细化时固定,而随机化是一项运行时任务。

我想你的意思是你可以创建一个小的SystemVerilog程序,它可以在一个类中建模你的参数,随机化,然后在此基础上写一个包。

class my_params;
  rand bit [7:0] depth;
  constraint legal_depth {
    depth inside { [7:255] };
  }
  function void write_param_pkg();
    // open a file
    // start writing to it based on the randomized values
  end
endclass

你可以在一些虚拟的顶级模块中实例化这个类,并使用它来转储包:

module param_randomizer;
  initial begin
    my_params params = new();
    if (!params.randomize())
      $fatal(...)
    params.write_params_pkg();
  end
endmodule

写包的输出可以是:

package my_params_pkg;
  parameter DEPTH = 42;
endpackage
在开始编译真正的测试台架之前,需要调用

。测试平台将导入这个包,并将测试设备的参数设置为:

module testbench;
  my_design dut #(my_params::DEPTH) (...);
endmodule

如果您只有一个参数(而不是多个相互关联的参数),那么在SystemVerilog中进行随机化可能没有意义,因为脚本编写应该足够了。

这是我发现的一些解决方案,不确定它是否是你正在寻找的:
https://verificationacademy.com/forums/ovm/randomizing-module-parameters

简而言之:
您可以创建一个类,其中的字段表示要随机化的参数值。然后在一个新模块中实例化它,该模块随机化该类并输出一个具有随机参数值的新包文件。最后,用剩下的模块编译这个包。

正如其他答案所述,参数值必须在细化时解决。通常将它们传递到模拟器命令行:

vsim -gDEPTH=42

我不认为使用SystemVerilog约束求解器随机化参数有任何优势。从SystemVerilog中编写一个包以提供给后续编译的麻烦表明出了问题。理想情况下,所有SystemVerilog代码应该从精心设计的DUT中拾取所选参数,因此软件包不需要*。更新构建脚本可能更容易,例如:

vsim -gDEPTH=$(shuf -i 7-255 -n 1)

显然,作为整体测试工具的一部分,这可以更通用。如果你需要约束参数的随机化(不太可能但可能),那么你总是可以使用更强大的脚本语言。

这有一个额外的好处,如果您有其他配置值(例如,对于作为测试一部分执行的非SystemVerilog软件),这些都可以从一个地方设置,并将传递到模拟。

*尽管人们似乎经常使用包来共享参数,因为访问DUT参数可能会很尴尬。对于生成代码和写入文件,您可能会发现使用标准脚本语言将更强大,更易于维护。

最新更新