受约束的随机验证提供了三种随机化的方法:
1. Randomize( )
2. Pre-randomize()
3. Post-randomize()
每个类都有一个内置的 randomize( ) 方法,它是一个虚函数,它为受约束的对象中的所有随机变量(rand 和 randc)生成随机值。
如果成功,则 randomize( ) 方法返回 1,否则返回 0,如下例所示。
sft sf;
sf = new( );
int success = sf.randomize( );
if (success == 1) …
应该始终测试 randomize() 的返回值。可以使用 assert(randomize()),但有时会全局关闭所有断言。在这种情况下,使用 if (randomize()) else $error(...);。当求解器失败时,一些工具会自动生成错误消息,但它不会停止模拟并且最终会得到一个未随机化的对象。
Pre-randomization and Post-randomization
在调用 randomize() 时,pre_randomize() 和 post_randomize() 分别在 randomize() 调用之前和之后被调用。用户可以覆盖这两种方法。 pre_randomize 函数可用于在对象随机化之前设置前置条件。 post_randomization 函数可用于在对象随机化后检查和执行后置条件。当 randomize() 被调用时,它首先调用 obj 上的 pre_randomize() 以及它所有被启用的随机对象成员。在计算和分配新的随机值之后,randomize() 调用 obj 上的 post_randomize() 以及它所有启用的随机对象成员。
请注意,randomize() 是内置的,不能被覆盖。
看一个例子,说明 pre_randomize() 和 post_randomize() 如何与子类一起工作。他们以什么顺序被调用?
class parent;
function void pre_randomize;
$display(" PARENT PRE_RANDOMIZATION ");
endfunction
function void post_randomize;
$display(" PARENT POST_RANDOMIZATION ");
endfunction
endclass
class Ex1 extends parent;
function void pre_randomize;
$display(" Ex1 PRE_RANDOMIZATION ");
endfunction
function void post_randomize;
$display(" Ex1 POST_RANDOMIZATION ");
endfunction
endclass
class Ex2 extends parent;
function void pre_randomize;
super.pre_randomize( ); //Call to super.
$display(" Ex2 PRE_RANDOMIZATION ");
endfunction
function void post_randomize;
super.post_randomize( ); //call to super.
$display(" Ex2 POST_RANDOMIZATION ");
endfunction
endclass
module TOP;
parent P = new( );
Ex1 E1 = new( );
Ex2 E2 = new( );
initial
begin
void'(P.randomize( ));
void'(E1.randomize( ));
void'(E2.randomize( ));
end
endmodule
仿真结果
Compiler version S-2021.09; Runtime version S-2021.09; Aug 28 03:30 2022
PARENT PRE_RANDOMIZATION
PARENT POST_RANDOMIZATION
Ex1 PRE_RANDOMIZATION
Ex1 POST_RANDOMIZATION
PARENT PRE_RANDOMIZATION
Ex2 PRE_RANDOMIZATION
PARENT POST_RANDOMIZATION
Ex2 POST_RANDOMIZATION
V C S S i m u l a t i o n R e p o r t
定义了三个类:“parent”类以及从“parent”扩展而来的“Ex1”和“Ex2”。每个类都有一个 pre_randomize( ) 和 post_randomize( ) 函数。请注意,“Ex2”首先在其 pre_randomize( ) 函数中调用 super.pre_randomize( )。同样,它也在其 post_randomize() 函数中首先调用 super.post_randomize()。
如果一个类是派生类,并且派生类中不存在用户定义的 pre_randomize( ) 和 post_randomize( ) 实现,则 pre_randomize( ) 和 post_randomize( ) 将分别自动调用 super.pre_randomize( ) 和 super .post_randomize()。看一个例子:
class parent;
function void pre_randomize;
$display(" PARENT PRE_RANDOMIZATION ");
endfunction
function void post_randomize;
$display(" PARENT POST_RANDOMIZATION ");
endfunction
endclass
class Ex1 extends parent;
endclass
module TOP;
Ex1 E1 = new();
initial
if (E1.randomize( )) $display ("PASS");
endmodule
仿真结果:
Compiler version S-2021.09; Runtime version S-2021.09; Aug 28 03:40 2022
PARENT PRE_RANDOMIZATION
PARENT POST_RANDOMIZATION
PASS
V C S S i m u l a t i o n R e p o r t
“Ex1”类继承自“parent”类,但没有定义 pre_randomize( ) 或 post_randomize( ) 函数。因此,当 E1(它是“Ex1”类的实例)被随机化时,它首先调用其“父”类的预随机化和后随机化函数,后者依次执行其预随机化和后随机化函数。这显示在仿真日志中。
请注意,预随机化和后随机化函数允许您对函数允许的任何功能进行建模。我只展示了 $display 来展示它们是如何被调用和锻炼的。但是您可以在随机化之前(pre)和随机化之后(post)拥有一个想要的有意义的功能。
标签:pre,方法,void,随机化,RANDOMIZATION,post,randomize From: https://www.cnblogs.com/fuqiangblog/p/16632892.html