Modelado de corriente para permanecer en un rango particular durante un tiempo de simulación fijo

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)

  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
Realmente no está claro qué es lo que quieres hacer aquí.
Todavía no está claro a qué te refieres. ¿Quiere permanecer en el estado 1 durante 7 ciclos de reloj, luego pasar al estado 2 durante 1 ciclo de reloj, luego al 3 durante 1 ciclo, luego al 4 durante 1 ciclo y luego repetir? ¿O quiere hacer una caminata aleatoria que pase el 70 % del tiempo en el estado 1 y el 10 % del tiempo en cada uno de los otros 3? ¿Algo completamente diferente?
@alex Necesito un paseo al azar. He quitado la etiqueta de los relojes.
@alex, eliminando el metacomentario.

Respuestas (2)

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
@Stacey-rst no declarado.
este no es un ejemplo completo, tendría que integrarse en un banco de pruebas existente.
acordado. También debemos tener en cuenta si rst puede ser activo-alto o activo-bajo. Solo sugiriendo.
Se agregó en el código completo del banco de pruebas y se cambió a $random porque xilinx aún no puede simular $urandom.

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.