@@ -17,19 +17,8 @@ module int18_to_bf16_lzd #(
1717 assign sign = acc[17 ];
1818 assign mag = sign ? - acc : acc;
1919
20- // ===================== HIERARCHICAL LEADING ZERO DETECTOR =====================
21- wire [2 :0 ] lz_hi, lz_mid, lz_lo;
22- wire nz_hi, nz_mid, nz_lo;
23-
24- lzd6 lzd_hi (.x (mag[17 :12 ]), .lz(lz_hi), .nz(nz_hi));
25- lzd6 lzd_mid (.x (mag[11 :6 ]), .lz(lz_mid), .nz(nz_mid));
26- lzd6 lzd_lo (.x (mag[5 :0 ]), .lz(lz_lo), .nz(nz_lo));
20+ lzd18 lzd_inst (.x (mag), .lz(lz));
2721
28- assign lz = nz_hi ? {2'b00 , lz_hi} :
29- nz_mid ? 5'd6 + {2'b00 , lz_mid} :
30- nz_lo ? 5'd12 + {2'b00 , lz_lo} :
31- 5'd18 ;
32-
3322 assign exp_unbiased = 9 '(17 ) - 9 '(lz) - 9 '(FRAC_BITS);
3423
3524 assign normalized = mag << lz;
@@ -54,23 +43,32 @@ module int18_to_bf16_lzd #(
5443 end
5544endmodule
5645
57- // ===================== 6-BIT LEADING ZERO DETECTOR =====================
58- module lzd6 (
59- input wire [5 :0 ] x ,
60- output reg [2 :0 ] lz,
61- output wire nz // Non-zero flag
46+ module lzd18 (
47+ input wire [17 :0 ] x ,
48+ output reg [4 :0 ] lz // 5-bit output for 0 to 18
6249);
63- assign nz = | x ;
6450
6551 always @(* ) begin
6652 casez (x )
67- 6'b1 ?????: lz = 3'd0 ;
68- 6'b01 ????: lz = 3'd1 ;
69- 6'b001 ???: lz = 3'd2 ;
70- 6'b0001 ??: lz = 3'd3 ;
71- 6'b00001 ?: lz = 3'd4 ;
72- 6'b000001 : lz = 3'd5 ;
73- default : lz = 3'd6 ;
53+ 18'b1 ?????????????????: lz = 5'd0 ;
54+ 18'b01 ????????????????: lz = 5'd1 ;
55+ 18'b001 ???????????????: lz = 5'd2 ;
56+ 18'b0001 ??????????????: lz = 5'd3 ;
57+ 18'b00001 ?????????????: lz = 5'd4 ;
58+ 18'b000001 ????????????: lz = 5'd5 ;
59+ 18'b0000001 ???????????: lz = 5'd6 ;
60+ 18'b00000001 ??????????: lz = 5'd7 ;
61+ 18'b000000001 ?????????: lz = 5'd8 ;
62+ 18'b0000000001 ????????: lz = 5'd9 ;
63+ 18'b00000000001 ???????: lz = 5'd10 ;
64+ 18'b000000000001 ??????: lz = 5'd11 ;
65+ 18'b0000000000001 ?????: lz = 5'd12 ;
66+ 18'b00000000000001 ????: lz = 5'd13 ;
67+ 18'b000000000000001 ???: lz = 5'd14 ;
68+ 18'b0000000000000001 ??: lz = 5'd15 ;
69+ 18'b00000000000000001 ?: lz = 5'd16 ;
70+ 18'b000000000000000001 : lz = 5'd17 ;
71+ default : lz = 5'd18 ; // All zeros
7472 endcase
7573 end
7674endmodule
0 commit comments