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