Cómo crear una plataforma de verificación UVM utilizable desde cero
Los números aleatorios controlados de SV permiten a los usuarios definir variables aleatorias en clases e imponerles restricciones para generar variables aleatorias que cumplan con los requisitos del diseñador dentro de un rango determinado. Por lo tanto, varios usos de oop de esta clase logran de manera flexible la generación de varios incentivos aleatorios.
Hay dos formas de declarar variables aleatorias, rand y randc. El primer método es un método aleatorio común y no tiene nada que ver con cada segunda generación. El segundo es sensible al contexto, es decir, no aparecerán números aleatorios repetidos hasta que se hayan recorrido todos los números posibles.
Método incorporado de variable aleatoria randomize()pre_randomize()post_randomize()randomize()con constraint_mode()rand_mode()
Randomize(), pre_randomize(), post_randomize( ) y randomize() son todos métodos integrados de la clase. Cuando las variables de la clase se definen como variables aleatorias, puede aleatorizar las variables aleatorias de la clase llamando a randomize() y obtener el valor de retorno. Si es 1, la aleatorización es exitosa, si es 0, hay una contradicción. Pre_randomize() y post_randomize() son dos interfaces colgantes que se ejecutarán automáticamente antes y después de llamar a randomize(). Conveniente para que los usuarios controlen el proceso de aleatorización. Randomize() puede agregar restricciones adicionales al proceso aleatorio. Los ejemplos son los siguientes.
Clase frame_t;
datos rand bits[7:0];
Verificación de paridad de bits;
Restricción c {
Datos>0;
}
función void pre_randomize();
Inicio
$ write('pre_randomize:data % b y paridad %b\n 'valor, datos, paridad);
Fin
Fin de función
function void post_randomize();
Inicio
paridad = ^datos;
$ escribir(' post_randomize:datos % b y paridad%b \n 'valor, datos, paridad);
Fin
Fin de función
Categoría final
Inicio inicial
frame _ t frame = new();
Entero I = 0;
$ escribir('-\ n ');
$ escribir (' Valor aleatorio \ n ');
$ escribir('-\ n ');
I = marco . aleatorizar()
$ escribir ('-\ n ');
Fin
El ejemplo anterior ejecuta automáticamente pre/post durante la aleatorización y cambia las reglas de generación de números aleatorios.
Randomize() puede agregar restricciones adicionales.
Clase SimpleSum
rand bit[7:0] x, y, z;
Restricción c { z = = x+y;}
Categoría final
tarea InlineConstraintDemo(SimpleSum p);
int éxito;
éxito = p . y;};
Finalizar tarea
Rand_mode() se puede utilizar para cambiar el modo aleatorio de toda la clase o el modo aleatorio de una variable en la clase, como p>
paquete de clase;
rand entero valor_fuente, valor_destino
//Otras declaraciones
Categoría final
Paquete paquete_a = new
packet_a.rand_mode(0);
packet_a.source_value.rand_mode(1);
Constraint_mode() se utiliza para cambiar restricciones específicas.
Paquete de clases;
rand entero valor_fuente
Filtro de restricción 1 { valor_fuente>2*m;}
Categoría final
Función entera toggle_rand (paquete p);
if(p . filter 1 . constraint _ mode())//Devuelve si la restricción está actualmente activada.
p . filtro 1 . restricción _ modo(0); //Desactivar restricciones
Otros
p . ; //Restricciones abiertas
toggle _ rand = p . randomize();
Finalizar función