Prueba uvm_primer ch11 basada en uvm

Ingrese oficialmente al mundo de uvm desde este capítulo

Utilice la fábrica para crear el caso

Usando los siguientes comandos, solo podemos compilar y ejecutar varios casos a la vez;
vsim top_optimized -coverage + UVM_TESTNAME = add_test
vsim top_optimized -coverage + UVM_TESTNAME = random_test
Use UVM_TESTNAME para llamar a run_test () para usar la fábrica para construir objetos de diferentes clases;

Pase la interfaz, run_test ()

  • set es un método estático;
  • run_test () lee el parámetro de + UVM_TESTNAME y construye el objeto de este caso;
module top;
   import uvm_pkg::*;
`include "uvm_macros.svh"

   import   tinyalu_pkg::*;
`include "tinyalu_macros.svh"

   tinyalu_bfm       bfm();
   tinyalu DUT (.A(bfm.A), .B(bfm.B), .op(bfm.op), 
                .clk(bfm.clk), .reset_n(bfm.reset_n), 
                .start(bfm.start), .done(bfm.done), .result(bfm.result));

initial begin
  uvm_config_db #(virtual tinyalu_bfm)::set(null, "*", "bfm", bfm);
  run_test();
end

endmodule : top

prueba_aleatoria ()

  • `uvm_component_utils usa esta macro para registrar la clase en la fábrica, de modo que no hay necesidad de cambiar el código de la fábrica, para que este objeto random_test pueda ser construido;
  • Utilice la función get () para obtener la interfaz del conjunto; si falla, devuelve 0;
  • La comprensión de la objeción: run_phase () verificará si cada objeto tiene raise_objection antes de salir; si la hay, espera; conoce el último objeto drop_objection;
class random_test extends uvm_test;
   `uvm_component_utils(random_test);

 virtual tinyalu_bfm bfm;
   
   function new (string name, uvm_component parent);
      super.new(name,parent);
      if(!uvm_config_db #(virtual tinyalu_bfm)::get(null, "*","bfm", bfm))
        $fatal("Failed to get BFM");
   endfunction : new


   task run_phase(uvm_phase phase);
      random_tester    random_tester_h;
      coverage  coverage_h;
      scoreboard scoreboard_h;

      phase.raise_objection(this);

      random_tester_h    = new(bfm);
      coverage_h  = new(bfm);
      scoreboard_h = new(bfm);
      
      fork
         coverage_h.execute();
         scoreboard_h.execute();
      join_none

      random_tester_h.execute();
      phase.drop_objection(this);
   endtask : run_phase

endclass

Supongo que te gusta

Origin blog.csdn.net/weixin_39060517/article/details/113049523
Recomendado
Clasificación