Escribiendo bancos de prueba sintetizables

5

Estoy empezando a aprender SystemVerilog y trabajar con FPGA, y hasta ahora no he encontrado una manera satisfactoria de probar mi código. Vengo de un fondo de software, y siempre he estado escribiendo pruebas automatizadas exhaustivas para mi código. He estado usando marcos de estilo JUnit (con un montón de ajustes específicos de dominio en la parte superior, para reducir repetitivo), así como marcos de estilo QuickCheck, y encontré formas de usar estos marcos para escribir código de prueba conciso que, sin embargo, me proporciona un alto nivel. Confianza en el producto que estoy desarrollando. Todavía no he encontrado nada equivalente para los lenguajes de descripción de hardware.

Los textos introductorios de Verilog suelen presentar bancos de pruebas que solo controlan las señales de entrada. Estos bancos de prueba son paredes de código repetitivas ilegibles (asignaciones de señales) sin aserciones; Estas pruebas ni siquiera son automáticas. Algunos textos intentan incorporar aserciones verificables por la máquina en el código del banco de pruebas para que uno no tenga que mirar las formas de onda para determinar si la prueba se aprobó o no. Aún así, el problema del "muro de texto repetitivo" continúa.

Investigué más el problema y encontré que el estándar actual de la industria para la verificación de RTL es UVM. La idea me parece mejor, no la he examinado en detalle, pero para mí la gran desventaja de UVM es que los bancos de pruebas UVM no son sintetizables.

Si no puedo ejecutar mis pruebas en el FPGA real, ¿cómo puedo estar seguro de que mi diseño sintetizado funciona correctamente? Entiendo que existe una alta probabilidad de que funcione después de que hayan pasado las pruebas de simulación, pero hay muchas suposiciones involucradas (que mi código no es vicioso, que mi código cumple con los requisitos de tiempo, que la herramienta de síntesis es correcta, etc. )

Un paralelo en el mundo del software sería desarrollar un programa en C, compilar con gcc y probarlo en x86 en Windows, y luego compilarlo con Clang y ejecutarlo en producción en ARM en Linux. El programa debería funcionar, asumiendo que no tiene un comportamiento indefinido, no tiene suposiciones no portátiles sobre el entorno de ejecución, ambos compiladores no tienen errores que afecten al programa. Esta es una gran cantidad de suposiciones que la mayoría de los ingenieros de software no harían y en su lugar solo realizarían sus pruebas en la configuración de producción.

¿Estoy malinterpretando algo sobre el proceso de diseño de hardware en el mundo real? ¿Cómo se verifican los diseños una vez que se sintetizan en FPGA y silicona real? ¿Cómo ejecutar casos de prueba existentes en diseños en FPGA y silicona?

¿Existen prácticas estándar de la industria para bancos de pruebas sintetizables? ¿Las personas realmente escriben bancos de pruebas sintetizables?

    
pregunta J. Doe

3 respuestas

2

Un enfoque general es utilizar pruebas más abstractas a medida que avanzas en la pila en términos de complejidad de diseño. Sí, debe confiar en las herramientas (y en las herramientas de verificación, como las pruebas de equivalencia lógica), pero para un diseño completo de fpga (a) no habrá espacio para un banco de pruebas, y (b) la cobertura exhaustiva llevará mucho tiempo .

Un buen enfoque es utilizar bancos de pruebas de simulación exhaustivos o aleatorios a nivel de submódulo, y pruebas más funcionales o basadas en vectores a nivel de todo el sistema. Para un FPGA que forma parte de un diseño complejo, es posible que tenga que construir un emulador de sistema en hardware para controlar los puertos.

Un enfoque adecuado depende de su diseño particular y de lo fácil que sea generar estímulos de prueba, capturar el resultado y comparar con el modelo (que podría ser una simulación o un modelo de software de nivel superior).

Creo que debido a las grandes variaciones en la aplicación, es difícil encontrar un enfoque estandarizado. Algunas veces se usa FPGA para acelerar las pruebas del diseño, a veces es el producto final. En general, puede confiar en que el tejido FPGA reproducirá honestamente la lista de red resultante (suponiendo que cumpla con el tiempo); las abstracciones son más simples que las transformaciones que se aplican al asignar el código C al código del ensamblador en el contexto de un sistema operativo.

    
respondido por el Sean Houlihane
1

Creo que nada supera las pruebas en hardware real, y eso se aplica a los procesadores y FPGA. Me encanta trabajar en microcontroladores con depuración en circuito porque puede recorrer el código lentamente y ver los resultados con declaraciones reales de hardware / impresión, lo que sea. Incluso repasar el código en un microcontrolador puede ser difícil porque a menudo se necesita el software para que funcione rápidamente y no se pierda nada. En FPGA, realmente no hay mucho en términos de "paso a paso" a través del código porque todo funciona en paralelo. Puede conectar un analizador lógico integrado y capturar un momento en el tiempo y ver cómo se propagan todas las señales en el tiempo. Puedes pasar por los procesos con un simulador, pero eso no es lo mismo.

Entonces, volviendo a su pregunta, ¿cómo sabe que su código HDL funcionará correctamente dentro de su FPGA? Por lo general, lo hace tal como lo mencionó: escriba un banco de pruebas para estimular las entradas y las salidas, y cuando genere el diseño, si cumple con los plazos y asumiendo que todo está limitado adecuadamente, se garantiza que su diseño se comporte de la forma en que lo escribió. . Le advierto que solo crea este 99% si tiene cosas extrañas como el cruce del reloj, la metastabilidad, ya que es difícil modelar con precisión lo que sucede en estos casos. Luego construye su confianza al hacer un banco de pruebas estelar: pruebe los casos normales, los casos extremos, todo. Después de esto, todavía puede ser vacilante. La mayoría de los proveedores de FPGA de gran nombre tienen licencias especiales que puede adquirir que le brindan modelos de simulación posteriores a la compilación. Estos deben ser precisos en el tiempo, por lo que su diseño se verifica más allá de la simulación de comportamiento.

Creo que la mayoría de los proveedores de ASIC gastan una gran parte de su presupuesto en el equipo de prueba / verificación. Básicamente, realizan todo tipo de simulaciones para probar y garantizar que el diseño sea a prueba de balas, por lo que los ASIC no tienen errores.

Al igual que en una simulación de circuito, la precisión depende de la precisión de sus modelos. Algunas compañías en estos días le proporcionarán un modelo HDL preciso en el tiempo de sus partes, por lo que la prueba de la interfaz se puede hacer con anticipación.

Restringir sus entradas y salidas correctamente también es un gran problema. Nada es peor que la introducción de restricciones incorrectas y las herramientas le dicen que el diseño funcionará, cuando en realidad no. También tuve que escribir muchos de mis propios modelos de hardware, teniendo que analizar cada detalle de las hojas de datos ... ugh

Si es posible, trato de insistir en que se me proporcione un hardware de desarrollo representativo. Les digo a los usuarios superiores que ahorrarán una tonelada de tiempo de depuración si obtengo el trato real por adelantado.

    
respondido por el user2913869
1

En mi opinión, estás demasiado preocupado. Se trata de confiar. ¿Confía en que el compilador gcc producirá las instrucciones de ensamblaje exactas que corresponden al código C? Es lo mismo con las herramientas de síntesis. Confía en el hecho de que se han probado antes de la implementación. Es por eso que cobran una cantidad significativa de dinero por ellos.

Además, no solo haces simulación RTL. Las herramientas hoy en día tienen un análisis de cierre de tiempo, para asegurarse de que no tenga estabilidad meta. Si se asegura de haber completado el cierre de tiempo, no terminará con infracciones de tiempo en su diseño.

Si todavía está preocupado por su diseño, existe la llamada simulación de nivel de puerta. Los tiempos de su diseño sintetizado se importan a su simulación y se modelan adecuadamente. Con este método, puede ver los retrasos reales a medida que la señal pasa a través de la lógica.

Si usted es realmente paranoico, como debería estar en el diseño ASIC, existen herramientas de verificación formales que prueban las funciones de diseño según lo especificado. Puede verificar, por ejemplo, si su diseño es equivalente a un diseño dorado que sabe que funciona.

Lo que sucede en la industria es que desarrollamos plantillas de prueba para la verificación. Este es un producto separado para probar el producto. Por lo general, también hacemos una variedad de pruebas. Esto es lo que puedo pensar de la cabeza:

  1. continuidad de PCB descubierta por el fabricante de PCB
  2. Prueba de PCB ensamblada utilizando una sonda voladora
  3. plantilla de prueba

La sonda de vuelo es una máquina que usted programa que sondea las señales en diferentes lugares de la PCB: La sonda de vuelo puede programar la placa, aplicar voltajes y medir las salidas. Es lento en comparación con una plantilla de prueba personalizada. Tampoco puede tratar con señales rápidas.

También debe tener en cuenta que al colocar un banco de pruebas en un FPGA, cambia el diseño original. He tenido experiencia donde poner los módulos de depuración en el FPGA redujo la velocidad de reloj máxima de todo el FPGA. Esto fue causado por el enrutamiento más largo requerido para el diseño original, no por las limitaciones del depurador.

¿Qué significa todo eso? Bueno, estás trabajando en un producto de hardware. Los productos de hardware requieren una estrategia de prueba adecuada que involucre a todo el equipo. El producto puede fallar durante la prueba por miles de razones, por ej. El FPGA no se ha desacoplado correctamente, y la línea de energía cae por debajo del voltaje requerido cuando se ejecuta una operación intensiva en computación.

    
respondido por el user110971

Lea otras preguntas en las etiquetas