System verilog 如何在一个类中只随机化一个变量?

System verilog 如何在一个类中只随机化一个变量?,system-verilog,System Verilog,我有以下课程 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; };

我有以下课程

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类;
随机位[2:0]模式;
随机位[2:0]模式循环;
约束范围{
模式>=2;
模式<6;
};
约束范围{
模式循环>=2;
模式周期<6;
};
末级

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

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

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

或者,如果希望
mode\u cylic
range\u cylic
范围内具有特定值,请将
一起使用:

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=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=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 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

或者,如果希望
mode\u cylic
range\u cylic
范围内具有特定值,请将
一起使用:

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=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=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

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

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

std::randomize(obj.mode);
必须使用带有{expressions}
约束的
添加要使用的任何约束

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

obj.randomize(mode);
但是,所有类约束必须仍然成功,因此
mode\u cylic
必须已经有一个值2-5,或者您需要使用

obj.range_cylic.constraint_mode(0);
您可以使用
rand_mode()
执行类似的操作,以关闭不希望随机的随机变量

obj.randomize(mode);
我会使用
rand/constraint\u mode()
关闭一个变量或约束,而不是尝试关闭除一个之外的所有变量或约束。当您开始向测试台添加更多变量/约束时,维护变得非常困难


尝试使用
std:randomize
或更好的方法,将类与要单独随机化的对象分开。

在随机化类和仅随机化某些变量时必须小心,因为约束与变量分开停用。对于类随机化,所有活动约束都必须成功

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

std::randomize(obj.mode);
必须使用带有{expressions}
约束的
添加要使用的任何约束

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

obj.randomize(mode);
但是,所有类约束必须仍然成功,因此
mode\u cylic
必须已经有一个值2-5,或者您需要使用

obj.range_cylic.constraint_mode(0);
您可以使用
rand_mode()
执行类似的操作,以关闭不希望随机的随机变量

obj.randomize(mode);
我会使用
rand/constraint\u mode()
关闭一个变量或约束,而不是尝试关闭除一个之外的所有变量或约束。当您开始向测试台添加更多变量/约束时,维护变得非常困难


尝试使用
std:randomize
或者更好的方法,将您的类与要单独随机化的对象分开。

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