Estoy tratando de implementar un banco de pruebas para un módulo relativamente complejo y necesito varios casos de prueba para cubrir toda la funcionalidad. Me gustaría encontrar una forma elegante de realizar múltiples casos de prueba sin usar archivos de texto para el estímulo porque encuentro que los archivos de texto no son realmente flexibles.
Aquí están mis opciones hasta ahora:
Dudo entre la opción 2 y la 3. ¿O tal vez hay una mejor opción?
Si tiene un módulo complejo, entonces el marco también garantiza cierta complejidad. La siguiente es una variación de su primer caso, sin embargo refactorizado para que el caso de prueba solo contenga el código necesario para crear la prueba en sí y no la infraestructura.
El objetivo de cualquier marco de verificación es hacer que el dispositivo bajo prueba (DUT) "se sienta como" que se ha conectado a la placa. Por lo tanto, el marco debe poder producir las mismas formas de onda y la misma secuencia de formas de onda que el dispositivo bajo prueba verá en la placa.
El siguiente marco de banco de pruebas utilizado por la Metodología de verificación VHDL de código abierto (OSVVM) parece idéntico a otros marcos, incluido SystemVerilog. Incluye componentes de verificación (Axi4Master, UartRx y UartTx) y TestCtrl (el secuenciador de prueba) como se muestra en la Figura 1. El nivel superior del banco de pruebas conecta los componentes entre sí (utilizando los mismos métodos que en el diseño RTL) y a menudo se denomina arnés de prueba. Las conexiones entre los componentes de verificación y TestCtrl usan registros VHDL (que llamamos la interfaz de transacción). Las conexiones entre los componentes de verificación y el DUT son las interfaces DUT (como AxiStream, UART, AXI4, SPI e I2C).
Las pruebas están escritas en arquitecturas de TestCtrl.
En lugar de mover las señales directamente (como se hace con algunos diseños simples), usamos transacciones. Una transacción es una representación abstracta de una forma de onda de interfaz (como escribir) o una directiva para el VC (como esperar el reloj). Una transacción se inicia mediante una llamada a procedimiento. En un enfoque basado en VC, la llamada al procedimiento recopila la información de la transacción y la pasa a los Axi4 VC a través de una interfaz de transacción (un registro). El Axi4 VC luego decodifica esta información y crea las formas de onda de interfaz correspondientes.
El uso de transacciones simplifica la creación de pruebas y aumenta su legibilidad. El siguiente segmento de código muestra llamadas a las transacciones Write, Read y ReadCheck para un Axi4Master VC. Una vez que obtenga la configuración del marco, escribir pruebas se vuelve un poco más fácil y más legible.
MasterProc : process
Begin
. . .
log("Write and Read with ByteAddr = 0, 4 Bytes") ;
Write(MasterRec, X"0000_0000", X"5555_5555" ) ;
Read(MasterRec, X"0000_0000", Data) ;
AffirmIfEqual(Data, X"5555_5555", "Super Read Data: ") ;
log("Write and Read with 1 Byte, and ByteAddr = 1") ;
Write(MasterRec, X"0000_0011", X"22" ) ;
ReadCheck(MasterRec, X"0000_0011", X"22" ) ;
log("Write and Read with 3 Bytes and ByteAddr = 0") ;
Write(MasterRec, X"0000_0050", X"33_2211" ) ;
ReadCheck(MasterRec, X"0000_0050", X"33_2211" ) ;
Con respecto a la selección de qué prueba se ejecuta, eso se puede hacer usando las reglas de compilación de VHDL o las declaraciones de configuración; ambas pueden ser simples.
Para obtener más información, consulte nuestra documentación de GitHub en: https://github.com/OSVVM/Documentation
marcus muller
marcus muller
mitu raj
Sr. Snrub
STD_INPUT
en la biblioteca TextIO . Usando esto, puede leer la entrada del usuario desde la consola. Entonces, usaríareport
declaraciones (o elSTD_OUTPUT
descriptor de archivo) para solicitar al usuario "qué prueba ejecutar", luego recopilar la entrada del usuario y ejecutar la prueba correspondiente.