Soy un novato en SystemVerilog. Deseo saber cómo modelar una señal X de 8 bits para lograr cuatro niveles para ciertos rangos de tiempo. Por ejemplo, sean los valores legales de X de 40 a 80 (40 < X < 80)
Usaría un generador de números aleatorios para generar un número aleatorio y luego lo asignaría a un estado en función de su valor.
Por ejemplo, si genero un número aleatorio entre 1 y 100, 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.
Voy a usar la función aleatoria incorporada SV en este ejemplo, pero puede usar cualquier generador de números aleatorios que desee para la síntesis.
He aquí 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
La forma más sencilla de implementar esto es usar $random y compararlo con cuatro umbrales. $random devolverá un entero aleatorio de 32 bits de 0 a 2^32-1, así que simplemente segmente esto en cuatro partes, vea en cuál cae el resultado y establezca su señal en consecuencia. Evalúe esto cada vez que desee que cambie el nivel de la señal: cada ciclo de reloj o n ciclos de reloj, o en un retraso que sea independiente del reloj.
alex.forencich
alex.forencich
envidia_inteligencia
envidia_inteligencia