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
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.
[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.
usuario_1818839
Paebbels