Ваш друг - две вещи:
i) ручка управления . Ручка управления - это переменная, которая рандомизируется для управления процессом рандомизации. Итак, давайте рандомизируем переменную, чтобы решить, хотим ли мы, чтобы массив data
был случайным, 55 или AA.
typedef enum {RANDOM, FIVE_FIVE, A_A} control_knob_t;
rand control_knob_t control_knob;
constraint dist_constraint { control_knob dist {RANDOM := 2, FIVE_FIVE := 1, A_A := 1}; }
ii) post_randomize
метод. Это SystemVerilog, а не UVM. post_randomize
вызывается после того, как произошла рандомизация класса, и позволяет вам что-то делать, когда произошла рандомизация. В этом случае мы позволим стандартной рандомизации рандомизировать длину массива data
, а затем введем значения data
в методе post_randomize
.
function void post_randomize;
case (control_knob)
RANDOM: foreach (data[i])
data[i] = $urandom_range(0,255);
FIVE_FIVE: foreach (data[i])
data[i] = 8'h55;
A_A: foreach (data[i])
data[i] = 8'haa;
endcase
endfunction
[MCVE]:
module M;
class C;
rand bit[7:0] data[];
typedef enum {RANDOM, FIVE_FIVE, A_A} control_knob_t;
rand control_knob_t control_knob;
constraint my_c { data.size() inside {[1:4]}; }
constraint dist_constraint { control_knob dist {RANDOM := 2, FIVE_FIVE := 1, A_A := 1}; }
function void post_randomize;
case (control_knob)
RANDOM: foreach (data[i])
data[i] = $urandom_range(0,255);
FIVE_FIVE: foreach (data[i])
data[i] = 8'h55;
A_A: foreach (data[i])
data[i] = 8'haa;
endcase
endfunction
endclass
C c;
initial
begin
c = new;
repeat (100)
begin
c.randomize;
$display("c = %p", c);
end
end
endmodule
https://www.edaplayground.com/x/2cPk