En VHDL, ¿tener una gran entrada de bus al componente requiere recursos adicionales?

Tengo un componente que tiene una señal de matriz muy grande (un par de kilobits) y actualmente escribo y leo en un solo componente. He comprobado en Vivado si esto consume demasiados recursos y no es así. Mi pregunta es que quiero tener un subcomponente que pueda acceder a esta matriz (solo leer de ella). Si simplemente configuro la matriz como una entrada para el subcomponente, ¿se necesitarán más recursos que si implementara la matriz en el mismo componente? Sé que el compilador de optimización es bastante poderoso, pero no sé qué sucede cuando interactúas entre los componentes de VHDL.

Gracias

Las herramientas de síntesis son generalmente bastante buenas, siempre y cuando no tenga configurado "Conservar jerarquía", es poco probable que se vean afectados por esto. Pero la única manera de estar seguro es probarlo.
¿Puede convertir su matriz en una RAM o una RAM de doble puerto? ¿Cuántas palabras en su matriz se usan simultáneamente?

Respuestas (3)

Cuando observa el diseño como un esquema, puede tener la falsa sensación de que existen fronteras entre sus módulos (o entidades) individuales. Pero, por defecto, Vivado aplana su diseño, lo que significa que su diseño se trata esencialmente como un gran diseño. Se ignoran todos los límites de los subcomponentes. Por lo tanto, piense en ello como si simplemente hubiera copiado el código del subcomponente y lo hubiera pegado en el principal.

Por supuesto, puede decirle a Vivado que mantenga su jerarquía definida (es decir, que no aplane el diseño), en cuyo caso las etapas de ubicación y enrutamiento intentarán ubicar las entrañas de cada entidad individual dentro de la estructura. Pero aún así, no replicará los controladores de señales que existen en los componentes principales.

Cuando tiene un arreglo grande en diseño HDL (ya sea VHDL o Verilog), el sintetizador a menudo lo reconocerá como un "ram" y lo implementará usando un block ram en lugar de una enorme pila de registros.

Sin embargo, solo puede hacer esto en un subconjunto limitado de casos, si no puede asignarlo a un carnero, terminará con una enorme pila de registros. En particular, la mayoría de las RAM solo tienen dos "puertos", por lo que es casi seguro que leer o escribir su matriz desde más de dos lugares (ya sea en el mismo módulo o no) lo llevará a una pila de registros.

No sé si la inferencia de block ram ocurre antes o después de aplanar el diseño, tendrías que experimentar para descubrirlo.

Finalmente, tenga mucho cuidado al probar diseños parciales. Es demasiado fácil terminar con grandes partes de su diseño sintetizadas por completo porque no conectó su salida a nada o porque alimentó su entrada con una constante.

Estoy totalmente de acuerdo con ese párrafo final. Tuve problemas para probar mi diseño sin una ruta de salida clara.

[Respuesta completamente reescrita, porque entendí mal la pregunta.]

Desde el punto de vista de la síntesis, una señal que es una matriz es equivalente a un montón de señales separadas para cada elemento. La síntesis generalmente se ocupará de cada una de esas señales separadas de forma independiente.

La síntesis requerirá recursos de interconexión entre el controlador (fuente) de una señal en particular, en este caso cada componente del arreglo, y la lógica sintetizada que usa esa señal como entrada (sumideros). Simplemente pasar la señal en el nivel del código fuente VHDL a través de los puertos de componentes VHDL solo define la conectividad en un sentido puramente lógico, pero no especifica que esas señales tengan una ruta de enrutamiento particular y recursos sintetizados.

Específicamente, si la señal de matriz grande se controla en un componente y se pasa a través de un puerto a otro componente, cada elemento de señal individual deberá enrutarse desde su propia fuente a su propio sumidero, pero cada uno de ellos se enrutará por separado en la forma mínima en que la síntesis y P&R pueden hacerlo.

No estoy seguro de haber entendido lo que dijiste. Planeo leer toda la matriz en el subcomponente. Me preguntaba si las herramientas de síntesis copiarían toda la lógica para almacenar la matriz porque tiene dos componentes.
A veces, las herramientas de síntesis pueden copiar la lógica que impulsa una señal en dos lugares si eso da como resultado un enrutamiento mejorado, pero es poco probable que las heurísticas que se usan para eso lo hagan para una gran cantidad de señales.