He utilizado Verilog para desarrollar RTL de circuitos digitales sintetizables, y recientemente he estado usando Verilator para ejecutar simulaciones de estos. Mi comprensión de la semántica de Verilog, por lo tanto, se basa en cómo funcionan las cosas bajo esas simulaciones (Verilator intenta igualar una representación sintetizada).
Sin embargo, esto La pregunta sobre StackOverflow (consulte también este documento vinculado ) ha llamado mi atención sobre la idea de que Verilog puede ejecutarse legítimamente en dos modos diferentes, que son pre-síntesis y post-síntesis , y que el significado del lenguaje (y Los resultados de la simulación) no son los mismos entre los dos modos. De particular interés para los sitios de Q & A como este, las discusiones sobre el comportamiento de Verilog podrían confundirse bastante por la falta de una distinción explícitamente especificada entre los dos modos.
Soy consciente de que Verilog se puede usar para describir algoritmos de manera que las herramientas automatizadas no lo pueden sintetizar fácilmente, pero suponiendo que tenemos un diseño orientado a la síntesis, ¿cuál sería el propósito de ejecutar un pre- síntesis simulación?
Nota: Lo que realmente me hizo preguntarme sobre esto fue esta respuesta a otra pregunta que publiqué. Me interesaba la semántica posterior a la síntesis, pero la respuesta parece ser la semántica previa a la síntesis, aunque la distinción no se indica explícitamente en la pregunta o en la respuesta.
Entiendo que la física y la sincronización del hardware real no se abordan en las simulaciones de síntesis previa, pero no es lo que estoy preguntando.
Un ejemplo de las diferencias en la semántica del idioma (como se indica en el documento vinculado ):
- pre-síntesis: el orden de tareas de bloqueo puede importar
- post-síntesis: el orden de tareas de bloqueo no importa
El punto es que la simulación previa a la síntesis puede no coincidir con el hardware debido a las reglas semánticas, incluso si no hay problemas en el tiempo. Por lo tanto, ejecutar una simulación previa a la síntesis puede dar un resultado incorrecto (uno que no coincida con el hardware) a menos que haya construido cuidadosamente el código para que funcione de la misma manera en ambos modos del idioma. Entonces la pregunta es básicamente por qué ejecutar una simulación que se sabe que tiene semántica incorrecta .
Nota adicional: Verilator está completamente idealizado, y no tiene noción de ningún hardware específico, por lo que quizás no sea preciso llamar a eso post-síntesis. Sin embargo, utiliza las reglas semánticas de la post-síntesis, y supuestamente es muy rápido, así que para mí esto establece una línea de base de lo que probablemente debería hacer la simulación de primer orden.