首页 > 解决方案 > 有没有一种方法可以根据另一个变量的随机化结果来约束一个类中的随机变量?

问题描述

我需要随机化变量rA并将变量设置rB为 1'b1 如果rA== 1'b1 或随机化如果rA== 1'b0。这是我正在尝试的:

class randomizedVars;
    rand bit rA;
    rand bit rB;
    constraint cB {
        rB == 1'b1;
    }
    task changeConstraints();
        if (this.rA == 1'b1)
            begin
            this.cB.constraint_mode(1); // turn on the constraint for rB
            this.rA.rand_mode(0); // Disable rA from being randomized
            this.randomize(); // Rerandomize to force rB to meet its constraint ?
            this.rA.rand_mode(1); // Reenable rA to be randomized later
            this.cB.constraint_mode(0); // turn off the constraint for rB for later
            end
         else
            this.cB.constraint_mode(0);
    endtask
endclass

这种方法似乎有效,但我主要只是想知道是否有“正确”的方法来做到这一点。我觉得这个方法好像是蛮力和难度方法。更糟糕的是,我需要在每次随机化后调用任务,这让我觉得好像有一种我没有看到的方法。

为了清楚起见,我的预期结果是,当rA被随机化且等于 1 时,rB将被强制为 1。如果rA被随机化且等于 0,那么rB也将被随机化。我的实际结果与此相符。只是想知道是否有一种方法可以做到这一点,而不必在每次.randomize()方法调用后调用任务。

标签: oopsystem-verilog

解决方案


您可以通过使用不同的约束并删除任务来简化代码。

class randomizedVars;
    rand bit rA;
    rand bit rB;

    constraint cB {
        solve rA before rB;
        (rA == 1) -> (rB == 1);
    }
endclass

module tb;

randomizedVars c;

initial begin
    c = new();
    repeat (8) begin
        c.randomize();
        $display("a=%b b=%b", c.rA, c.rB);
    end    
end

endmodule

这是一个打印输出的示例:

a=0 b=0
a=0 b=1
a=1 b=1
a=1 b=1
a=0 b=0
a=1 b=1
a=0 b=0
a=0 b=1

如果rA被随机选择为1,则rB强制为1;否则,rB将是随机的。


推荐阅读