如何实现类中rand/randc字段的差异化随机化次数?
实现方法及可行性分析
完全可行,你可以通过两种方式实现需求:addr仅随机一次,data随机三次。之前直接repeat(3)调用s.randomize()无效,是因为每次调用默认会随机所有rand/randc字段,导致addr被重复随机。
方法一:指定随机化变量列表
每次调用randomize()时明确指定要随机的变量,第一次同时随机addr和data,后续仅随机data:
class my_class; rand bit [31:0] addr; rand bit [31:0] data; endclass module test; initial begin my_class s = new(); // 第一次随机addr和data s.randomize(addr, data); $display("第1次:Addr=0x%0h, Data=0x%0h", s.addr, s.data); // 后续两次仅随机data repeat(2) begin s.randomize(data); $display("第%0d次:Addr=0x%0h, Data=0x%0h", $unsigned($time/10)+2, s.addr, s.data); end end endmodule
方法二:禁用addr的随机化
第一次随机后,通过rand_mode(0)关闭addr的随机化属性,后续调用randomize()时只会随机未被禁用的data:
class my_class; rand bit [31:0] addr; rand bit [31:0] data; endclass module test; initial begin my_class s = new(); // 第一次随机所有变量 s.randomize(); $display("第1次:Addr=0x%0h, Data=0x%0h", s.addr, s.data); // 禁用addr的随机化 s.addr.rand_mode(0); // 后续两次随机,addr保持不变 repeat(2) begin s.randomize(); $display("第%0d次:Addr=0x%0h, Data=0x%0h", $unsigned($time/10)+2, s.addr, s.data); end end endmodule
两种方法都能实现需求,你可以根据代码风格选择:方法一更直观,明确控制每次随机的变量;方法二更适合需要长期保持addr不变的场景。
内容的提问来源于stack exchange,提问作者Abhishek
相关产品推荐
相关产品推荐

