Randomizing Object Handle
作者:互联网
您可以将对象句柄声明为“rand”。在这种情况下,该对象的所有变量和约束都是随机的。随机化不会修改实际的对象句柄。此外,对象句柄不能声明为“randc”。下面是一个例子:
class child; rand bit [7:0] data; endclass class parent extends child; rand bit [7:0] addr; rand child ch = new ( ); //object handle is 'rand' endclass module tb; int i; parent pp = new ( ); initial begin for (i=0; i < 4; i++) begin pp.randomize( ); $display("Parent addr = %h Child data = %h", pp.addr, pp.ch.data); end end endmodule
模拟结果:
Compiler version S-2021.09; Runtime version S-2021.09; Aug 17 00:35 2022
Parent addr: 8f Child data: 11
Parent addr: 97 Child data: 16
Parent addr: de Child data: f3
Parent addr: 4f Child data: b5
V C S S i m u l a t i o n R e p o r t
“child”类有一个 rand 变量“addr”。 “父”类扩展了“子”类,并添加了一个名为“数据”的 rand 变量。现在,我们用名为“ch”的对象句柄在“parent”类中实例化“child”类。然后我们随机化对象句柄“ch”,如代码所示。接下来,当我们在模块“tb”中实例化类“parent”并将其随机化(pp.randomize())时,它不仅会随机化其属性,还会随机化类“child”的属性。因此,您在模拟日志中看到“addr”(属于“parent”类)和“data”(属于“child”类)都是随机的。显然,如果“ch”没有声明为rand,它的属性就不会被随机化。示例如下:
1 class child; 2 rand bit [7:0] data; 3 endclass 4 class parent extends child; 5 rand bit [7:0] addr; 6 rand child ch = new ( ); //object handle is 'rand' 7 endclass 8 module tb; 9 int i; 10 parent pp = new ( ); 11 initial begin 12 for (i=0; i < 4; i++) begin 13 pp.randomize( ); 14 $display("Parent addr = %h Child data = %h", pp.addr, 15 pp.ch.data); 16 end 17 end 18 endmodule
模拟结果:
Compiler version S-2021.09; Runtime version S-2021.09; Aug 17 00:38 2022
Parent addr: 8f Child data: 00
Parent addr: 97 Child data: 00
Parent addr: de Child data: 00
Parent addr: 4f Child data: 00
V C S S i m u l a t i o n R e p o r t
标签:rand,child,Randomizing,Handle,addr,Object,pp,Child,data 来源: https://www.cnblogs.com/xiangtianxiao/p/16594720.html