Red de conocimiento informático - Material del sitio web - Cómo crear una plataforma de verificación UVM utilizable desde cero

Cómo crear una plataforma de verificación UVM utilizable desde cero

La generación controlada de números aleatorios es otra característica clave de SV. Los incentivos ordinarios basados ​​en Verilog son básicamente incentivos fijos directos sin aleatorización, y la mayoría de ellos se componen de tareas Verilog de múltiples capas. Incluso si Verilog tiene una función de sistema como $TERM que puede generar números aleatorios, es difícil usarlo para construir estímulos de prueba aleatorios complejos y, dado que no hay clases, es difícil lograr una reutilización jerárquica y restricciones de estímulos.

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

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