¿Qué significa que el hardware sintetizado a partir del código Verilog sea correcto?
Frecuentes
Visto 1,856 equipos
4
He leído "Asignaciones sin bloqueo en Verilog Synthesis, ¡Estilos de codificación que matan!" por Clifford Cummings. Él dice que el código en la parte inferior de esta pregunta está "garantizado" para ser sintetizado en una canalización de tres flip-flop, pero no está garantizado para simular correctamente (ejemplo pipeb3, página 10; el comentario "garantizado" está en la página 12 ). El documento ganó un premio al mejor artículo, por lo que asumo que la afirmación es cierta. http://www.sunburst-design.com/papers/CummingsSNUG2000SJ_NBA.pdf
Mi pregunta: ¿Cómo se define la corrección de la síntesis de Verilog si no es por referencia a la semántica de simulación? Muchas gracias.
Supongo que la pregunta de los puntos de bonificación es: proporcione el programa Verilog más simple posible que tenga una semántica de síntesis bien definida y no tenga una semántica de simulación bien definida, suponiendo que no sea el código a continuación. Gracias de nuevo.
De hecho, ¿alguien puede darme una parte de Verilog que esté bien definida cuando se simula y se sintetiza, pero que ambos producen resultados diferentes?
El código:
module pipeb3 q3, d, clk);
output [7:0] q3;
input [7:0] d;
input clk;
reg [7:0] q3, q2, q1;
always @(posedge clk) q1=d;
always @(posedge clk) q3=q2;
always @(posedge clk) q1=d;
endmodule
PD: en caso de que a alguien le importe, pensé que una definición plausible de una herramienta de síntesis correcta podría estar en la línea de "el hardware sintetizado hará algo que un simulador correcto podría". Pero esto es inconsistente con el documento.
[Ahora creo que el papel no está bien. La sección 5.2 del estándar 1364-2001 dice claramente que el significado de un programa Verilog se define por su simulación que luego el estándar procede a definir (sin determinismo y todo). No se menciona en absoluto ninguna "garantía" que las herramientas de síntesis deban proporcionar más allá de los simuladores.
Hay otro estándar 1364.1-2002 que describe el subconjunto sintetizable. No hay una mención obvia de que la semántica del hardware sintetizado debería diferir de alguna manera de la simulación. La Sección 5.2.2 "Modelado de dispositivos de almacenamiento sensibles al borde" dice que las asignaciones sin bloqueo deben usarse para modelar flip-flops. En lenguaje estándar, eso significa que no se admite el uso de cualquier otra cosa.
Como nota final, la sección a la que se hace referencia en el párrafo anterior dice que las asignaciones de bloqueo se pueden utilizar para calcular el RHS de la asignación de no bloqueo. Esto parece violar la recomendación #5 de Cummings.
Cliff Cummings figura como miembro del grupo de trabajo del estándar 1364.1-2002. Este estándar aparece como reemplazado en el sitio web de IEEE, pero no puedo decir por qué fue reemplazado.]
3 Respuestas
10
Todos -
Es hora de que intervenga con información de fondo útil y mis propias opiniones.
Primero: el estándar de síntesis RTL Verilog IEEE-1364.1-2002 nunca fue implementado completamente por ningún proveedor, por lo que ninguno de nosotros tenía prisa por actualizar el estándar o proporcionar una versión SystemVerilog del estándar de síntesis. Que yo sepa, el estándar no fue "reemplazado" y acaba de expirar. Que yo sepa, los atributos descritos en el Estándar nunca fueron completamente implementados por ningún proveedor. La única característica útil en el estándar que creo que fue implementada por todos los proveedores fue que se supone que un proveedor debe configurar la macro `define SYNTHESIS antes de leer cualquier código de usuario, de modo que ahora puede usar `ifndef SYNTHESIS - `endif como un reemplazo genérico para los comentarios // synopsys translate_on específicos del proveedor - // synopsys translate_off pragma-comments.
Verilog se inventó como un lenguaje de simulación y nunca tuvo la intención de ser un lenguaje de síntesis. A fines de la década de 1980, Synopsys reconoció que a los ingenieros les gustaba mucho este lenguaje de simulación de Verilog y comenzó a definir un subconjunto del lenguaje que ellos (Synopsys) reconocerían y convertirían mediante síntesis en hardware. Ahora nos referimos a esto como el subconjunto de síntesis RTL, y ese subconjunto puede crecer con el tiempo a medida que los proveedores de herramientas de síntesis descubren formas únicas y creativas de convertir un nuevo tipo de descripción en hardware.
Realmente no hay una "corrección de la síntesis de Verilog definida". Don Mills y yo escribimos un artículo en 1999 titulado "Estilos de codificación RTL que generan discrepancias en la simulación y la síntesis", para advertir a los ingenieros sobre los estilos de codificación legales de Verilog que podrían inferir hardware sintetizado con un comportamiento diferente. http://www.sunburst-design.com/papers/CummingsSNUG1999SJ_SynthMismatch.pdf
Considere esto, si los resultados sintetizados siempre coincidieran con el comportamiento de las simulaciones de Verilog, no habría necesidad de ejecutar simulaciones de puerta. El diseño, como RTL-simulado, sería correcto. Debido a que no hay coincidencia garantizada, los ingenieros ejecutan gate-sims para demostrar que el comportamiento de la puerta coincide con el comportamiento RTL, o intentan ejecutar herramientas de verificación de equivalencia para probar matemáticamente que el código RTL previo a la síntesis es equivalente a los modelos de puerta posteriores a la síntesis. , por lo que no se requieren gate-sims.
En cuanto a la pregunta de bonificación, esto es realmente difícil, porque la semántica de Verilog está bastante bien definida, incluso si la definición es que es una condición de carrera legal.
En cuanto a código bien definido en simulación y síntesis con diferentes resultados, considere:
module code1c (output reg o, input a, b);
always
o = a & b;
endmodule
En la simulación, nunca se pasa del tiempo 0. La simulación se repetirá para siempre debido a la falta de la lista de sensibilidad. Las herramientas de síntesis ni siquiera tienen en cuenta la lista de sensibilidad al inferir la lógica combinacional, por lo que obtendrá una puerta and de 2 entradas y una advertencia sobre los elementos faltantes de la lista de sensibilidad que podrían causar una falta de coincidencia entre las simulaciones previas y posteriores a la síntesis. En Verilog-2001 agregamos always @* para evitar este problema común, y en SystemVerilog agregamos always_comb para eliminar la lista de sensibilidad e informar a la herramienta de síntesis de la lógica prevista por el diseñador.
En cuanto a si el documento debería ofrecer garantías sobre el comportamiento de síntesis correcto, probablemente no debería, pero las garantías descritas en mi documento definen lo que un ingeniero puede esperar de una herramienta de síntesis basada en la experiencia con múltiples herramientas de síntesis.
"Como nota final, la sección a la que se hace referencia en el párrafo anterior dice que las asignaciones de bloqueo se pueden usar para calcular el RHS de la asignación que no es de bloqueo. Esto parece violar la recomendación n.º 5 de Cummings".
Tiene razón, esto viola la pauta de codificación n.º 5 y, en mi opinión, no debe usarse.
La directriz de codificación n.º 5 se infringe con frecuencia en los diseños de VHDL porque las variables de VHDL no pueden desencadenar otro proceso. Encuentro que el campo VHDL está dividido uniformemente sobre este tema. La mitad dice que no debe usar asignaciones de variables y la otra mitad usa variables para mejorar el rendimiento de la simulación, pero luego se requiere que mezcle las asignaciones de variables con una asignación de señal final para activar otros procesos.
Si viola la pauta de codificación n.º 5 y su código es correcto, la simulación funcionará y la síntesis también funcionará, pero si tiene algún error en su código, es muy difícil depurar diseños que violen la pauta de codificación n.º 5 porque el la visualización de forma de onda para la pieza combinacional no tiene sentido. La salida de la lógica combinacional en una pantalla de forma de onda solo se actualiza cuando no se afirma el restablecimiento y en un borde de reloj, que no es cómo se comporta el hardware combinacional real, y esto ha demostrado ser un problema difícil al depurar estos diseños usando pantallas de forma de onda (I no incluyó esta información en el documento).
Saludos - Cliff Cummings - Verilog y SystemVerilog Guru
Respondido el 28 de junio de 12 a las 19:06
Muchas gracias por la respuesta detallada y por explicar lo que sucedió con el estándar .1. - user1002059
1
Creo que la razón por la que se sintetizará correctamente es porque en el silicio real no hay diferencia entre 'bloquear' y 'no bloquear'.
Synthesis leerá eso y creará tres chanclas encadenadas espalda con espalda, como lo describiste.
Esto no será un problema en síntesis (asumiendo que no estás violando el tiempo de espera del flop), porque las puertas reales exhiben retrasos. En el flanco ascendente de clk, tomará varios ns para el valor d
para propagar a q1
. Para el momento d
se propaga a q1
, q1
ya habrá sido muestreado por el segundo flop, de manera similar con q2
e q3
.
La razón por la que esto no funciona en la simulación es porque no hay retrasos en la puerta. En el borde positivo del reloj, q1
será reemplazado instantáneamente por d
, posiblemente antes q1
fue muestreado por el segundo fracaso. En un circuito real (con la configuración adecuada y el tiempo de espera), q1
se garantiza que se muestreará en el borde positivo del reloj antes de que el primer flop pueda cambiar su valor de salida.
Respondido el 26 de junio de 12 a las 01:06
Muchas gracias. Estoy feliz de aceptar que el código a menudo se sintetizará "correctamente". Pero eso no es lo mismo que una garantía. Si estuviera garantizado, podría reclamar al proveedor de cualquier herramienta que no lo sintetice "correctamente". De hecho, podría gritarles "Su miserable herramienta hace lo mismo que el simulador, quiero un reembolso completo de inmediato". Ahora claramente, hay algo mal con eso. Pero un mejor papel parece decir que así son las cosas... - user1002059
0
Sé que tiene 3 años, pero tu publicación se marcó cuando alguien intentó editarla. La respuesta de Cliff es, por supuesto, completa, pero en realidad no responde a su pregunta. La otra respuesta también es simplemente incorrecta.
Mi pregunta: ¿Cómo se define la corrección de la síntesis de Verilog si no es por referencia a la semántica de simulación?
Tienes razón, por supuesto. La síntesis solo es 'correcta' si (a) el resultado (salida) se simula de la misma manera que el original (entrada), posiblemente después de tener en cuenta algunos problemas de tiempo/etc., y/o (b) la salida del sintetizador puede ser formalmente resultó ser equivalente a la entrada del sintetizador.
dar el programa Verilog más simple posible que tiene una semántica de síntesis bien definida y no tiene una semántica de simulación bien definida
En principio, esto no debería ser posible. Los proveedores de sintetizadores intentaron definir plantillas que se basaban en un código que tenía una semántica de simulación bien definida. Sin embargo, Verilog estaba (y está) mal definido, y los NBA inicialmente no existían en el idioma, por lo que tiene rarezas como el ejemplo de canalización. Lo mejor es olvidarse de ellos.
De hecho, ¿alguien puede darme una parte de Verilog que esté bien definida cuando se simula y se sintetiza, pero los dos producen resultados diferentes?
La única definición de 'bien definido' (en contraposición a 'correcto') en síntesis es que varios proveedores producirán exactamente el mismo resultado incorrecto. Esto es bastante improbable. Supongo que el restablecimiento asíncrono clásico e async set clocked F/F estaría cerca.
Respondido 16 Jul 15, 14:07
No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas verilog system-verilog or haz tu propia pregunta.
Yo definiría "el hardware sintetizado hará algo que un simulador correcto podría" Al revés. El simulador debería darte el mismo resultado que el hardware sintetizado. - Morgan
Eso está claramente mal, me temo. La simulación es deliberadamente no determinista, por lo que diferentes simuladores correctos pueden dar resultados diferentes. De hecho, diferentes ejecuciones del mismo simulador correcto pueden dar resultados diferentes (AFAIK). Entonces, el mismo hardware cambiaría entre correcto e incorrecto al azar. No es bueno. (Habiendo dicho eso, la definición original necesitaría una enorme lista de condiciones para explicar lo que podría significar el resultado producido por el hardware). - user1002059
IEEE 1364 ahora es parte de IEEE 1800 - SystemVerilog. Básicamente fusionaron los dos lenguajes en una sola especificación. Hicieron esto porque se suponía que 1800 se sumaría a 1364, pero había lagunas. Al ponerlos en una sola especificación, es más fácil asegurarse de que no haya agujeros. - Paul S
Mi punto era que si el hardware generado a partir del hdl es determinista, es decir, siempre obtienes lo mismo. Me gustaría que el simulador me dijera qué haría el hardware. No conseguir el hardware que da el mismo resultado que el simulador. NB: también fue mi opinión de lo que quiero de un simulador, no por nada definido por las especificaciones de IEEE. - Morgan