Sincronización de las señales del banco de pruebas Verilog con el reloj RTL

0

Me han dado una tarea interesante. Mi tarea fue diseñar un contador up_down de 4 bits que tenga dos señales de control, up_down y load. El up_down decide el tiempo en que el contador debe contar hacia arriba o hacia abajo (up_down = 1'b1 up-count y up_down = 1'b0 down-count). La señal de carga es cargar los datos de 4 bits en el contador. Pude diseñar y verificar el código en rtl y en el banco de pruebas.

Pero ahora se me notifica que me asegure de que las señales de entrada de mi banco de pruebas lleguen después de la fecha del reloj en RTL. Eso significa que mis señales de carga y de subida / bajada deben llegar después del límite positivo del reloj RTL. Por favor encuentra mi rtl y testbench. Me piden que haga algo en el banco de pruebas y escriba una lógica en el banco de pruebas para asegurarme de que mis señales lleguen más tarde. Necesitaría ayuda en esto. Por favor, responde.

Mi código RTL:

module up_down_counter(
  input clock,
  input reset,
  input load,
  input up_down,            //up_down = 1'b1,upcounter; up_down=1'b0,down_counter
  input [3:0] data,
  output [3:0] counter
  );

  reg [3:0] counter_reg;  


  always@(posedge clock or posedge reset)
  begin

    if(reset == 1'b1)
      begin
      counter_reg <= 4'b0000;                
      end      
    else
       begin      
        if (up_down == 1'b1)
              begin
             if(load == 1'b1)
                begin
                counter_reg <= data;
                end
             else 
                begin
            counter_reg <= counter_reg + 4'b0001;
            end      

          end    

        else 
              begin
             if(load == 1'b1)
               begin
               counter_reg <= data;
               end
             else 
               begin
           counter_reg <= counter_reg - 4'b0001; 
           end       
          end        
        end
 end  


  assign counter = counter_reg; 

  endmodule

mi banco de pruebas:

module tb_up_down_counter;

  reg clock;
  reg reset;
  wire [3:0] counter; 
  reg up_down;
  reg load;
  reg [3:0] data;   

  up_down_counter dut(
  .clock(clock),
  .reset(reset),
  .load(load),
  .data(data),
  .up_down(up_down),
  .counter(counter)
  );

  initial
    begin
    clock = 1'b0;
    forever #50 clock = ~clock;
    end       


    initial 
     begin
    reset <= 1'b0;
    load  <= 1'b0;
    up_down <= 1'b0;    


    data <= 4'd0; 

    repeat(5)
    @(posedge clock);     
    reset <= 1'b1;

    repeat(5)
    @(posedge clock); 
     reset <= 1'b0; 

     repeat(10)
    @(posedge clock);
    up_down <= 1'b1;

    repeat(5)
    @(posedge clock);
    load <= 1'b1;    

    repeat(10)
    @(posedge clock);
    data <= 4'd3;    


    repeat(5)
    @(posedge clock);
    up_down <= 1'b0;

    repeat(5)
    @(posedge clock);
    load <= 1'b0;

    repeat(5)
    @(posedge clock);
    load <= 1'b1; 

    repeat(10)
    @(posedge clock);
    data <= 4'd5;   

    repeat(5)
    @(posedge clock);
    up_down <= 1'b1;   

    repeat(5)
    @(posedge clock);
    reset <= 1'b1;

    repeat(10)
    @(posedge clock);
    reset <= 1'b0;    

     repeat(10)
    @(posedge clock);
    load <= 1'b1;

    repeat(10)
    @(posedge clock);
    data <= 4'd8;

    repeat(10)
    @(posedge clock);
    data <= 4'd15;

    repeat(10)
    @(posedge clock);
    data <= 4'd12;



    #5000 $finish;
    end


 initial
 begin
 $shm_open("waves.shm");
 $shm_probe(tb_up_down_counter,"AC");
 end




 endmodule
    
pregunta Digital_Treasure

2 respuestas

0

Algunos comentarios de alguien que ha escrito cientos de contadores:
En primer lugar, las señales de control no deben llegar sincrónicamente. Sin embargo, me opongo a que la frase [control] las señales lleguen después del límite positivo del reloj . Esto da la impresión de que la lógica digital debe controlarse mediante señales con algún retraso artificial. La solución que utiliza una etiqueta hash enfatiza esto aún más.

En la vida real, las señales de control deben llegar y ser estables antes del tiempo de configuración del registro. Por lo tanto, en la ingeniería ASIC / FPGA, la frase que se usa normalmente es la señal debe llegar antes del borde del reloj .

Esto se logra mediante el retardo de reloj a Q de un registro incrementado por el retardo de cable. Puede haber (a menudo hay) una lógica adicional detrás del registro que aumenta la demora.

En tu banco de pruebas puedes hacerlo de esta manera:

reg  tb_load; // This is the one use use in your test bench
reg  load;    // This one goes to you DUT (Device Under Test)

always @(posedge clk or posedge reset)
if (reset)
   load <= 1'b0;
else
   load <= tb_load; 

Algunos consejos para su código:
1 / La señal de carga es dominante. Su código se vuelve más simple y fácil de leer si trata con eso primero:

if (load)
  ...
else
  if (

2 / No use el nombre 'up_down'. Su contador cuenta si la señal es alta, así que llámela, por ejemplo. 'count_up'.

    
respondido por el Oldfart
0

Puedes agregar un retraso con un hashtag #, por lo que

repeat(5) begin
     @(posedge clock);     
end
#10 reset <= 1'b1;

Afirmará el reinicio 10 nS (dependiendo de la configuración de tu simulador, podría ser pS o uS) después del borde final del reloj

    
respondido por el pscheidler

Lea otras preguntas en las etiquetas