Cómo administrar múltiples casos de prueba en un banco de pruebas VHDL

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:

  1. Utilice un archivo de banco de pruebas por caso de prueba. Realmente no me gusta este enfoque, ya que necesito duplicar una gran cantidad de código entre los archivos del banco de pruebas, incluso si pongo los procedimientos relacionados con la prueba en un paquete común.
  2. Use un genérico para especificar el caso de prueba, luego use una cláusula If generar para envolver el estímulo y el proceso de validación para cada caso de prueba.
  3. Ponga todos los casos de prueba en el mismo proceso y simplemente reinicie el módulo entre cada caso de prueba.

Dudo entre la opción 2 y la 3. ¿O tal vez hay una mejor opción?

3 suena súper peligroso. Asume que tiene un restablecimiento perfecto, que de hecho es algo que necesita probar.
no completamente sin relación: cocotb , escriba la infraestructura de casos de prueba en algo que es menos incómodo que VHDL y las herramientas del proveedor. Es compatible con modelsim, por lo que esta sería mi elección.
1 tiene modularidad. Este para mantener, Fácil de transferir a un nuevo personal. 3 se convertiría en un desorden y no profesional.
Cuando me enfrenté exactamente a este mismo problema hace mucho tiempo, elegí el enfoque n. ° 4: elegir el caso de prueba a través de la entrada directa del usuario . ModelSim (y algunas otras herramientas) proporcionan un descriptor de archivo poco conocido STD_INPUT en la biblioteca TextIO . Usando esto, puede leer la entrada del usuario desde la consola. Entonces, usaría reportdeclaraciones (o el STD_OUTPUTdescriptor de archivo) para solicitar al usuario "qué prueba ejecutar", luego recopilar la entrada del usuario y ejecutar la prueba correspondiente.

Respuestas (1)

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).

ingrese la descripción de la imagen aquí

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

¡Gracias, probaré con OSVVM!