Yo usaría un generador de números aleatorios para generar un número aleatorio y luego asignarlo a un estado basado en su valor.
Por ejemplo, si genero un número aleatorio entre 1 y 100, entonces si está por debajo de 70, pasa al estado 1, por debajo de 80 pasa al estado 2, por debajo de 90 pasa al estado tres y por debajo de 100 pasa al estado 4 .
En este ejemplo, usaré la función aleatoria incorporada SV, pero puedes usar cualquier generador de números aleatorios que desees para la síntesis.
Aquí hay un ejemplo primitivo:
module tb;
reg clk = 0;
reg rst;
// Clock definition
localparam clk_period = 10000; // 100 Mhz
always begin
clk = #(clk_period/2) ~clk;
end
// reset definition
initial begin
rst = 1;
#(25*clk_period);
@(posedge clk);
rst = 0;
end
enum {STATE_1,STATE_2,STATE_3,STATE_4} state;
reg [7:0] random_num;
always@(posedge clk) begin
if (rst == 1) begin
random_num <= $random % 50 + 50;
state <= STATE_1;
end
else begin
random_num <= $random % 50 + 50;
if (random_num < 70)
state <= STATE_1;
else if (random_num < 80)
state <= STATE_2;
else if (random_num < 90)
state <= STATE_3;
else if (random_num < 100)
state <= STATE_4;
end
end
endmodule