【问题标题】:How to randomize 1 of 100 variables如何随机化 100 个变量中的 1 个
【发布时间】:2021-05-07 13:23:03
【问题描述】:

假设我们有一个包含一堆随机变量的类(大约 100 个rand 变量)。现在,我只想随机化该类中的一个变量,其余变量应该相同。我该怎么做?

class rand_var extends vmm_data;
    rand bit abc;
    rand bit [3:0] cde;
    rand bit en;
    ...
endclass

现在从一项任务中,我只想随机化 abc,而不是 rand_var 的任何其他变量。

task custom_task();
    rand_var rand1;
    rand1 = new config

    if (config.randomize () with {

    }) 
    else $display("randomization failed");

【问题讨论】:

    标签: verilog system-verilog


    【解决方案1】:

    随机化单个变量的最简单方法是使用std::randomize 而不是类的randomize 方法。

    task custom_task();
        rand_var config;
        config = new();
    
        if (std::randomize(config.abc) with {
        /* constraints on config.abc */
        }) 
        else $display("randomization failed");
    

    您也可以在调用randomize 类方法时使用所谓的内联随机化控制,如

    if (!config.randomize(abc)) $display("randomization failed");
    

    但是这样做时你必须小心,因为config 对象中的所有活动类约束仍然必须得到满足,即使变量没有被随机化。

    【讨论】:

    • 谢谢,戴夫。如果我想从多个变量中随机化两个变量,如果有办法做到这一点怎么办?
    • 您可以将所有变量作为参数列表添加到randomize
    【解决方案2】:

    一种方法是调用randomize 并仅传递您想要随机的变量。请参阅 IEEE Std 1800-2017,第 18.11 节 在线随机变量控制。这是一个完整的例子:

    class rand_var;
        rand bit abc;
        rand bit [3:0] cde;
        rand bit en;
    endclass
    
    module tb;
    
    task custom_task();
        rand_var rand1;
        rand1 = new();
        if (!rand1.randomize(abc)) $display("randomization failed");
        $display("%b %d %b", rand1.abc, rand1.cde, rand1.en);
    endtask
    
    initial repeat (10) custom_task();
    
    endmodule
    

    输出:

    1  0 0
    1  0 0
    1  0 0
    0  0 0
    1  0 0
    1  0 0
    0  0 0
    1  0 0
    1  0 0
    0  0 0
    

    对于每个任务调用,只有 abc 是随机的。


    另见How to randomize only 1 variable in a class?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-01-26
      • 2018-12-22
      • 2011-12-13
      • 2022-09-24
      • 2012-11-25
      • 2014-01-19
      • 2014-01-23
      • 1970-01-01
      相关资源
      最近更新 更多