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