systemverilog 语法

1.fork join

systemverilog 语法_第1张图片

 

 

 

 

 

 

 

 

 

 

2.使用rand_mode()禁止随机变量

rand_mode()方法能用于控制随机变量是否有效。当一个随机变量是被禁止的时候,如同没有被声明为rand或者randc一样。无效变量不会被randomize()方法随机化,它们的值等同非随机变量,也称为状态变量。所有的随机变量初始都是有效、使能的。

rand_mode()方法的语法如下所示:

  task object[.random_variable]::rand_mode( bit on_off );
  

或者:

  function int object.random_variable::rand_mode();
  

object为指向定义了随机变量的对象的指针的任意表达式。

random_variable为操作随机变量的名称。假如没有指定(只在作为task调用时允许),将作用到指定对象内所有的随机变量。

当作为任务调用时,rand_mode方法的输入参数决定执行的操作行为如 表.18-1 所示。

表 18.1. rand_mode参数表
取值 意义 描述
0 OFF 禁止指定的随机变量,使其在后续randomize()方法中不被随机化。
1 ON 使能指定的随机变量,使其在后续randomize()方法中被随机化。

对于unpacked数组变量,random_variable可以使用索引指定单个数组单元,忽略索引会导致数组所有单元受操作影响。

对于unpacked结构变量,random_variable可以使用成员指定单个结构成员,忽略成员会导致结构所有成员受操作影响。

假如随机变量是对象的句柄,那么仅仅变量的模式被改变,而不是对象中随机变量的模式(参见 18.5.8 中的global约束)。

如果指定变量在类的层次结构中不存在,或者尽管存在但是并没有被声明为rand或者randc,编译器应当报告错误。

当作为函数调用时,rand_mode()返回某个指定随机变量的当前活动状态。返回1表示变量是活动的,打开的;如果返回0表示变量是禁止的,关闭的。

rand_mode()的函数形式仅仅接受单个变量;因此如果指定变量是unpacked数组,必须通过索引选择单个数组单元。

举例:

  class Packet;
    rand integer source_value, dest_value;
    ... other declarations
  endclass
  int ret;

  Packet packet_a = new;
  // 关闭对象内的所有变量
  packet_a.rand_mode(0);
  // ... other code
  // Enable source_value
  packet_a.source_value.rand_mode(1);
  ret = packet_a.dest_value.rand_mode();
  

这个例子首先禁止对象packet_a中的所有随机变量,然后使能source_value变量。最后把ret变量设置成dest_value变量中取出的活动状态。

方法rand_mode()是内建的,不能被重载。

如果随机变量声明为静态的static, 变量的rand_mode状态应当也是静态的。举例来说,如果rand_mode()被设置成禁止的,该随机变量在基类的任何一个实例中都是禁止的。

 

 

 

3.使用constraint_mode()控制约束

constraint_mode()方法能用于控制约束是否有效。当一个约束被禁止的时候,不会被randomize()方法考虑。所有的约束初始都是有效、使能的。

constraint_mode()方法的语法如下所示:

  task object[.constraint_identifier]::constraint_mode( bit on_off );
  

或者:

  function int object.constraint_identifier::constraint_mode();
  

object为指向约束的句柄的任意表达式。

constraint_identifier为操作约束块的名称。约束名称可以是类层级结构中的任意约束块。假如没有指定(只在作为task调用时允许),将作用到指定对象内所有约束。

当作为任务调用时,constraint_mode方法的输入参数决定执行的操作行为如表18-2 所示。

表 18.2. constraint_mode参数表
取值 意义 描述
0 OFF 禁止指定的约束块,使其在后续randomize()方法中不被考虑。
1 ON 使能指定的约束块,使其在后续randomize()方法中被考虑。

如果指定约束块在类的层次结构中不存在,编译器应当报告错误。

当作为函数调用时,constraint_mode()返回某个指定约束块的当前活动状态。返回1表示约束块是活动的;如果返回0表示约束块是被禁止的。

举例:

  class Packet;
    rand integer source_value;
    constraint filter1 { source_value gt 2 * m; }
  endclass

  function integer toggle_rand( Packet p );
    if ( p.filter1.constraint_mode() )
      p.filter1.constraint_mode(0);
    else
      p.filter1.constraint_mode(1);
    toggle_rand = p.randomize();
  endfunction
  

在这个例子中,函数toggle_rand首先检查指定包对象p内的约束filter1的当前活动状态,如果约束是使能的就禁止它;否则就激活它。最后函数调用randomize方法为变量source_value生成一个新的随机值。

方法constraint_mode()是内建的,不能被重载。


你可能感兴趣的:(IC验证,systemverilog)