blob: 4ed778cc6f324c022f817437f83973ded7559bc4 [file] [log] [blame]
module fpu_ff
#(
parameter LEN = 32
)
(
in_i,
first_one_o,
no_ones_o
);
//parameter LEN = 32;
input wire [LEN - 1:0] in_i;
output wire [$clog2(LEN) - 1:0] first_one_o;
output wire no_ones_o;
localparam NUM_LEVELS = $clog2(LEN);
wire [(LEN * NUM_LEVELS) - 1:0] index_lut;
wire [(2 ** NUM_LEVELS) - 1:0] sel_nodes;
wire [((2 ** NUM_LEVELS) * NUM_LEVELS) - 1:0] index_nodes;
wire [LEN - 1:0] in_flipped;
genvar j;
generate
for (j = 0; j < LEN; j = j + 1) begin : genblk1
assign index_lut[j * NUM_LEVELS+:NUM_LEVELS] = $unsigned(j);
assign in_flipped[j] = in_i[(LEN - j) - 1];
end
endgenerate
genvar k;
genvar l;
genvar level;
generate
for (level = 0; level < NUM_LEVELS; level = level + 1) begin : genblk2
if (level < (NUM_LEVELS - 1)) begin : genblk1
for (l = 0; l < (2 ** level); l = l + 1) begin : genblk1
assign sel_nodes[((2 ** level) - 1) + l] = sel_nodes[((2 ** (level + 1)) - 1) + (l * 2)] | sel_nodes[(((2 ** (level + 1)) - 1) + (l * 2)) + 1];
assign index_nodes[(((2 ** level) - 1) + l) * NUM_LEVELS+:NUM_LEVELS] = (sel_nodes[((2 ** (level + 1)) - 1) + (l * 2)] == 1'b1 ? index_nodes[(((2 ** (level + 1)) - 1) + (l * 2)) * NUM_LEVELS+:NUM_LEVELS] : index_nodes[((((2 ** (level + 1)) - 1) + (l * 2)) + 1) * NUM_LEVELS+:NUM_LEVELS]);
end
end
if (level == (NUM_LEVELS - 1)) begin : genblk2
for (k = 0; k < (2 ** level); k = k + 1) begin : genblk1
if ((k * 2) < (LEN - 1)) begin : genblk1
assign sel_nodes[((2 ** level) - 1) + k] = in_flipped[k * 2] | in_flipped[(k * 2) + 1];
assign index_nodes[(((2 ** level) - 1) + k) * NUM_LEVELS+:NUM_LEVELS] = (in_flipped[k * 2] == 1'b1 ? index_lut[(k * 2) * NUM_LEVELS+:NUM_LEVELS] : index_lut[((k * 2) + 1) * NUM_LEVELS+:NUM_LEVELS]);
end
if ((k * 2) == (LEN - 1)) begin : genblk2
assign sel_nodes[((2 ** level) - 1) + k] = in_flipped[k * 2];
assign index_nodes[(((2 ** level) - 1) + k) * NUM_LEVELS+:NUM_LEVELS] = index_lut[(k * 2) * NUM_LEVELS+:NUM_LEVELS];
end
if ((k * 2) > (LEN - 1)) begin : genblk3
assign sel_nodes[((2 ** level) - 1) + k] = 1'b0;
assign index_nodes[(((2 ** level) - 1) + k) * NUM_LEVELS+:NUM_LEVELS] = 1'sb0;
end
end
end
end
endgenerate
assign first_one_o = index_nodes[0+:NUM_LEVELS];
assign no_ones_o = ~sel_nodes[0];
endmodule