如何在 class 中仅随机化 1 个变量?

How to randomize only 1 variable in a class?

我有以下class

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 

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

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

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 标准 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_cylic 具有 range_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

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

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

std::randomize(obj.mode);

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

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

obj.randomize(mode);

然而,所有 class 约束仍必须成功,因此 mode_cylic 必须已经具有值 2-5,或者您需要使用

关闭约束
obj.range_cylic.constraint_mode(0);

您可以使用 rand_mode() 做类似的事情来关闭您不想随机化的随机变量。

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

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