Estoy tratando de crear un cambiador de barril de n bits usando el diagrama en la respuesta a esta pregunta: enlace
He leído que si la variable en un bucle for tiene un solo nombre, entonces cada iteración de bucle tiene un alcance y una variable separados; sin embargo, no estoy seguro de si el rows en mi módulo barrel se creará en el mismo estilo que el diagrama de referencia de arriba. Este es mi módulo barrel :
module barrel
#(parameter n = 8; parameter control = $clog2(n))
(input logic[n-1:0] data, input logic [control-1:0] select,
output logic [n-1:0] result);
for(genvar i = 0; i < control; i++) begin : label
logic [n-1:0] tempResult;
always_comb
if(i == 0) row #(n,2**i) shiftLevel(data,select[i],tempResult);
else if(i == control-1) row #(n,2**i) shiftLevel(label[i-1].shiftLevel.tempResult,select[i],result);
else row #(n,2**i) shiftLevel(label[i-1].shiftLevel.tempResult,select[i],tempResult);
end
endmodule
Mi pregunta es esta: ¿el bucle label ed for conservará los módulos row que creo en cada iteración? ¿O cada row se destruye una vez que finaliza la iteración?
Aquí están los otros módulos que estoy usando para implementar esto:
módulo row :
module row
#(parameter n=8, parameter shift=4) // n is the number of bits
// shift is the max amount of shift at this level
(input logic [n-1:0] data,
input logic select,
output logic [n-1:0] end);
for(genvar i = 0; i < n; i++) begin : label
logic [1:0] dataTemp;
always_comb
dataTemp[0] <= data[i]; // 0 option of the mux is set to the normal data value
if(i+shift < n) dataTemp[1] <= data[i+shift]; // assigns the shifted bit
else dataTemp[0] <= 0; // assigns 0
mux2 bit(dataTemp,select,end[i]); // Assembles a mux for a bit of the row output
endmodule
2-1 módulo Mux:
module mux2(input logic [1:0] data, select,
output logic y);
assign y = select ? data[1] : data[0];
endmodule