Uno de los problemas con muchos cursos es que, debido a la presión del tiempo, intentan enseñar conceptos con problemas que son demasiado pequeños para necesitarlos.
Un diseño es básicamente una combinación de módulos. En síntesis, su módulo de nivel superior generalmente describe los submódulos de "todo en el chip" y luego describe partes del diseño. En la simulación, su módulo de nivel superior suele ser el código de su banco de pruebas y luego el código que desea probar se instancia como un submódulo.
Hay varias ventajas al dividir un diseño en módulos.
- Puede agrupar código relacionado lógicamente.
- Las herramientas de síntesis generalmente presentan el uso de recursos por módulo. Si no divide su diseño en módulos, no podrá saber qué parte de su código está utilizando todos los recursos.
- Puede encapsular detalles locales, las señales son locales a un módulo a menos que las enrute y envíe explícitamente.
- Puede permitir la reutilización de bloques de código.
Sin embargo, también hay desventajas.
- Las señales de enrutamiento que entran y salen de un módulo requieren más códigos de repetición.
- Demasiados niveles de abstracción pueden hacer que sea difícil ver qué está pasando.
El diseño RTL incluye ruta de datos y controlador, está bien
RTL significa que describimos lo que sucede con cada registro en cada ciclo de reloj usando un subconjunto del lenguaje que las herramientas de síntesis saben cómo manejar.
La herramienta en su mayoría * no sabe o le importa si un registro dado es "ruta de datos" o "control" solo que usted define lo que le sucede de manera que lo entienda.
Por ejemplo, ¿el controlador es un módulo en verilog?
Depende totalmente de usted, puede combinar la ruta de datos y el controlador en un solo bloque siempre. Podría tener un bloque siempre para el controlador y luego construir su ruta de datos a partir de una combinación de declaraciones de asignación, siempre bloques y submódulos. Podría tener un submódulo para la ruta de datos pero no para el controlador.
Lo que funciona mejor depende del problema, si el manejo de los datos es simple, poner todo en un bloque siempre puede ser lo más sensato. Si el manejo de datos se vuelve más complejo, puede tener sentido moverlo fuera del bloque siempre y describirlo de una manera más estructurada para el uso de los recursos de control de la mezcla.
Personalmente solo dividiría el controlador y la ruta de datos en módulos separados si tuviera una buena razón, tal vez sean muy grandes, tal vez quiera usar un controlador para manejar varias copias de la ruta de datos, algo así.
Hmm ... Supongamos que quiero diseñar un sistema en Basys3. Los leds aleatorios parpadearán secuencialmente y el usuario intentará repetir esta secuencia. La puntuación del usuario se incrementará por cada respuesta correcta. ¿Cómo puedo implementar dicho sistema? ¿Debo intentar diseñar un sistema controlador-datapath o módulos Verilog? Estoy muy confundido.
Vamos a desglosar esto.
Primero necesitamos una fuente de números "aleatorios". Probablemente, la mejor manera de hacerlo es tener un generador de números aleatorios psuedo en ejecución continua. La hora en que el usuario presiona el botón de inicio y luego elige qué número "aleatorio" y, por lo tanto, qué patrón de LED recibe el usuario.
Sugeriría que el generador de números "aleatorios" sea su propio módulo para que pueda ser reutilizado en otros proyectos. Probablemente, algo como un registro de retroalimentación lineal es adecuado.
Es probable que también necesite un desempañador de botones que tome las señales de los botones que cand convierte las pulsaciones desordenadas en una señal que es alta para exactamente un ciclo de reloj. Esto se convertiría en un módulo para permitir la instanciación de múltiples instancias para los diferentes botones.
El código de juego real que probablemente escribiría como un solo bloque siempre. Podrías intentar dividirlo pero, a juzgar por la OMI, los gastos generales del apretón de manos entre diferentes partes probablemente superen las ganancias.
* Una excepción a esto son los registros de estado de la máquina de estado. Si sigue las expresiones idiomáticas de las máquinas de estado estándar, la herramienta normalmente se traducirá de los números de estado que utilizó en su programa a una codificación de estado elegida para la eficiencia de síntesis (a menudo 1-hot)