Corriente de modelado para permanecer en un rango particular durante un tiempo de simulación fijo

2

Soy un novato en SystemVerilog. Deseo saber cómo modelar una señal X de 8 bits para alcanzar cuatro niveles en ciertos intervalos de tiempo. Por ejemplo, deje que los valores legales de X sean de 40 a 80 (40 < X < 80)

  1. 40 - X - 50 para el 70% del tiempo de simulación: Estado 1
  2. 50 - X - 60 para el 10% del tiempo de simulación: Estado 2
  3. 60 - X - 70 para el 10% del tiempo de simulación: Estado 3
  4. 70 - X - 80 para el 10% del tiempo de simulación: Estado 4

2 respuestas

1

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
    
respondido por el stanri
1

La forma más sencilla de implementar esto es usar $ al azar y comparar con cuatro umbrales. $ random devolverá un entero de 32 bits aleatorio 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 siempre que desee que cambie el nivel de la señal: cada ciclo de reloj o n ciclos de reloj, o en un retardo que sea independiente del reloj.

    
respondido por el alex.forencich

Lea otras preguntas en las etiquetas