Line 89... |
Line 89... |
signal div_opy : std_ulogic_vector(data_width_c-1 downto 0);
|
signal div_opy : std_ulogic_vector(data_width_c-1 downto 0);
|
signal rs1_is_signed : std_ulogic;
|
signal rs1_is_signed : std_ulogic;
|
signal rs2_is_signed : std_ulogic;
|
signal rs2_is_signed : std_ulogic;
|
signal div_res_corr : std_ulogic;
|
signal div_res_corr : std_ulogic;
|
signal out_en : std_ulogic;
|
signal out_en : std_ulogic;
|
|
signal rs2_zero : std_ulogic;
|
|
|
-- divider core --
|
-- divider core --
|
signal remainder : std_ulogic_vector(data_width_c-1 downto 0);
|
signal remainder : std_ulogic_vector(data_width_c-1 downto 0);
|
signal quotient : std_ulogic_vector(data_width_c-1 downto 0);
|
signal quotient : std_ulogic_vector(data_width_c-1 downto 0);
|
signal div_sub : std_ulogic_vector(data_width_c downto 0);
|
signal div_sub : std_ulogic_vector(data_width_c downto 0);
|
Line 150... |
Line 151... |
end if;
|
end if;
|
|
|
when DIV_PREPROCESS =>
|
when DIV_PREPROCESS =>
|
-- check relevant input signs for result sign compensation --
|
-- check relevant input signs for result sign compensation --
|
if (cp_op = cp_op_div_c) then -- signed div operation
|
if (cp_op = cp_op_div_c) then -- signed div operation
|
div_res_corr <= (rs1_i(rs1_i'left) xor rs2_i(rs2_i'left)) and or_reduce_f(rs2_i); -- different signs AND rs2 not zero
|
div_res_corr <= (rs1_i(rs1_i'left) xor rs2_i(rs2_i'left)) and (not rs2_zero); -- different signs AND rs2 not zero
|
elsif (cp_op = cp_op_rem_c) then -- signed rem operation
|
elsif (cp_op = cp_op_rem_c) then -- signed rem operation
|
div_res_corr <= rs1_i(rs1_i'left);
|
div_res_corr <= rs1_i(rs1_i'left);
|
else
|
else
|
div_res_corr <= '0';
|
div_res_corr <= '0';
|
end if;
|
end if;
|
Line 181... |
Line 182... |
state <= IDLE;
|
state <= IDLE;
|
end case;
|
end case;
|
end if;
|
end if;
|
end process coprocessor_ctrl;
|
end process coprocessor_ctrl;
|
|
|
|
-- rs2 zero? --
|
|
rs2_zero <= '1' when (or_reduce_f(rs2_i) = '0') else '0';
|
|
|
-- co-processor command --
|
-- co-processor command --
|
cp_op <= ctrl_i(ctrl_ir_funct3_2_c downto ctrl_ir_funct3_0_c);
|
cp_op <= ctrl_i(ctrl_ir_funct3_2_c downto ctrl_ir_funct3_0_c);
|
|
|
-- operation: 0=mul, 1=div --
|
-- operation: 0=mul, 1=div --
|
operation <= '1' when (cp_op(2) = '1') else '0';
|
operation <= '1' when (cp_op(2) = '1') else '0';
|