Random 在系统verilog中随机化dut参数
我正在system verilog中为Random 在系统verilog中随机化dut参数,random,parameters,system-verilog,hdl,Random,Parameters,System Verilog,Hdl,我正在system verilog中为dut编写一个测试台,在现场,参数深度可能会发生变化,因此我一直在尝试找出如何随机化参数。当前设置为20,但范围为7到255。如有任何建议和帮助,将不胜感激 我知道你不能直接在脚本中随机化它,但我听说其他人是通过创建一个包来实现的,他们可以在测试的同时运行,可以插入随机值作为参数。不可能随机化参数值,因为这些值需要在细化时固定,随机化是一项运行时任务 我认为你的意思是,你可以创建一个小的SystemVerilog程序,它可以在一个类中对你的参数进行建模,随机
dut
编写一个测试台,在现场,参数深度
可能会发生变化,因此我一直在尝试找出如何随机化参数。当前设置为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
在开始编译真正的测试台之前,您需要调用这个函数。测试台将导入该软件包,并将DUT的参数设置为:
module testbench;
my_design dut #(my_params::DEPTH) (...);
endmodule
如果您只有一个参数(与相互关联的多个参数相反),那么在SystemVerilog中执行随机化可能没有意义,因为脚本应该足够了。不可能随机化参数值,因为这些参数值需要在细化时固定,随机化是一项运行时任务 我认为你的意思是,你可以创建一个小的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中执行随机操作可能没有意义,因为脚本应该足够了。以下是我找到的一些解决方案,不确定它是否是您要找的:
简而言之:
您可以创建一个类,其中包含表示要随机化的参数值的字段。然后在一个新模块中实例化它,该模块将该类随机化,并输出一个带有随机参数值的新包文件。最后,您将使用其余模块编译该包。以下是我找到的一些解决方案,不确定它是否是您想要的:
简而言之:
您可以创建一个类,其中包含表示要随机化的参数值的字段。然后在一个新模块中实例化它,该模块将该类随机化,并输出一个带有随机参数值的新包文件。最后,您将与其他模块一起编译该包。正如其他答案所述,参数值必须在精化时解析。通常,它们被传递到模拟器命令行:
vsim-gDEPTH=42
我认为使用SystemVerilog约束解算器随机化参数没有任何好处。从SystemVerilog中写出一个包以提供给后续编译的麻烦表明出了问题。理想情况下,所有SystemVerilog代码都应该从精心设计的DUT中提取所选参数,因此不需要软件包*
。更新构建脚本可能更容易,例如:
vsim-gDEPTH=$(shuf-i7-255-n1)
显然,作为整体测试线束的一部分,这可以变得更通用。如果您需要参数的约束随机性(不太可能,但可能),那么您可以始终使用更强大的
这还有一个额外的优点,即如果您有其他配置值(例如,对于作为测试一部分执行的非SystemVerilog软件),则可以从单个位置设置这些值并将其传递到模拟中
*
尽管人们似乎经常使用包来共享参数,因为它可以是。同样,对于生成代码和写入文件,您可能会发现使用标准脚本语言将更强大,更易于维护。正如其他答案所述,参数值必须在细化时解析。通常,它们被传递到模拟器命令行:
vsim-gDEPTH=42
我认为使用SystemVerilog约束解算器随机化参数没有任何好处。从SystemVerilog中写出一个包以提供给后续编译的麻烦表明出了问题。理想情况下,所有SystemVerilog代码都应该从精心设计的DUT中提取所选参数,因此不需要软件包*
。更新构建脚本可能更容易,例如:
vsim-gDEPTH=$(shuf-i7-255-n1)
显然,作为整体测试线束的一部分,这可以变得更通用。如果您需要参数的约束随机性(不太可能,但可能),那么您可以始终使用更强大的
这还有一个额外的优点,即如果您有其他配置值(例如,对于作为测试一部分执行的非SystemVerilog软件),则可以从单个位置设置这些值并将其传递到模拟中
*
尽管人们似乎经常使用包来共享参数,因为它可以是。同样,对于生成代码和写入文件,您可能会发现使用标准脚本语言将更强大,更易于维护。感谢您提供了有用的答案,但我们似乎正在通过线性减少所有参数大小,而不是随机减少