我正在为dut
在系统verilog中编写一个测试平台,在该字段中,参数DEPTH
可能会发生变化,因此我一直试图弄清楚如何随机化参数。它目前设置为20,但它的范围是7到255.任何建议和帮助将不胜感激。
我知道你不能直接在脚本中随机化它,但我已经听说过其他人通过创建一个可以插入随机值作为参数的测试运行的包来做到这一点。
答案 0 :(得分:3)
不可能随机化参数值,因为这些值需要在精化时修复,随机化是一个运行时任务。
我认为你的意思是你可以创建一个小型的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
在开始编译真实的测试平台之前,您需要调用它。测试平台将导入此包并将DUT的参数设置为此参数:
module testbench;
my_design dut #(my_params::DEPTH) (...);
endmodule
如果你只有一个参数(而不是彼此相关的多个参数),那么在SystemVerilog中进行随机化可能没有意义,因为脚本应该足够了。
答案 1 :(得分:2)
这是我找到的一些解决方案,不确定它是否是您正在寻找的:
https://verificationacademy.com/forums/ovm/randomizing-module-parameters
简而言之:
您可以创建一个类,其中的字段表示要随机化的参数值。然后在新模块中实例化它,该模块随机化该类并输出带有参数随机值的新包文件。最后,使用其余模块编译该包。
答案 2 :(得分:2)
正如其他答案所述,参数值必须在精化时解决。通常,它们会传递到模拟器命令行:
vsim -gDEPTH=42
我认为使用SystemVerilog约束求解器随机化您的参数没有任何优势。从SystemVerilog写出一个包以提供给后续编译的麻烦表明出现了问题。理想情况下,所有SystemVerilog代码都应从精心设计的DUT中获取所选参数,因此不需要包*
。更新构建脚本可能更容易,例如:
vsim -gDEPTH=$(shuf -i 7-255 -n 1)
显然,作为整体测试工具的一部分,这可以更通用。如果你需要约束随机化参数(不太可能但可能),那么你总是可以使用更强大的scripting language。
这具有额外的优势,如果您有其他配置值(例如,对于作为测试的一部分执行的非SystemVerilog软件),这些可以从一个地方设置并将传递到模拟。
*
虽然人们经常使用包来共享参数,因为它可以是awkward to access DUT params。再次生成代码和写入文件,您可能会发现使用标准脚本语言将更容易维护。