Secuenciador virtual : contiene identificadores del secuenciador que se encuentran en diferentes agentes
P. La pregunta es ¿cuándo la usamos?
¿Por qué usarlo?
- ¿Qué tipo de arquitectura se utiliza para construir puentes?
- ¿Cuáles son las habilidades creativas y comerciales esenciales necesarias para convertirse en un arquitecto o diseñador extraordinario exitoso?
- ¿Existe una cultura de vivienda ambiental en Florida?
- ¿El Paragon en Singapur se basa en las ideas de Frank Lloyd Wright, como las del museo Guggenheim?
- ¿Por qué se construyó la Oficina Oval y cómo se usa?
Si algo tiene que estar sincronizado, en general la generación de estímulos a través de diferentes interfaces tiene que estar sincronizada, lo que se hace mediante secuenciador virtual, secuencias virtuales
en la práctica si tienes dos ip en soc y quieres tener control de estímulo, secuenciador virtual, las secuencias virtuales te ayudan a lograrlo
Cómo lo usamos
considere seqr1, seqr2 son manejadores de secuenciadores, también pertenecen a dos agentes seq1_agent, seq2_agent, y tienen env como entorno
Vamos a ver cómo usarlo?
Definir secuenciador virtual
///// Clase de secuenciador virtual
clase virtual_seqr extender uvm_sequencer;
`uvm_component_utils (virtual_seqr)
/// Manijas de diferentes secuenciadores
type1_seqr seqr1;
type2_seqr seqr2;
/// Constructor
función new (string name = “virtual_seqr”, uvm_component parent);
super.new (nombre, padre);
función final: nuevo
clase final: virtual_seqr
Ahora si vamos más allá
cómo se instancia la secuencia virtual en secuencia virtual
para eso permite definir la clase de secuencia base
///// Clase de secuencia virtual
clase virtual_base_seq extend uvm_sequence # (uvm_sequence_item);
`uvm_component_utils (virtual_base_seq)
type1_seqr seqr_b1;
type2_seqr seqr_b2;
// Manejador de secuenciador virtual
virtual_seqr v_seqr;
/// Constructor
función new (string name = “virtual_base_seq”);
super.nuevo (nombre);
función final: nuevo
cuerpo de tarea ();
if (! $ cast (v_seqr, m_sequencer)) comienza
`uvm_error (get_full_name (),” Falló la conversión del puntero Seqr virtual “)
final
seqr_b1 = v_seqr.seqr1;
seqr_b2 = v_seqr.seqr2;
endtask: cuerpo
clase final: virtual_base_seq
Ahora vamos a definir secuencia virtual
clase virtual_seq extend virtual_base_seq;
`uvm_component_utils (virtual_seq)
type1_seqr seqr_b1;
type2_seqr seqr_b2;
// Manejador de secuenciador virtual
virtual_seqr v_seqr;
/// Constructor
función new (string name = “virtual_seq”);
super.new (nombre, padre);
función final: nuevo
cuerpo de tarea ();
// llama al archivo padre para asignar identificadores de subsecuencia
super.body ();
type1_seq seq1;
type2_seq seq2;
// crear seq
seq1 = type1_seq :: type_id :: create (“type1_seq”);
seq2 = type1_seq :: type_id :: create (“type1_seq”);
repetir (10) comenzar
seq1.start ();
seq2.start ();
final
endtask: cuerpo
clase final: virtual_base_seq
El entorno creará instancias de secuenciador virtual, agente y se conectará a secuenciador virtual a secuenciador de agente
no entrar en detalles es la fase de conexión será como
función void connect_phase (fase uvm_phase);
v_seqr.seqr1 = seg1_agent.m_sequencer;
v_seqr.seqr2 = seq2_agent.m_sequencer;
función final: connect_phase
También prueba instanciará secuencia virtual, entorno
y su fase de ejecución será como
tarea run_phase (fase uvm_phase);
/// Crear la secuencia virtual
v_seq_test = virtual_seq :: type_id :: create (“v_seq_test”);
phase.raise_objection (esto);
/// Inicia la secuencia virtual
v_seq_test.start (env.v_seqr_env);
phase.drop_objection (esto);
endtask: run_phase