Random 在系统verilog中随机化dut参数

Random 在系统verilog中随机化dut参数,random,parameters,system-verilog,hdl,Random,Parameters,System Verilog,Hdl,我正在system verilog中为dut编写一个测试台,在现场,参数深度可能会发生变化,因此我一直在尝试找出如何随机化参数。当前设置为20,但范围为7到255。如有任何建议和帮助,将不胜感激 我知道你不能直接在脚本中随机化它,但我听说其他人是通过创建一个包来实现的,他们可以在测试的同时运行,可以插入随机值作为参数。不可能随机化参数值,因为这些值需要在细化时固定,随机化是一项运行时任务 我认为你的意思是,你可以创建一个小的SystemVerilog程序,它可以在一个类中对你的参数进行建模,随机

我正在system verilog中为
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软件),则可以从单个位置设置这些值并将其传递到模拟中


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

感谢您提供了有用的答案,但我们似乎正在通过线性减少所有参数大小,而不是随机减少