📄 post_norm.v
字号:
// ---------------------------------------------------------------------// Round// Extract rounding (GRS) bitsassign grs_sel_div = op_div & (exp_ovf[1] | div_dn | exp_out1_co | exp_out_00);assign g = grs_sel_div ? fract_out[0] : fract_out[0];assign r = grs_sel_div ? (fract_trunc[24] & !div_nr) : fract_trunc[24];assign s = grs_sel_div ? |fract_trunc[24:0] : (|fract_trunc[23:0] | (fract_trunc[24] & op_div));// Round to nearest evenassign round = (g & r) | (r & s) ;assign {exp_rnd_adj0, fract_out_rnd0} = round ? fract_out_pl1 : {1'b0, fract_out};assign exp_out_rnd0 = exp_rnd_adj0 ? exp_out_pl1 : exp_out;assign ovf0 = exp_out_final_ff & !rmode_01 & !op_f2i;// round to zeroassign fract_out_rnd1 = (exp_out_ff & !op_div & !dn & !op_f2i) ? 23'h7fffff : fract_out;assign exp_fix_div = (fi_ldz>22) ? exp_fix_diva : exp_fix_divb;assign exp_out_rnd1 = (g & r & s & exp_in_ff) ? (op_div ? exp_fix_div : exp_next_mi[7:0]) : (exp_out_ff & !op_f2i) ? exp_in : exp_out;assign ovf1 = exp_out_ff & !dn;// round to +inf (UP) and -inf (DOWN)assign r_sign = sign;assign round2a = !exp_out_fe | !fract_out_7fffff | (exp_out_fe & fract_out_7fffff);assign round2_fasu = ((r | s) & !r_sign) & (!exp_out[7] | (exp_out[7] & round2a));assign round2_fmul = !r_sign & ( (exp_ovf[1] & !fract_in_00 & ( ((!exp_out1_co | op_dn) & (r | s | (!rem_00 & op_div) )) | fract_out_00 | (!op_dn & !op_div)) ) | ( (r | s | (!rem_00 & op_div)) & ( (!exp_ovf[1] & (exp_in_80 | !exp_ovf[0])) | op_div | ( exp_ovf[1] & !exp_ovf[0] & exp_out1_co) ) ) );assign round2_f2i = rmode_10 & (( |fract_in[23:0] & !opas & (exp_in<8'h80 )) | (|fract_trunc));assign round2 = (op_mul | op_div) ? round2_fmul : op_f2i ? round2_f2i : round2_fasu;assign {exp_rnd_adj2a, fract_out_rnd2a} = round2 ? fract_out_pl1 : {1'b0, fract_out};assign exp_out_rnd2a = exp_rnd_adj2a ? ((exp_ovf[1] & op_mul) ? exp_out_mi1 : exp_out_pl1) : exp_out;assign fract_out_rnd2 = (r_sign & exp_out_ff & !op_div & !dn & !op_f2i) ? 23'h7fffff : fract_out_rnd2a;assign exp_out_rnd2 = (r_sign & exp_out_ff & !op_f2i) ? 8'hfe : exp_out_rnd2a;// Choose rounding modealways @(rmode or exp_out_rnd0 or exp_out_rnd1 or exp_out_rnd2) case(rmode) // synopsys full_case parallel_case 0: exp_out_rnd = exp_out_rnd0; 1: exp_out_rnd = exp_out_rnd1; 2,3: exp_out_rnd = exp_out_rnd2; endcasealways @(rmode or fract_out_rnd0 or fract_out_rnd1 or fract_out_rnd2) case(rmode) // synopsys full_case parallel_case 0: fract_out_rnd = fract_out_rnd0; 1: fract_out_rnd = fract_out_rnd1; 2,3: fract_out_rnd = fract_out_rnd2; endcase// ---------------------------------------------------------------------// Final Output Mux// Fix Output for denormalized and special numberswire max_num, inf_out;assign max_num = ( !rmode_00 & (op_mul | op_div ) & ( ( exp_ovf[1] & exp_ovf[0]) | (!exp_ovf[1] & !exp_ovf[0] & exp_in_ff & (fi_ldz_2<24) & (exp_out!=8'hfe) ) ) ) | ( op_div & ( ( rmode_01 & ( div_inf | (exp_out_ff & !exp_ovf[1] ) | (exp_ovf[1] & exp_ovf[0] ) ) ) | ( rmode[1] & !exp_ovf[1] & ( ( exp_ovf[0] & exp_in_ff & r_sign & fract_in[47] ) | ( r_sign & ( (fract_in[47] & div_inf) | (exp_in[7] & !exp_out_rnd[7] & !exp_in_80 & exp_out!=8'h7f ) | (exp_in[7] & exp_out_rnd[7] & r_sign & exp_out_ff & op_dn & div_exp1>9'h0fe ) ) ) | ( exp_in_00 & r_sign & ( div_inf | (r_sign & exp_out_ff & fi_ldz_2<24) ) ) ) ) ) );assign inf_out = (rmode[1] & (op_mul | op_div) & !r_sign & ( (exp_in_ff & !op_div) | (exp_ovf[1] & exp_ovf[0] & (exp_in_00 | exp_in[7]) ) ) ) | (div_inf & op_div & ( rmode_00 | (rmode[1] & !exp_in_ff & !exp_ovf[1] & !exp_ovf[0] & !r_sign ) | (rmode[1] & !exp_ovf[1] & exp_ovf[0] & exp_in_00 & !r_sign) ) ) | (op_div & rmode[1] & exp_in_ff & op_dn & !r_sign & (fi_ldz_2 < 24) & (exp_out_rnd!=8'hfe) );assign fract_out_final = (inf_out | ovf0 | output_zero ) ? 23'h0 : (max_num | (f2i_max & op_f2i) ) ? 23'h7fffff : fract_out_rnd;assign exp_out_final = ((op_div & exp_ovf[1] & !exp_ovf[0]) | output_zero ) ? 8'h00 : ((op_div & exp_ovf[1] & exp_ovf[0] & rmode_00) | inf_out | (f2i_max & op_f2i) ) ? 8'hff : max_num ? 8'hfe : exp_out_rnd;// ---------------------------------------------------------------------// Pack Resultassign out = {exp_out_final, fract_out_final};// ---------------------------------------------------------------------// Exceptionswire underflow_fmul;wire overflow_fdiv;wire undeflow_div;wire z = shft_co | ( exp_ovf[1] | exp_in_00) | (!exp_ovf[1] & !exp_in_00 & (exp_out1_co | exp_out_00));assign underflow_fmul = ( (|fract_trunc) & z & !exp_in_ff ) | (fract_out_00 & !fract_in_00 & exp_ovf[1]);assign undeflow_div = !(exp_ovf[1] & exp_ovf[0] & rmode_00) & !inf_out & !max_num & exp_out_final!=8'hff & ( ((|fract_trunc) & !opb_dn & ( ( op_dn & !exp_ovf[1] & exp_ovf[0]) | ( op_dn & exp_ovf[1]) | ( op_dn & div_shft1_co) | exp_out_00 | exp_ovf[1] ) ) | ( exp_ovf[1] & !exp_ovf[0] & ( ( op_dn & exp_in>8'h16 & fi_ldz<23) | ( op_dn & exp_in<23 & fi_ldz<23 & !rem_00) | ( !op_dn & (exp_in[7]==exp_div[7]) & !rem_00) | ( !op_dn & exp_in_00 & (exp_div[7:1]==7'h7f) ) | ( !op_dn & exp_in<8'h7f & exp_in>8'h20 ) ) ) | (!exp_ovf[1] & !exp_ovf[0] & ( ( op_dn & fi_ldz<23 & exp_out_00) | ( exp_in_00 & !rem_00) | ( !op_dn & ldz_all<23 & exp_in==1 & exp_out_00 & !rem_00) ) ) );assign underflow = op_div ? undeflow_div : op_mul ? underflow_fmul : (!fract_in[47] & exp_out1_co) & !dn;assign overflow_fdiv = inf_out | (!rmode_00 & max_num) | (exp_in[7] & op_dn & exp_out_ff) | (exp_ovf[0] & (exp_ovf[1] | exp_out_ff) );assign overflow = op_div ? overflow_fdiv : (ovf0 | ovf1);wire f2i_ine;assign f2i_ine = (f2i_zero & !fract_in_00 & !opas) | (|fract_trunc) | (f2i_zero & (exp_in<8'h80) & opas & !fract_in_00) | (f2i_max & rmode_11 & (exp_in<8'h80));assign ine = op_f2i ? f2i_ine : op_i2f ? (|fract_trunc) : ((r & !dn) | (s & !dn) | max_num | (op_div & !rem_00));// ---------------------------------------------------------------------// Debugging Stuff// synopsys translate_offwire [26:0] fracta_del, fractb_del;wire [2:0] grs_del;wire dn_del;wire [7:0] exp_in_del;wire [7:0] exp_out_del;wire [22:0] fract_out_del;wire [47:0] fract_in_del;wire overflow_del;wire [1:0] exp_ovf_del;wire [22:0] fract_out_x_del, fract_out_rnd2a_del;wire [24:0] trunc_xx_del;wire exp_rnd_adj2a_del;wire [22:0] fract_dn_del;wire [4:0] div_opa_ldz_del;wire [23:0] fracta_div_del;wire [23:0] fractb_div_del;wire div_inf_del;wire [7:0] fi_ldz_2_del;wire inf_out_del, max_out_del;wire [5:0] fi_ldz_del;wire rx_del;wire ez_del;wire lr;wire [7:0] shr, shl, exp_div_del;delay2 #26 ud000(clk, test.u0.fracta, fracta_del);delay2 #26 ud001(clk, test.u0.fractb, fractb_del);delay1 #2 ud002(clk, {g,r,s}, grs_del);delay1 #0 ud004(clk, dn, dn_del);delay1 #7 ud005(clk, exp_in, exp_in_del);delay1 #7 ud007(clk, exp_out_rnd, exp_out_del);delay1 #47 ud009(clk, fract_in, fract_in_del);delay1 #0 ud010(clk, overflow, overflow_del);delay1 #1 ud011(clk, exp_ovf, exp_ovf_del);delay1 #22 ud014(clk, fract_out, fract_out_x_del);delay1 #24 ud015(clk, fract_trunc, trunc_xx_del);delay1 #0 ud017(clk, exp_rnd_adj2a, exp_rnd_adj2a_del);delay1 #4 ud019(clk, div_opa_ldz, div_opa_ldz_del);delay3 #23 ud020(clk, test.u0.fdiv_opa[49:26], fracta_div_del);delay3 #23 ud021(clk, test.u0.fractb_mul, fractb_div_del);delay1 #0 ud023(clk, div_inf, div_inf_del);delay1 #7 ud024(clk, fi_ldz_2, fi_ldz_2_del);delay1 #0 ud025(clk, inf_out, inf_out_del);delay1 #0 ud026(clk, max_num, max_num_del);delay1 #5 ud027(clk, fi_ldz, fi_ldz_del);delay1 #0 ud028(clk, rem_00, rx_del);delay1 #0 ud029(clk, left_right, lr);delay1 #7 ud030(clk, shift_right, shr);delay1 #7 ud031(clk, shift_left, shl);delay1 #22 ud032(clk, fract_out_rnd2a, fract_out_rnd2a_del);delay1 #7 ud033(clk, exp_div, exp_div_del);always @(test.error_event) begin $display("\n----------------------------------------------"); $display("ERROR: GRS: %b exp_ovf: %b dn: %h exp_in: %h exp_out: %h, exp_rnd_adj2a: %b", grs_del, exp_ovf_del, dn_del, exp_in_del, exp_out_del, exp_rnd_adj2a_del); $display(" div_opa: %b, div_opb: %b, rem_00: %b, exp_div: %h", fracta_div_del, fractb_div_del, rx_del, exp_div_del); $display(" lr: %b, shl: %h, shr: %h", lr, shl, shr); $display(" overflow: %b, fract_in=%b fa:%h fb:%h", overflow_del, fract_in_del, fracta_del, fractb_del); $display(" div_opa_ldz: %h, div_inf: %b, inf_out: %b, max_num: %b, fi_ldz: %h, fi_ldz_2: %h", div_opa_ldz_del, div_inf_del, inf_out_del, max_num_del, fi_ldz_del, fi_ldz_2_del); $display(" fract_out_x: %b, fract_out_rnd2a_del: %h, fract_trunc: %b\n", fract_out_x_del, fract_out_rnd2a_del, trunc_xx_del); end// synopsys translate_onendmodule// synopsys translate_offmodule delay1(clk, in, out);parameter N = 1;input [N:0] in;output [N:0] out;input clk;reg [N:0] out;always @(posedge clk) out <= #1 in;endmodulemodule delay2(clk, in, out);parameter N = 1;input [N:0] in;output [N:0] out;input clk;reg [N:0] out, r1;always @(posedge clk) r1 <= #1 in;always @(posedge clk) out <= #1 r1;endmodulemodule delay3(clk, in, out);parameter N = 1;input [N:0] in;output [N:0] out;input clk;reg [N:0] out, r1, r2;always @(posedge clk) r1 <= #1 in;always @(posedge clk) r2 <= #1 r1;always @(posedge clk) out <= #1 r2;endmodule// synopsys translate_on
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -