Utilizando Verilog, ¿cómo puedo sintetizar el recuento de cero inicial más rápido en un número de 64 bits?
Inicialmente fui con un CASEX (..), con muchas líneas 01xxxxx, 001xxxxx pero entiendo que esto sintetiza un cambiador de barriles que no estoy seguro de que sea rápido.
Mi pregunta es esta: ¿cuál es la forma más rápida de llegar a la salida ... cómo se verían las puertas?
Finalmente se me ocurrió esta solución pero no estoy seguro de si se sintetizará en algo más rápido que lo anterior.
La respuesta a los ceros iniciales en un número de 64 bits es el número de ceros iniciales en los primeros 32 bits (si hay alguno que no sea cero) o es 32 + el número de ceros iniciales en los 32 bits más bajos. Eso te da la respuesta al sexto bit de la respuesta. A continuación, debe encontrar el número de ceros iniciales en el número de 32 bits, de modo que aplique las mismas reglas. Tuve que hacer un If / else para lidiar con todos los ceros.
VERILOG:
// Leading zero count of Sj
if (Sj_int[63:0] == 64'b0)
tmp_cnt = 64;
else
begin
tmp_cnt[6] = 1'b0;
tmp_cnt[5] = (Sj_int[63:31] == 32'b0);
val32 = tmp_cnt[5] ? Sj_int[31:0] : Sj_int[63:32];
tmp_cnt[4] = (val32[31:16] == 16'b0);
val16 = tmp_cnt[4] ? val32[15:0] : val32[31:16];
tmp_cnt[3] = (val16[15:8] == 8'b0);
val8 = tmp_cnt[3] ? val16[7:0] : val16 [15:8];
tmp_cnt[2] = (val8[7:4] == 4'b0);
val4 = tmp_cnt[2] ? val8[3:0] : val8[7:4];
tmp_cnt[1] = (val4[3:2] == 2'b0);
tmp_cnt[0] = tmp_cnt[1] ? ~val4[1] : ~val4[3];
end
o_Si <= tmp_cnt[6:0];
end