std :: randomize和基于类的随机化之间的区别

时间:2015-12-22 09:05:58

标签: system-verilog verification uvm

选项A和选项B之间有什么区别

选项A:

sucess = std::randomize(type_l) with { 
   type_l inside { A ,B ,C};
   type_l dist { A := 2 ,B := 5 ,C := 4 }; 
};

if(  sucess == 0 ) begin
   `uvm_fatal("TEST_CFG", "type_l randomization failed")
end

选项B:

class gen_type;

   enum_type type_l;

   constraint type_c{ 
      type_l inside { A ,B ,C};
      type_l dist { A := 2 ,B := 5 ,C := 4 }; 
   };       
endclass

3 个答案:

答案 0 :(得分:0)

这里选项A 是内联约束的一个示例,其中一个可以随机化类或模块或程序块的局部变量,而不将其声明为rand或{{1 }}。

虽然选项B 是对象变量随机化的示例。在此构造中,您必须声明一个变量,您希望将其随机化为randcrand(此处,您尚未将枚举变量声明为randc或{{1} },所以它会给出一个错误。)

有关详细信息,请参阅以下链接。 http://forums.accellera.org/topic/1235-stdrandomize-vs-randomize-vs-thisrandomize-and-scope/

答案 1 :(得分:0)

基本区别在于std::randomize是一个函数而不是类方法,而class::randomize是一个类方法。 randomize函数可用于任何变量,任何约束都必须是内联约束。

randomize类方法允许您为类的所有实例提供和控制约束。它将始终使用类中指定的约束以及您提供的任何可选内联约束。 randomize方法在进行随机化之前也调用pre_randomize方法,之后调用post_randomize

所以:

选项A:

enum_type type_1;
std::randomize(type_1); // No constraints

选项B:

gen_type a;
a.randomize(); // Use constraints specified in class. Call pre/post_randomize

答案 2 :(得分:0)

选项A

  • 实际上不是随机化,而是内联方法调用 约束。
  • 你不能修改那个约束,你没有 控制它。

选项B

  • 实际上是随机化。您需要添加 rand randc type1声明,让它随机化。
  • 您可以完全控制随机化。
  • 您可以通过constraint_mode方法打开/关闭约束。
  • 您可以通过rand_mode方法打开/关闭type1的随机化。