【问题标题】:How to randomize only 1 variable in a class?如何在一个类中仅随机化 1 个变量?
【发布时间】:2021-03-28 12:42:17
【问题描述】:

我有以下课程

class ABC;


    rand bit[2 : 0] mode; 
    randc bit[2 : 0] mode_cylic;
    constraint range{

        mode >= 2;
        mode < 6;

    };

    constraint range_cylic{

        mode_cylic >= 2;
        mode_cylic < 6;

    };



endclass 

我有一个测试类ABC 的测试对象,我只想随机化该对象中的mode 变量。我该怎么做?

【问题讨论】:

    标签: system-verilog


    【解决方案1】:

    在随机化一个类并且只随机化某些变量时必须小心,因为约束是与变量分开停用的。对于类随机化,所有活动约束都必须成功。

    当您在一大组随机变量中只有一个或几个变量要随机化时,最简单的做法是使用内置的std::randomize 方法。这会随机化其参数中的变量,无论它们是否是类变量,并且不使用任何类约束。

    std::randomize(obj.mode);
    

    您要使用的任何约束都必须使用with {expressions} 约束添加。

    您可以做的另一件事是使用类 randomize 方法,同时只放置您想要随机化的变量。

    obj.randomize(mode);
    

    但是所有类约束仍然必须成功,所以mode_cylic 必须已经有一个值 2-5,或者你需要使用关闭约束

    obj.range_cylic.constraint_mode(0);
    

    您可以使用rand_mode() 执行类似的操作来关闭您不希望随机化的随机变量。

    我会使用rand/constraint_mode() 来关闭一个变量或约束,而不是尝试关闭除一个之外的所有内容。当您开始向测试平台添加更多变量/约束时,维护变得非常困难。

    尝试使用std:randomize 甚至更好,将您的类分成要单独随机化的对象。

    【讨论】:

    • 很好的答案,有没有办法使用 std::randomize() 与类内定义的约束,甚至当我尝试在类外将其外部化时是否可行?
    • 如果您要随机化的一个变量是类变量,则将考虑与该类对象关联的约束。返回并编辑您的问题并解释您只想随机化一个变量的情况可能会有所帮助。可能有另一种方法。见xyproblem.info
    【解决方案2】:

    一种方法是禁用您不想随机化的变量的随机化:

    class ABC;
        rand bit[2 : 0] mode; 
        randc bit[2 : 0] mode_cylic;
    
        constraint range{
            mode >= 2;
            mode < 6;
        }
    
        constraint range_cylic{
            mode_cylic >= 2;
            mode_cylic < 6;
        }
    endclass
    
    module tb;
        ABC abc = new();
        bit result;
        initial begin
            abc.range_cylic.constraint_mode(0);
            abc.mode_cylic.rand_mode(0);
            repeat (10) begin
                result = abc.randomize();
                $display("mode=%0d mode_cylic=%0d", abc.mode, abc.mode_cylic);
            end
        end
    endmodule
    

    请参阅 IEEE Std 1800-2017,第 18.8 节 使用 rand_mode() 禁用随机变量

    这是我得到的输出:

    mode=2 mode_cylic=0
    mode=2 mode_cylic=0
    mode=2 mode_cylic=0
    mode=4 mode_cylic=0
    mode=4 mode_cylic=0
    mode=2 mode_cylic=0
    mode=4 mode_cylic=0
    mode=3 mode_cylic=0
    mode=5 mode_cylic=0
    mode=4 mode_cylic=0
    

    或者,如果您希望mode_cylicrange_cylic 范围内具有特定值,请使用with

    initial begin
        repeat (10) begin
            result = abc.randomize() with { mode_cylic == 5; };
            $display("mode=%0d mode_cylic=%0d", abc.mode, abc.mode_cylic);
        end
    end
    

    这是我得到的输出:

    mode=2 mode_cylic=5
    mode=2 mode_cylic=5
    mode=2 mode_cylic=5
    mode=4 mode_cylic=5
    mode=4 mode_cylic=5
    mode=2 mode_cylic=5
    mode=4 mode_cylic=5
    mode=3 mode_cylic=5
    mode=5 mode_cylic=5
    mode=4 mode_cylic=5
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-11-25
      • 1970-01-01
      • 1970-01-01
      • 2011-12-13
      • 1970-01-01
      • 2020-01-26
      • 1970-01-01
      • 2015-05-16
      相关资源
      最近更新 更多