⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 post_norm.v

📁 利用FPGA实现浮点运算的verilog代码 希望能够给需要做这方面研究的同仁有所帮助
💻 V
📖 第 1 页 / 共 2 页
字号:
// ---------------------------------------------------------------------// 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 + -