Diferencia entre RTL y Verilog conductual

¿Alguien puede decirme cuál es la diferencia entre RTL y el código Verilog de comportamiento? ¿Existe una demarcación clara entre los diseños en estos dos niveles?

Respuestas (4)

El código de comportamiento es de nivel superior y, por lo general, no se puede sintetizar. Construcciones como bucles, retrasos y declaraciones "iniciales" son conductuales.

El código RTL es de nivel inferior y está destinado a ser sintetizado. Define un circuito como una combinación de registros interconectados y las operaciones realizadas en señales entre esos registros.

¡Tomado de Yahoo Respuestas y encontrado inmediatamente con Google!

Los bucles se pueden usar en código rtl siempre que el número de iteraciones sea limitado. Algunas herramientas también admiten el uso de bloques iniciales para especificar las condiciones de encendido.
Esta pregunta/respuesta fue en realidad la primera respuesta que Google me dio.

Una definición más generalizada.

Código de Comportamiento: Por definición define el comportamiento de un componente digital. No brinda información sobre cómo se implementará en HW real (síntesis). No brindará 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 una 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 brinda información sobre cómo se transferirán los datos entre registros y puertas.

El código de "nivel de transferencia de registros" es un código descrito en términos de registros y lógica combinatoria que se encuentra 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 lenguaje. No hay retrasos explícitos, todo el tiempo es en términos de bordes de reloj. Por lo general, se evitan las estructuras que representan pestillos activados por nivel. Normalmente, los registros registran una pequeña cantidad de relojes cuyos detalles se pueden proporcionar al analizador de tiempo. Por lo general, se espera que la lógica combinatoria[2] se establezca dentro de un solo ciclo de reloj, lo que limita su complejidad. Es 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. Puede usarse como un paso inicial en un diseño para obtener el diseño general antes de que se supere 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 le indique explícitamente que no lo haga.

Es el mismo lenguaje, pero se utilizan diferentes estilos. Con la experiencia, puede distinguirlos rápidamente, aquí hay algunos rasgos de cada uno:

El código Verilog de comportamiento generalmente se parece más a un programa de computadora secuencial que se ejecuta de arriba a abajo dentro de un initial beginbloque. Es posible que encuentre que no hay puertos de entrada/salida definidos en los módulos de comportamiento de nivel superior, ya que la salida puede ser para las instalaciones del simulador, como la consola $display()o el sistema de archivos con $openo el dumper de forma de onda con $dumpfiley $dumpvars. Esté atento a los retrasos entre las sentencias implementadas usando largas esperas de tiempo de simulación, por ejemplo #4000, e invocando tareas wishbone_master.checked_read(addr, value). Para estas construcciones de nivel superior, ¿no es obvio cuál sería/podría ser el equivalente tecnológico sintetizado?

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]. Retrasos probablemente implementados por ciclos de conteo de algún reloj en particular. Tenga en cuenta que algunas funciones del sistema Verilog, por ejemplo $clog2(PARAMETER), pueden estar permitidas en el código para la síntesis, por lo que la presencia de $functionno 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 permiten initial beginbloques para la inicialización de la memoria, así que, de nuevo, eso no es una garantía.

En última instancia, 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 internas, por ejemplo, JTAG