Supongamos que tenemos un módulo con una salida de 32 bits como este:
module ModuleLow(foo,...);
output [31:0] foo;
Ahora queremos usarlo en otro módulo (¡un ejemplo muy simple!):
module ModuleHigh( ..,reset,..);
input reset;
wire [31:0] fooWire;
reg [31:0] fooReg;
ModuleLow module1(.foo(fooWire), ...)
always @(posedge GCLK)
if(reset)
begin
fooReg<= fooWire; // TRIAL-1: fooReg<= 12345.....; => 2.3ns
end
else
fooReg<=fooReg+1; //TRIAL-2 : fooReg<=fooWire+1; => 18ns
Este es un método muy común para pasar un valor entre módulos (wire - > reg). Pero en mi caso, conduce a un cable de 2028 bits que reduce notablemente la velocidad de un Spartan-III a 12ns .
He intentado estos:
1- Cuando sustituyo la instrucción fooReg<= fooWire
con un número (como: fooReg<=12345....;
TRIAL-1 en el código), el rendimiento salta alto (GCLK valor de restricción de tiempo < 2.5 ns ).
2- Cuando uso el cable (usando fooReg<=fooWire+1
; TRIAL-2 en el ejemplo de código), el rendimiento disminuye aún más ( 18ns )
De estos experimentos, llegué a la conclusión de que es mucho más fácil de usar usar registros dentro de un bloque en lugar de cables (¿problemas de enrutamiento y DRC?).
Estaba pensando si hay una manera de omitir ese cable intermedio entre los módulos. Esto puede eliminar el cableado en la parte "TRIAL-1" (asignación inicial) que conduce a un mayor rendimiento. Algo como esto:
ModuleLow module1(.foo(fooReg), ...); // using registry without a wire.
Creo que esto es ilegal en Verilog (ISE WebPack v14.7 da error como problema de asignación de valores) pero estoy buscando algún truco o algo si existe.