FMADD Updated
diff --git a/verilog/rtl/FPU/FMADD_Add_Post_Normalization.v b/verilog/rtl/FPU/FMADD_Add_Post_Normalization.v
index e83f122..5d78cd6 100644
--- a/verilog/rtl/FPU/FMADD_Add_Post_Normalization.v
+++ b/verilog/rtl/FPU/FMADD_Add_Post_Normalization.v
@@ -7,6 +7,7 @@
parameter std = 31;
parameter man = 22;
parameter exp = 7;
+parameter lzd = 4;
//declaration of putptu ports
input [man+man+3:0] Post_Normalization_input_Mantissa;
@@ -22,7 +23,7 @@
wire [exp:0] Post_Normaliaation_Bit_Shamt_interim;
wire [exp:0] Post_Normaliaation_Bit_Shamt_1;
wire [23:0] Post_Normaliaation_Bit_input_LZD;
-wire [4:0] Post_Normaliaation_Bit_output_LZD;
+wire [lzd:0] Post_Normaliaation_Bit_output_LZD;
wire Post_Normaliaation_Bit_exp_LZD_Comp;
wire [exp:0] Post_Normaliaation_Bit_Shift_Amount;
wire [man+man+3:0] Post_Normalization_Shifter_Output_Sub,Post_Normalization_Shifter_Output_add,Post_Normalization_Shifter_input_add;
@@ -33,18 +34,19 @@
//instantition of LZD
- FMADD_PN_LZD m2 (
+ FMADD_PN_LZD Lzd_PN_AD (
.FMADD_PN_LZD_input_man_48 ( Post_Normaliaation_Bit_input_LZD ),
.FMADD_PN_LZD_output_pos ( Post_Normaliaation_Bit_output_LZD)
) ;
-
+ defparam Lzd_PN_AD.man = man;
+ defparam Lzd_PN_AD.lzd = lzd;
//main functionality
//subtraction lane
assign Post_Normaliaation_Bit_Shamt_interim = Post_Normalization_input_exponent - 1'b1;
assign Post_Normaliaation_Bit_Shamt_1 = (Post_Normalization_input_Eff_sub) ? Post_Normaliaation_Bit_Shamt_interim : 8'h00;
-assign Post_Normaliaation_Bit_input_LZD = (Post_Normalization_input_Eff_sub) ? Post_Normalization_input_Mantissa[man+man+3:man+2] : {(man+2){1'b0}};
+assign Post_Normaliaation_Bit_input_LZD = (Post_Normalization_input_Eff_sub) ? { { 24-(man+2){1'b0} },Post_Normalization_input_Mantissa[man+man+3:man+2]} : {man+2{1'b0}};
assign Post_Normaliaation_Bit_exp_LZD_Comp = Post_Normalization_input_exponent > Post_Normaliaation_Bit_output_LZD;
assign Post_Normaliaation_Bit_Shift_Amount = (Post_Normaliaation_Bit_exp_LZD_Comp) ? { {exp-4 {1'b0}},Post_Normaliaation_Bit_output_LZD} : Post_Normaliaation_Bit_Shamt_1 ;
assign Post_Normalization_Shifter_Output_Sub = Post_Normalization_input_Mantissa << Post_Normaliaation_Bit_Shift_Amount;
@@ -53,7 +55,7 @@
//additio lanse
assign Post_Normaliaation_EFF_add_interim_Exponent = {1'b0,Post_Normalization_input_exponent} + Post_Normalization_input_Carry ;
-assign Post_Normalization_Shifter_input_add = (Post_Normalization_input_Eff_add) ? Post_Normalization_input_Mantissa : {(man+man+4){1'b0}};
+assign Post_Normalization_Shifter_input_add = (Post_Normalization_input_Eff_add) ? Post_Normalization_input_Mantissa : 48'h000000000000;
assign Post_Normalization_Shifter_Output_add = (Post_Normalization_input_Carry) ? { Post_Normalization_input_Carry,Post_Normalization_Shifter_input_add[man+man+3:1] } : Post_Normalization_Shifter_input_add[man+man+3:0] ;
//Output Selestion and Round bits extarcion
diff --git a/verilog/rtl/FPU/FMADD_Exponent_Matching.v b/verilog/rtl/FPU/FMADD_Exponent_Matching.v
index bc8c78c..57fe640 100644
--- a/verilog/rtl/FPU/FMADD_Exponent_Matching.v
+++ b/verilog/rtl/FPU/FMADD_Exponent_Matching.v
@@ -1,6 +1,6 @@
//module is responsible for matching the exponents for addition
-module FMADD_Exponent_Matching (Exponent_Matching_input_Sign_A,Exponent_Matching_input_Sign_B,Exponent_Matching_input_Exp_A,Exponent_Matching_input_Exp_B,Exponent_Matching_input_Mantissa_A,Exponent_Matching_input_Mantissa_B,Exponent_Matching_input_opcode,Exponent_Matching_output_Mantissa_A,Exponent_Matching_output_Mantissa_B,Exponent_Matching_output_Exp,Exponent_Matching_output_Guard,Exponent_Matching_output_Round,Exponent_Matching_output_Sticky,Exponent_Matching_output_Sign,Exponent_Matching_output_Eff_Sub,Exponent_Matching_output_Eff_add);
+module FMADD_Exponent_Matching (Exponent_Matching_input_Sign_A,Exponent_Matching_input_Sign_B,Exponent_Matching_input_Exp_A,Exponent_Matching_input_Exp_B,Exponent_Matching_input_Mantissa_A,Exponent_Matching_input_Mantissa_B,Exponent_Matching_input_opcode,Exponent_Matching_output_Mantissa_A,Exponent_Matching_output_Mantissa_B,Exponent_Matching_output_Exp,Exponent_Matching_output_Guard,Exponent_Matching_output_Round,Exponent_Matching_output_Sticky,Exponent_Matching_output_Sign,Exponent_Matching_output_Eff_Sub,Exponent_Matching_output_Eff_add,Exponent_Matching_output_Exp_Diff_Check);
//defination of prameters
parameter std =31;
@@ -17,11 +17,10 @@
input [1:0] Exponent_Matching_input_opcode;
//declaration of putptu ports
-output Exponent_Matching_output_Sign;
+output Exponent_Matching_output_Sign , Exponent_Matching_output_Exp_Diff_Check;
output [man+man+3:0] Exponent_Matching_output_Mantissa_A,Exponent_Matching_output_Mantissa_B;
output [exp:0] Exponent_Matching_output_Exp;
output Exponent_Matching_output_Guard,Exponent_Matching_output_Round,Exponent_Matching_output_Sticky,Exponent_Matching_output_Eff_Sub,Exponent_Matching_output_Eff_add;
-
//main funtionality
//declaration for wires
@@ -65,10 +64,14 @@
//decision of xponent
assign Exponent_Matching_output_Exp = Exponent_Matching_Exp_Sub_input_1;
+//Decision for the exponent difference on the basis of which this is t be decided that either 1 or 0 will be added in the compliment_B and recompliment of the final answer (Please refer to the documentation fo detailed analyssis)
+assign Exponent_Matching_output_Exp_Diff_Check = Exponent_Matching_Shif_Amount >= 8'b00110000 ;
+
+
//decision fo rrounding bits
assign Exponent_Matching_output_Guard = Exponent_Matching_Shifter_output[man+man+3] ;
assign Exponent_Matching_output_Round = Exponent_Matching_Shifter_output[man+man+2] ;
-assign Exponent_Matching_output_Sticky = (Exponent_Matching_Shif_Amount >= 96) ? 1'b1: (|Exponent_Matching_Shifter_output [man+man+1:0]) ;
+assign Exponent_Matching_output_Sticky = ( &(~Exponent_Matching_Shifter_output) ) ? 1'b1: (|Exponent_Matching_Shifter_output [man+man+1:0]) ;
endmodule
\ No newline at end of file
diff --git a/verilog/rtl/FPU/FMADD_LZD_L4.v b/verilog/rtl/FPU/FMADD_LZD_L4.v
index 816bd8e..a0815fa 100644
--- a/verilog/rtl/FPU/FMADD_LZD_L4.v
+++ b/verilog/rtl/FPU/FMADD_LZD_L4.v
@@ -25,7 +25,6 @@
L4_wire_output_val & L4_wire_output_pos[1],
L4_wire_output_val & L4_wire_output_pos[0]};
-//5'b1100 == 2;s compliment of 8, 8 is subtracted from the final result since the LZD is of 32 bit and actual data is of 24 bit.
-assign L4_output_pos = L4_wire_output_pos_32 + 5'b11000;
+assign L4_output_pos = L4_wire_output_pos_32 ;
-endmodule
+endmodule
\ No newline at end of file
diff --git a/verilog/rtl/FPU/FMADD_LZD_main.v b/verilog/rtl/FPU/FMADD_LZD_main.v
index 8a52ce0..1b22a0c 100644
--- a/verilog/rtl/FPU/FMADD_LZD_main.v
+++ b/verilog/rtl/FPU/FMADD_LZD_main.v
@@ -6,12 +6,15 @@
module FMADD_PN_LZD (FMADD_PN_LZD_input_man_48, FMADD_PN_LZD_output_pos);
-
-parameter layer = 1;
+parameter lzd = 4;
+parameter man = 22;
input [23 : 0]FMADD_PN_LZD_input_man_48;
-output [4: 0]FMADD_PN_LZD_output_pos;
+output [lzd : 0]FMADD_PN_LZD_output_pos;
+
+wire [4 : 0]FMADD_PN_LZD_output_pos_interim_1;
+wire [5 : 0]FMADD_PN_LZD_output_pos_interim_2;
wire [23 : 0] LZD_wire_output_L0;
wire [17 : 0] LZD_wire_output_L1;
@@ -31,6 +34,14 @@
FMADD_LZD_layer_3 L3 (.L3_input_pos_val(LZD_wire_output_L2), .L3_output_pos_val(LZD_wire_output_L3));
//Layer 4
-FMADD_LZD_layer_4 L4 (.L4_input_pos_val(LZD_wire_output_L3), .L4_output_pos(FMADD_PN_LZD_output_pos));
+FMADD_LZD_layer_4 L4 (.L4_input_pos_val(LZD_wire_output_L3), .L4_output_pos(FMADD_PN_LZD_output_pos_interim_1));
-endmodule
+assign FMADD_PN_LZD_output_pos_interim_2 =
+(man == 22) ? (({1'b0,FMADD_PN_LZD_output_pos_interim_1}) + 6'b011000) : //-8 for SP
+(man == 9 ) ? (({1'b0,FMADD_PN_LZD_output_pos_interim_1}) + 6'b101011) : //-21 for IEEE16
+ (({1'b0,FMADD_PN_LZD_output_pos_interim_1}) + 6'b101000) ; //-24 for Bf16
+
+
+assign FMADD_PN_LZD_output_pos = FMADD_PN_LZD_output_pos_interim_2[lzd : 0];
+
+endmodule
\ No newline at end of file
diff --git a/verilog/rtl/FPU/FMADD_Top_Single_Cycle.v b/verilog/rtl/FPU/FMADD_Top_Single_Cycle.v
index 781d5c2..e79a7ba 100644
--- a/verilog/rtl/FPU/FMADD_Top_Single_Cycle.v
+++ b/verilog/rtl/FPU/FMADD_Top_Single_Cycle.v
@@ -54,11 +54,12 @@
`include "FMADD_add_rounding_Block.v"
*/
+
module FPU_FMADD_SUBB_Top (FMADD_SUBB_input_IEEE_A, FMADD_SUBB_input_IEEE_B, FMADD_SUBB_input_IEEE_C, FMADD_SUBB_input_opcode,rst_l,FMADD_SUBB_input_Frm,FMADD_SUBB_output_IEEE_FMADD, FMADD_SUBB_output_S_Flags_FMADD, FMADD_SUBB_output_IEEE_FMUL, FMADD_SUBB_output_S_Flags_FMUL );
parameter std =31;
parameter man =22;
-parameter exp = 7;
+parameter exp =7;
parameter bias = 127;
parameter lzd = 4;
@@ -172,20 +173,33 @@
//instantiation of LZD module
wire [23:0] input_LZD;
-wire [lzd : 0] output_interim_LZD, output_interim_1_LZD;
+//wire [4:0] output_LZD;
+wire [lzd : 0] output_LZD;
-assign input_LZD = (output_interim_A_sub_norm) ? output_interim_M_G_A[man+1:0] : output_interim_M_G_B[man+1:0] ;
+
+wire [23 : 0] input_interim_A_LZD, input_interim_B_LZD ;
+
+assign input_interim_A_LZD =
+(man == 22) ? (output_interim_M_G_A[man+1:0]) : //-8 for SP
+(man == 9 ) ? ({ ({(24-(man+2)){1'b0}}) ,(output_interim_M_G_A[man+1:0])}) : //-21 for IEEE16, concatinate 24-(man+2) zero to make the mantissa size == 24
+ ({ ({(24-(man+2)){1'b0}}) ,(output_interim_M_G_A[man+1:0])}) ; //-24 for Bf16, concatinate 24-(man+2) zero to make the mantissa size == 24
+assign input_interim_B_LZD =
+(man == 22) ? (output_interim_M_G_B[man+1:0]) : //-8 for SP
+(man == 9 ) ? ({ ({(24-(man+2)){1'b0}}) ,(output_interim_M_G_B[man+1:0])}) : //-21 for IEEE16, concatinate 24-(man+2) zero to make the mantissa size == 24
+ ({ ({(24-(man+2)){1'b0}}) ,(output_interim_M_G_B[man+1:0])}) ; //-24 for Bf16, concatinate 24-(man+2) zero to make the mantissa size == 24
+
+assign input_LZD = (output_interim_A_sub_norm) ? input_interim_A_LZD : input_interim_B_LZD ;
+
+
+//assign input_LZD = (output_interim_A_sub_norm) ? output_interim_M_G_A[man+1:0] : output_interim_M_G_B[man+1:0] ;
FMADD_PN_LZD Leading_Zero_detection (
.FMADD_PN_LZD_input_man_48(input_LZD),
- .FMADD_PN_LZD_output_pos(output_interim_LZD)
-);
-
-//5'b1100 == 2;s compliment of 8, 8 is subtracted from the final result since the LZD is of 32 bit and actual data is of 24 bit.
-//assign to_add_in_lzd_mul = (output_interim_LZD + 5'b11000);
-assign output_interim_1_LZD = output_interim_LZD ;
-
+ .FMADD_PN_LZD_output_pos(output_LZD)
+ );
+defparam Leading_Zero_detection.man = man;
+defparam Leading_Zero_detection.lzd = lzd;
//post normalaization Module
wire [1+exp+2*(man+2):0] output_interim_post_normalization_IEEE;
@@ -195,7 +209,7 @@
. FMADD_PN_MUL_input_sign (output_interim_exponent_addition_sign),
. FMADD_PN_MUL_input_multiplied_man (output_interim_mantissa_multiplication),
. FMADD_PN_MUL_input_exp_DB (output_interim_exponent_addition),
- . FMADD_PN_MUL_input_lzd (output_interim_1_LZD),
+ . FMADD_PN_MUL_input_lzd (output_LZD),
. FMADD_PN_MUL_input_A_sub (output_interim_A_sub_norm),
. FMADD_PN_MUL_input_B_sub (output_interim_B_sub_norm),
. FMADD_PN_MUL_input_A_pos (output_interim_A_pos_exp),
@@ -251,7 +265,7 @@
wire output_interim_Exponent_Mathcing_Guard;
wire output_interim_Exponent_Mathcing_Round;
wire output_interim_Exponent_Mathcing_Sticky;
-
+wire output_interim_Exponent_Mathcing_Exp_Diff_Check;
FMADD_Exponent_Matching Exponent_Matching (
@@ -270,7 +284,8 @@
.Exponent_Matching_output_Round( output_interim_Exponent_Mathcing_Round),
.Exponent_Matching_output_Sticky( output_interim_Exponent_Mathcing_Sticky),
.Exponent_Matching_output_Eff_Sub( output_interim_Exponent_Mathcing_Eff_sub),
- .Exponent_Matching_output_Eff_add( output_interim_Exponent_Mathcing_Eff_add)
+ .Exponent_Matching_output_Eff_add( output_interim_Exponent_Mathcing_Eff_add),
+ .Exponent_Matching_output_Exp_Diff_Check (output_interim_Exponent_Mathcing_Exp_Diff_Check)
);
defparam Exponent_Matching.std = std;
defparam Exponent_Matching.exp = exp;
@@ -285,7 +300,8 @@
.Mantissa_Addition_input_Mantissa_B( output_interim_Exponent_Mathcing_Mantissa_B),
.Mantissa_Addition_input_Eff_Sub( output_interim_Exponent_Mathcing_Eff_sub),
.Mantissa_Addition_output_Mantissa(output_interim_Mantissa_Addition_Mantissa ),
- .Mantissa_Addition_output_Carry(output_interim_Mantissa_Addition_Carry)
+ .Mantissa_Addition_output_Carry(output_interim_Mantissa_Addition_Carry),
+ .Mantissa_Addition_input_Exp_Diff_Check (output_interim_Exponent_Mathcing_Exp_Diff_Check)
);
defparam Mantissa_Addition.std = std;
defparam Mantissa_Addition.exp = exp;
diff --git a/verilog/rtl/FPU/FMADD_mantissa_addition.v b/verilog/rtl/FPU/FMADD_mantissa_addition.v
index 6df4a66..d50180d 100644
--- a/verilog/rtl/FPU/FMADD_mantissa_addition.v
+++ b/verilog/rtl/FPU/FMADD_mantissa_addition.v
@@ -1,7 +1,7 @@
//mantissa addition module
-module FMADD_Mantissa_Addition( Mantissa_Addition_input_Mantissa_A,Mantissa_Addition_input_Mantissa_B,Mantissa_Addition_input_Eff_Sub,Mantissa_Addition_output_Mantissa, Mantissa_Addition_output_Carry );
+module FMADD_Mantissa_Addition( Mantissa_Addition_input_Mantissa_A,Mantissa_Addition_input_Mantissa_B,Mantissa_Addition_input_Eff_Sub,Mantissa_Addition_output_Mantissa, Mantissa_Addition_output_Carry,Mantissa_Addition_input_Exp_Diff_Check );
//declaration of paramters
parameter std =31;
@@ -11,6 +11,7 @@
//declaration of input ports
input [man+man+3:0] Mantissa_Addition_input_Mantissa_A,Mantissa_Addition_input_Mantissa_B;
input Mantissa_Addition_input_Eff_Sub;
+input Mantissa_Addition_input_Exp_Diff_Check;
/*
opcode[0]= fadd;
@@ -21,19 +22,19 @@
wire [man+man+3:0] interim_mantissa_B,interim_mantissa_B_adder;
wire Mantissa_Addition_interim_Carry;
wire [man+man+3:0] Mantissa_Addition_Compliment_B;
-wire Mantissa_Addition_interim_Compliment_Carry;
+
//declartion of output piorts
output Mantissa_Addition_output_Carry;
output [man+man+3:0] Mantissa_Addition_output_Mantissa;
//Main functionality
-assign {Mantissa_Addition_interim_Compliment_Carry,Mantissa_Addition_Compliment_B} = ( {1'b0,(~(Mantissa_Addition_input_Mantissa_B))} + 1'b1);
+assign Mantissa_Addition_Compliment_B = ( (~(Mantissa_Addition_input_Mantissa_B)) + (~Mantissa_Addition_input_Exp_Diff_Check) );
assign interim_mantissa_B = (Mantissa_Addition_input_Eff_Sub) ? Mantissa_Addition_Compliment_B : Mantissa_Addition_input_Mantissa_B ;
assign {Mantissa_Addition_interim_Carry,interim_mantissa_B_adder} = {1'b0, interim_mantissa_B} + {1'b0,Mantissa_Addition_input_Mantissa_A};
-assign Mantissa_Addition_output_Mantissa = ( (~Mantissa_Addition_interim_Carry) & Mantissa_Addition_input_Eff_Sub & (~Mantissa_Addition_interim_Compliment_Carry) ) ? ( ~(interim_mantissa_B_adder) + 1'b1 ) : interim_mantissa_B_adder;
+assign Mantissa_Addition_output_Mantissa = ( (~Mantissa_Addition_interim_Carry) & Mantissa_Addition_input_Eff_Sub ) ? ( ~(interim_mantissa_B_adder) + (~Mantissa_Addition_input_Exp_Diff_Check) ) : interim_mantissa_B_adder;
assign Mantissa_Addition_output_Carry = Mantissa_Addition_interim_Carry;
diff --git a/verilog/rtl/FPU/FMADD_rounding_block_Multiplication.v b/verilog/rtl/FPU/FMADD_rounding_block_Multiplication.v
index 812bf9c..cc5705b 100644
--- a/verilog/rtl/FPU/FMADD_rounding_block_Multiplication.v
+++ b/verilog/rtl/FPU/FMADD_rounding_block_Multiplication.v
@@ -13,7 +13,7 @@
output [std : 0] FMADD_ROUND_MUL_output_no;
output [2 : 0]FMADD_ROUND_MUL_output_S_Flags;
-assign FMADD_ROUND_MUL_output_S_Flags = {FMADD_ROUND_MUL_output_overflow,FMADD_ROUND_MUL_output_underflow,FMADD_ROUND_MUL_output_inexact};
+
wire FMADD_ROUND_MUL_output_inexact, FMADD_ROUND_MUL_output_underflow, FMADD_ROUND_MUL_output_overflow;
@@ -25,6 +25,8 @@
wire [exp : 0] FMADD_ROUND_MUL_wire_rounded_exp;
wire [man : 0] FMADD_ROUND_MUL_wire_final_man;
+assign FMADD_ROUND_MUL_output_S_Flags = {FMADD_ROUND_MUL_output_overflow,FMADD_ROUND_MUL_output_underflow,FMADD_ROUND_MUL_output_inexact};
+
assign FMADD_ROUND_MUL_wire_guard = FMADD_ROUND_MUL_input_no[man+1];
assign FMADD_ROUND_MUL_wire_round = FMADD_ROUND_MUL_input_no[man];
assign FMADD_ROUND_MUL_wire_sticky = |FMADD_ROUND_MUL_input_no[man-1 : 0];
@@ -53,4 +55,4 @@
assign FMADD_ROUND_MUL_output_no = {FMADD_ROUND_MUL_input_no[man+man+exp+5], (FMADD_ROUND_MUL_wire_rounded_exp), FMADD_ROUND_MUL_wire_rounded_man[man:0]};
-endmodule
\ No newline at end of file
+endmodule