Line 311... |
Line 311... |
variable op_m_all_zero_v, op_e_all_zero_v, op_e_all_one_v : std_ulogic;
|
variable op_m_all_zero_v, op_e_all_zero_v, op_e_all_one_v : std_ulogic;
|
variable op_is_zero_v, op_is_inf_v, op_is_denorm_v, op_is_nan_v : std_ulogic;
|
variable op_is_zero_v, op_is_inf_v, op_is_denorm_v, op_is_nan_v : std_ulogic;
|
begin
|
begin
|
for i in 0 to 1 loop -- for rs1 and rs2 inputs
|
for i in 0 to 1 loop -- for rs1 and rs2 inputs
|
-- check for all-zero/all-one --
|
-- check for all-zero/all-one --
|
op_m_all_zero_v := not or_all_f(op_data(i)(22 downto 00));
|
op_m_all_zero_v := not or_reduce_f(op_data(i)(22 downto 00));
|
op_e_all_zero_v := not or_all_f(op_data(i)(30 downto 23));
|
op_e_all_zero_v := not or_reduce_f(op_data(i)(30 downto 23));
|
op_e_all_one_v := and_all_f(op_data(i)(30 downto 23));
|
op_e_all_one_v := and_reduce_f(op_data(i)(30 downto 23));
|
|
|
-- check special cases --
|
-- check special cases --
|
op_is_zero_v := op_e_all_zero_v and op_m_all_zero_v; -- zero
|
op_is_zero_v := op_e_all_zero_v and op_m_all_zero_v; -- zero
|
op_is_inf_v := op_e_all_one_v and op_m_all_zero_v; -- infinity
|
op_is_inf_v := op_e_all_one_v and op_m_all_zero_v; -- infinity
|
op_is_denorm_v := '0'; -- FIXME / TODO -- op_e_all_zero_v and (not op_m_all_zero_v); -- subnormal
|
op_is_denorm_v := '0'; -- FIXME / TODO -- op_e_all_zero_v and (not op_m_all_zero_v); -- subnormal
|
Line 1358... |
Line 1358... |
sreg.upper(31 downto 02) <= (others => '0');
|
sreg.upper(31 downto 02) <= (others => '0');
|
sreg.upper(01 downto 00) <= mantissa_i(47 downto 46);
|
sreg.upper(01 downto 00) <= mantissa_i(47 downto 46);
|
sreg.lower <= mantissa_i(45 downto 23);
|
sreg.lower <= mantissa_i(45 downto 23);
|
sreg.ext_g <= mantissa_i(22);
|
sreg.ext_g <= mantissa_i(22);
|
sreg.ext_r <= mantissa_i(21);
|
sreg.ext_r <= mantissa_i(21);
|
sreg.ext_s <= or_all_f(mantissa_i(20 downto 0));
|
sreg.ext_s <= or_reduce_f(mantissa_i(20 downto 0));
|
-- check for special cases --
|
-- check for special cases --
|
if ((ctrl.class(fp_class_snan_c) or ctrl.class(fp_class_qnan_c) or -- NaN
|
if ((ctrl.class(fp_class_snan_c) or ctrl.class(fp_class_qnan_c) or -- NaN
|
ctrl.class(fp_class_neg_zero_c) or ctrl.class(fp_class_pos_zero_c) or -- zero
|
ctrl.class(fp_class_neg_zero_c) or ctrl.class(fp_class_pos_zero_c) or -- zero
|
ctrl.class(fp_class_neg_denorm_c) or ctrl.class(fp_class_pos_denorm_c) or -- subnormal
|
ctrl.class(fp_class_neg_denorm_c) or ctrl.class(fp_class_pos_denorm_c) or -- subnormal
|
ctrl.class(fp_class_neg_inf_c) or ctrl.class(fp_class_pos_inf_c) or -- infinity
|
ctrl.class(fp_class_neg_inf_c) or ctrl.class(fp_class_pos_inf_c) or -- infinity
|
Line 1473... |
Line 1473... |
end case;
|
end case;
|
end if;
|
end if;
|
end process ctrl_engine;
|
end process ctrl_engine;
|
|
|
-- stop shifting when normalized --
|
-- stop shifting when normalized --
|
sreg.done <= (not or_all_f(sreg.upper(sreg.upper'left downto 1))) and sreg.upper(0); -- input is zero, hidden one is set
|
sreg.done <= (not or_reduce_f(sreg.upper(sreg.upper'left downto 1))) and sreg.upper(0); -- input is zero, hidden one is set
|
|
|
-- all-zero including hidden bit --
|
-- all-zero including hidden bit --
|
sreg.zero <= not or_all_f(sreg.upper);
|
sreg.zero <= not or_reduce_f(sreg.upper);
|
|
|
-- result --
|
-- result --
|
result_o(31) <= ctrl.res_sgn;
|
result_o(31) <= ctrl.res_sgn;
|
result_o(30 downto 23) <= ctrl.res_exp;
|
result_o(30 downto 23) <= ctrl.res_exp;
|
result_o(22 downto 0) <= ctrl.res_man;
|
result_o(22 downto 0) <= ctrl.res_man;
|
Line 1715... |
Line 1715... |
ctrl.state <= S_NORMALIZE_BUSY;
|
ctrl.state <= S_NORMALIZE_BUSY;
|
end if;
|
end if;
|
|
|
when S_NORMALIZE_BUSY => -- running normalization cycle
|
when S_NORMALIZE_BUSY => -- running normalization cycle
|
-- ------------------------------------------------------------
|
-- ------------------------------------------------------------
|
sreg.ext_s <= sreg.ext_s or or_all_f(sreg.mant(sreg.mant'left-2 downto 0)); -- sticky bit
|
sreg.ext_s <= sreg.ext_s or or_reduce_f(sreg.mant(sreg.mant'left-2 downto 0)); -- sticky bit
|
if (or_all_f(ctrl.cnt(ctrl.cnt'left-1 downto 0)) = '0') then
|
if (or_reduce_f(ctrl.cnt(ctrl.cnt'left-1 downto 0)) = '0') then
|
if (ctrl.unsign = '0') then -- signed conversion
|
if (ctrl.unsign = '0') then -- signed conversion
|
ctrl.over <= ctrl.over or sreg.int(sreg.int'left); -- update overrun flag again to check for numerical overflow into sign bit
|
ctrl.over <= ctrl.over or sreg.int(sreg.int'left); -- update overrun flag again to check for numerical overflow into sign bit
|
end if;
|
end if;
|
ctrl.state <= S_ROUND;
|
ctrl.state <= S_ROUND;
|
else -- shift left
|
else -- shift left
|