He logrado algunos avances en el desarrollo de un controlador fuera de servicio gracias a este muy buen artículo que he encontrado en Internet “Secuencia, Secuencia en la pared, que es el más justo”. Los autores son de Mentor Graphics.
Ahora volvamos a la pregunta respuesta:
Para modelar un controlador fuera de servicio necesitamos un controlador segmentado donde todos los canales deben ser independientes entre sí. Supongamos que tenemos 3 canales: write_data, write_address, write_resp para dirección, datos y respuesta. Usted escribe la dirección para enviar en un buzón. Luego lees desde el buzón y conduces los datos. A continuación, comprueba la respuesta y coloca la respuesta en un buzón.
Es importante que utilicemos los buzones de correo para este trabajo porque proporcionan tareas de bloqueo para obtener y poner datos que sincronizarán el tiempo de obtención y colocación de nuestro elemento y resolverán el acceso de puntero nulo.
A continuación tenemos que ejecutar los 3 canales en paralelo. Esto se puede hacer en la clase de controlador de UVM en el siguiente método (puede que haya algunos otros métodos, pero he implementado este):
el controlador de clase extiende uvm_driver (fase uvm_phase);
tenedor
write_address (); // hilo para enviar la dirección
write_data (); // hilo para enviar datos
write_resp (); // hilo para enviar resp
join_none
// entonces necesitamos un bucle para siempre para obtener los elementos de secuencia del secuenciador
para siempre comenzar
seq_item_port.get_next_item (trans); // trans es el elemento de transacción
trans_array [trans.tag] = trans;
seq_item_port.item_done ();
address2SendMb.put (trans.tag);
fin
tarea write_address ();
para siempre comenzar
trans trans_ins;
address2SendMb.get (trans_ins.tag);
trans_ins = trans_array [trans_ins.tag];
// Enviar la dirección a la interfaz según protocolo.
// al final cuando las señales de dirección están completamente hechas
data2SendMb.put (trans_ins.tag);
fin
tarea final
tarea write_data ();
para siempre comenzar
trans trans_ins;
data2SendMb.get (trans_ins.tag);
trans_ins = trans_array [trans_ins.tag];
// Enviar los datos a la interfaz según protocolo.
// al final cuando las señales de datos están completamente hechas
fin
tarea final
tarea write_resp ();
para siempre comenzar
trans trans_ins;
// espera el canal de datos resp
trans_ins.resp = resp; // resp es la señal de interfaz desde la cual // muestrearemos resp
resp2checkMb.put (trans_ins.resp);
fin
fin
clase final
Esta es la idea básica de modelado de controladores fuera de orden. Necesitamos verificar la etiqueta de respuesta con la etiqueta que hemos enviado para verificar si la dirección y la respuesta de los datos se enviaron en consecuencia desde el dispositivo esclavo.
Añadiré más si encuentro algo nuevo.
Gracias