SystemVerilog禁用随机化

可以使用rand_mode方法调用禁用类中变量的随机化。这与用于禁用约束的constraint_mode()方法非常相似。 因此,将禁用的随机变量与未声明为rand或randc一样对待。

rand_mode可以同时作为函数和任务来调用。 如果将变量作为函数调用,则将返回其当前状态。

 // Disables randomization of variable [variable_name] inside [class_object] class
  [class_object].[variable_name].rand_mode (0);   
 
  // Enables randomization of variable [variable_name] inside [class_object] class
  [class_object].[variable_name].rand_mode (1);   

让我们首先尝试在没有rand_mode的情况下与禁用约束的情况进行比较。

不使用rand_mode()

缺省情况下,启用为声明为rand和randc的变量在下面的示例中显示为可见。

// Create a class that contains random variables
class Fruits;
  rand bit [3:0] var1;
  rand bit [1:0] var2;
endclass
 
module tb;
  initial begin
    // Instantiate an object of the class
    Fruits f = new(); 
 
    // Print values of those variables before randomization
    $display ("Before randomization var1=%0d var2=%0d", f.var1, f.var2);
 
    // rand_mode()作为函数返回给定变量的状态
    //如果启用,则打印一条语句
    if (f.var1.rand_mode())
      if (f.var2.rand_mode())
          $display ("Randomization of all variables enabled");
 
    // 随机化类对象,从而随机化使用rand / randc关键字声明的所有内部变量
    f.randomize();
 
    // Print the value of these variables after randomization
    $display ("After randomization var1=%0d var2=%0d", f.var1, f.var2);
  end
endmodule
 
Simulation Log
ncsim> run
Before randomization var1=0 var2=0
Randomization of all variables enabled
After randomization var1=15 var2=3
ncsim: *W,RNQUIE: Simulation is complete.

使用rand_mode()之后

接下来,我们将禁用var1,并查看它如何影响该变量的随机化。

// Create a class that contains random variables
class Fruits;
  rand bit [3:0] var1;
  rand bit [1:0] var2;
endclass
 
module tb;
  initial begin
    Fruits f = new(); 
    $display ("Before randomization var1=%0d var2=%0d", f.var1, f.var2);
 
    // Turn off randomization for var1
    f.var1.rand_mode (0);
 
    // Print if var1 has randomization enabled/disabled
    if (f.var1.rand_mode())
      $display ("Randomization of var1 enabled");
    else
      $display ("Randomization of var1 disabled");
 
    f.randomize();
 
    $display ("After randomization var1=%0d var2=%0d", f.var1, f.var2);
  end
endmodule
 
Simulation Log
ncsim> run
Before randomization var1=0 var2=0
Randomization of var1 disabled
After randomization var1=0 var2=3
ncsim: *W,RNQUIE: Simulation is complete.

接下来,我们将在调用rand mode()时跳过提及变量名。

// Create a class that contains random variables
class Fruits;
  rand bit [3:0] var1;
  rand bit [1:0] var2;
endclass
 
module tb;
 
  initial begin
    Fruits f = new(); 
    $display ("Before randomization var1=%0d var2=%0d", f.var1, f.var2);
 
    // Turns off randomization for all variables
    f.rand_mode (0);    
 
    if (! f.var1.rand_mode())
      if (! f.var2.rand_mode())
        $display ("Randomization of all variables disabled");
 
    f.randomize();
 
    $display ("After randomization var1=%0d var2=%0d", f.var1, f.var2);
  end
endmodule
 
Simulation Log
ncsim> run
Before randomization var1=0 var2=0
Randomization of all variables disabled
After randomization var1=0 var2=0
ncsim: *W,RNQUIE: Simulation is complete.

参考文献:
【1】https://www.chipverify.com/systemverilog/systemverilog-disable-randomization

发布了71 篇原创文章 · 获赞 8 · 访问量 7376

猜你喜欢

转载自blog.csdn.net/qq_43042339/article/details/104589026