我需要隨機化變數 A 并將變數 B 設定為 1'b1 如果 A == 1'b1 或隨機化如果 A == 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() 方法呼叫后呼叫任務。
uj5u.com熱心網友回復:
您可以通過使用不同的約束并洗掉任務來簡化代碼。
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將是隨機的。
uj5u.com熱心網友回復:
您想要的稱為蘊涵約束(IEEE 1800-2017 SystemVerilog LRM中的第 18.5.6 節。
運算式->約束集
如果還可以寫成
如果(運算式)constraint_set
但第一個是首選,因為它是一個方程,而不是程式代碼。在任一情況下,當 LHS 運算式為真時,必須滿足 RHS 上的約束。
constraint cB {
(rA == 1) -> (rB == 1);
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/341843.html
