Test_bench en Verilog usando Tarea

1

He escrito testbench en verilog. Todos los casos de prueba definidos en la tarea funcionan bien independientemente, pero cuando intento ejecutar ambas tareas, se obtiene el resultado adecuado para la primera tarea en la tarea tarea pero no para otra tarea. El estímulo permanece allí para otra tarea también. Quiero usar la entrada en la tarea como localmente en lugar de definir globalmente. ¿Cómo debo definir la entrada en el argumento en la tarea para que la entrada se dé de forma independiente?

module tb();
  reg data_i_t;
  reg dcsel_t;
  reg clk ;
  reg reset_t;
  reg reset;
  reg read_t;
  reg xlat_t;

  initial begin
#2 reset =0;
task_operation();
#100000 $finish;
  end

  task task_operation();

    begin
      exp_case_2a(data_i_t,reset_t,read_t,dcsel_t,xlat_t,data_out_1);    
  exp_case_2b(data_i_t,reset_t,read_t,dcsel_t,xlat_t,data_out_1);       
    end
  endtask 

  task exp_case_2a;
    input data_i;
    input reset;
    input read;
    input dcsel;
    input xlat;     
    output reg [47:0] data_o;
    begin
      repeat(47) begin @(posedge clk)
    data_i = 1;
    reset   = 0;
    read = 1;
    dcsel = 0;
    xlat = 1;
    data_o = Data_out;
      end
      #5250  compare_data_2(data_out_tb);    
    end 
  endtask 

  task exp_case_2b
    input data_i;
    input reset;
    input read;
    input dcsel;
    input xlat;     
    output reg [47:0] data_o;
    begin
      repeat(47)begin @(posedge clk)
        data_i = 1;
        reset  = 0;
        read   = 0;
        dcsel  = 0;
        xlat   = 1;
        data_o = Data_out;          
      end
      #5250 compare_data_2(data_out_tb);
    end 
  endtask 

/ * ........... SCORE-BOARD ..............
   tarea compare_data_2;
      entrada [47: 0] exp_data;

  begin        
 if(exp_data == 'comp_data_1 )
   begin
       'INFO("TEST PASSSED",$time);
      $display(" exp_data  : %h ",exp_data);
   end
 else
   begin
       'ERROR("TEST FAILED",$time);
      $display(" exp_data : %h ",exp_data); 
   end 
  end

endtask

    
pregunta Manzer

1 respuesta

1

Sería útil si pudiera aclarar esta declaración:

  

¿Cómo debo definir la entrada en el argumento de la tarea para que la entrada se dé de forma independiente?

Una tarea definida como:

task display_redux
  input [31:0] a_number;
  begin
    $display("display_redux was sent : %d", a_number);
  end
endtask

Se puede llamar con:

display_redux(20);
integer ii = 6;
display_redux(ii);

Para mí, la entrada aquí es independiente de cualquier otra cosa, y no se puede asignar un valor a la entrada por lo que no tiene efectos secundarios al modificar las entradas desde donde se llamó.

Tomando una de tus tareas:

task exp_case_2b
  input data_i;
  input reset;
  input read;
  input dcsel;
  input xlat;     
  output reg [47:0] data_o;
  begin
    repeat(47)begin @(posedge clk)
      data_i = 1;
      reset  = 0;
      read   = 0;
      dcsel  = 0;
      xlat   = 1;
      data_o = Data_out;          
    end
    #5250 compare_data_2(data_out_tb);
  end 
endtask

Ha declarado muchas entradas que no está manejando cuando lo llama con exp_case_2b(data_out) . Usted ha definido entradas, entonces está tratando de impulsar los valores en ellos. Necesita que estos sean reg s y no entradas para que sean locales a la tarea. O no está definido en absoluto y use referencias jerárquicas para el restablecimiento de nivel superior, también conocido como tb.reset = 0; .

Creo que esto podría haber sido lo que estabas intentando todo:

task exp_case_2b
  input      [47:0] data_i;     
  output reg [47:0] data_o;
  begin
    repeat(47)begin @(posedge clk)
      data_i = 1;
      reset  = 0;
      read   = 0;
      dcsel  = 0;
      xlat   = 1;
      data_o = Data_out;          
    end
    #5250 compare_data_2(data_out_tb); //No idea where this variable comes from
  end 
endtask

Entonces llama:

 exp_case_2a(data_i_t, data_out_1);
    
respondido por el pre_randomize

Lea otras preguntas en las etiquetas