¿Alguien puede decirme cuál es la diferencia entre RTL y el código de comportamiento de Verilog? ¿Hay alguna demarcación clara entre los diseños en estos dos niveles?
digital-logic
verilog
vhdl
hdl
Akash Singh
fuente
fuente
El código de "nivel de transferencia de registro" es el código que se describe en términos de registros y lógica combinatoria que se ubica entre ellos y está destinado a ser utilizado como entrada para una herramienta de síntesis. El código se adhiere a un subconjunto sintetizable [1] del idioma. No hay retrasos explícitos, todos los tiempos son en términos de bordes de reloj. Las estructuras que representan pestillos activados por nivel generalmente se evitan. Los registros suelen estar sincronizados con un pequeño número de relojes cuyos detalles se pueden proporcionar al analizador de tiempos. Por lo general, se espera que la lógica combinatoria [2] se establezca dentro de un solo ciclo de reloj que limita su complejidad. Tiene un nivel más alto que un modelo de nivel de puerta, pero aún define qué valor tiene cada registro en cada ciclo de reloj.
El código de "comportamiento" es generalmente un código que describe el comportamiento en un nivel superior para su uso en una simulación, pero no pretende ser sintetizable. Puede usarse para describir el entorno que rodea su diseño en una simulación. Se puede usar como un primer paso en un diseño para obtener el diseño general en su lugar antes de que se alcance el diseño RTL detallado de los módulos individuales.
[1] El subconjunto exacto permitido varía entre las herramientas de síntesis.
[2] Si no se establece dentro de un solo ciclo, la simulación y la síntesis pueden dar resultados diferentes y el analizador de tiempo mostrará una violación a menos que se indique explícitamente que no lo haga.
fuente
Una definición más generalizada.
Código de comportamiento: por definición, define el comportamiento de un componente digital. No proporciona información sobre cómo se implementará en HW real (síntesis). No proporcionará información sobre cómo se implementarán los registros y las puertas para realizar la operación requerida. Es más como escribir un algoritmo o FSM en C.
RTL: es la forma más precisa de un componente digital. Proporciona información sobre cómo se implementará el código como HW real (después de la síntesis). También proporciona información sobre cómo se transferirán los datos entre registros y puertas.
fuente
Es el mismo idioma, pero se utilizan diferentes estilos. Con experiencia, puede distinguirlos rápidamente, aquí hay algunos rasgos de cada uno:
El código de comportamiento verilog generalmente se parece más a un programa de computadora secuencial que se ejecuta de arriba a abajo dentro de un
initial begin
bloque. Puede encontrar que no hay puertos de entrada / salida definidos en los módulos de comportamiento de nivel superior, ya que la salida puede ser a instalaciones de simulador, como la consola$display()
o el sistema de archivos con$open
o el dumper de forma de onda con$dumpfile
y$dumpvars
. Esté atento a los retrasos entre las declaraciones implementadas utilizando largas esperas de tiempo de simulación, por ejemplo,#4000
e invocando tareaswishbone_master.checked_read(addr, value)
. Para estas construcciones de nivel superior, no es obvio cuál sería / podría ser el equivalente de tecnología sintetizada.Verilog para síntesis siempre tiene puertos de entrada / salida, ya que sin puertos conectados el módulo no tiene efectos secundarios y puede eliminarse [1]. Los retrasos probablemente se implementan contando los ciclos de algún reloj en particular. Tenga en cuenta que algunas funciones del sistema Verilog, por ejemplo,
$clog2(PARAMETER)
pueden permitirse en el código para síntesis, por lo que la presencia de$function
no es una garantía de ninguna manera. El código para la síntesis tiende a comprender muchos 'procesos' independientes, cada uno con una lista de sensibilidad. Algunas tecnologías permiteninitial begin
bloques para la inicialización de la memoria, por lo que, una vez más, eso no es una garantía.Finalmente, el diseñador conoce el propósito del código que escribe y lo invocará adecuadamente con el conjunto de herramientas de síntesis o en un simulador.
[1] a excepción de ciertos bloques de IP que pueden hacer conexiones de puerta trasera a instalaciones de chips internos, por ejemplo, JTAG
fuente