You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现类中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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 10:29:59