¿Por qué cambiar un 'agregar' a una macrocelda CPLD lógica o devorar 7?

1

Tengo un diseño que se sintetiza en aproximadamente 50 macrocélulas.

Tengo esta sección de código:

module levers2(
     input [2:0] LL,
     input [2:0] RL,
    output reg [10:0] DIVISOR,
    output reg FAULT
    );

reg [10:0] grid[0:63];
wire [5:0] tmp = (LL<<3)+RL;
(snip)

tmp es para todos los intentos, una línea de dirección. Tengo dos líneas de entrada de 3 bits y las estoy combinando para formar una línea de dirección de 6 bits. Entonces muevo LL por tres bits y agrego RL . Cuando sintetizo, obtengo un resultado de macrocelda 47.

Sin embargo, si cambio el operador a un lógico o:

wire [5:0] tmp = (LL<<3) | RL;

El diseño sintetiza a 54 macrocélulas. ¡¿Eso es 7 macrocélulas perdidas para qué ?!

Pienso que sería poco a poco o sería eficiente y fácil, mucho más fácil que un complemento que tiene el equipaje extra del equipaje.

¿Alguien puede arrojar algo de luz sobre lo que está pasando?

EDICIÓN ---

Determiné que estaba usando más macrocélulas utilizando el mecanismo de informes de ISE. También probé algunas cosas diferentes (pero no el operador de concatenación que se menciona a continuación) y todo agregó 7 macrocélulas, excepto el 'agregar'. Me alegró que el comportamiento fuera consistente.

Como nota al margen, agregué un solo OR de 3 entradas a mi esquema de nivel superior y le di tres señales (salidas de falla) desde diferentes módulos. Esto añadió 9 macrocélulas. Puedes apostar a que encontré una nueva forma cuando vi eso, je.

    
pregunta Tony Ennis

1 respuesta

5

Si todo lo que quieres hacer es combinar dos arreglos más pequeños en un conjunto más amplio de señales, entonces es mejor usar el operador de concatenación:

wire [5:0] tmp = {LL, RL};

Con lo anterior, wire[5:3] se conectará a LL , y wire[2:0] se conectará a RL

Puedes usarlo en cualquier orden como:

wire[5:0] tmp = {RL, LL];

O incluso:

wire[5:0] tmp = {LL[0], RL, LL[2:1];

(puede ver cómo se puede usar para cambiar / rotar señales)

Aún así, no estoy seguro de por qué cambiar a la OR debería usar otras 7 macrocélulas, posiblemente (probablemente) porque la herramienta de síntesis está inferiendo un sumador con el operador + y el CPLD tiene una celda que puede usar, En contraposición a hacer el sumador a partir de unas pocas puertas.

¿Cómo determinaste esto? ¿Revisaste el esquema de la tecnología para ver qué se está creando?
Para ayudar a descubrir exactamente lo que está sucediendo, ver el resto del código de tus módulos sería útil (también puedo intentarlo en ISE aquí)

EDITAR: por curiosidad, escribí un pequeño módulo de prueba utilizando el bit relevante del código anterior. Intenté sintetizar (con la configuración predeterminada) para un Spartan-3A y el CPLD XC264A, con el + o el | . Ambos términos produjeron resultados idénticos para Spartan y CPLD, tanto en el visor de tecnología como en el informe de uso de macroceldas de lugar y ruta.
Con esta información, parece que debe tener algo que ver con el resto del diseño y posiblemente con la configuración de la herramienta de síntesis (optimización, etc.). El fragmento de código anterior solo debe concatenar las dos señales más pequeñas en una más grande, por lo que no debería ser necesaria ninguna lógica.

    
respondido por el Oli Glaser

Lea otras preguntas en las etiquetas