Added optional FFs to picorv32_pcpi_fast_mul

This commit is contained in:
Clifford Wolf 2016-09-04 12:44:12 +02:00
parent 85d8401c3d
commit e91c1422a2
1 changed files with 24 additions and 16 deletions

View File

@ -1916,7 +1916,9 @@ module picorv32_pcpi_mul #(
end end
endmodule endmodule
module picorv32_pcpi_fast_mul ( module picorv32_pcpi_fast_mul #(
parameter EXTRA_FFS = 0
) (
input clk, resetn, input clk, resetn,
input pcpi_valid, input pcpi_valid,
@ -1934,9 +1936,10 @@ module picorv32_pcpi_fast_mul (
wire instr_rs1_signed = |{instr_mulh, instr_mulhsu}; wire instr_rs1_signed = |{instr_mulh, instr_mulhsu};
wire instr_rs2_signed = |{instr_mulh}; wire instr_rs2_signed = |{instr_mulh};
reg active1, active2, shift_out; reg shift_out;
reg [32:0] rs1, rs2; reg [3:0] active;
reg [63:0] rd; reg [32:0] rs1, rs2, rs1_q, rs2_q;
reg [63:0] rd, rd_q;
always @* begin always @* begin
instr_mul = 0; instr_mul = 0;
@ -1955,11 +1958,17 @@ module picorv32_pcpi_fast_mul (
end end
always @(posedge clk) begin always @(posedge clk) begin
rd <= $signed(rs1) * $signed(rs2); rs1_q <= rs1;
rs2_q <= rs2;
rd_q <= rd;
end end
always @(posedge clk) begin always @(posedge clk) begin
if (instr_any_mul && !active1 && !active2) begin rd <= $signed(EXTRA_FFS ? rs1_q : rs1) * $signed(EXTRA_FFS ? rs2_q : rs2);
end
always @(posedge clk) begin
if (instr_any_mul && !(EXTRA_FFS ? active[3:0] : active[1:0])) begin
if (instr_rs1_signed) if (instr_rs1_signed)
rs1 <= $signed(pcpi_rs1); rs1 <= $signed(pcpi_rs1);
else else
@ -1969,23 +1978,22 @@ module picorv32_pcpi_fast_mul (
rs2 <= $signed(pcpi_rs2); rs2 <= $signed(pcpi_rs2);
else else
rs2 <= $unsigned(pcpi_rs2); rs2 <= $unsigned(pcpi_rs2);
active1 <= 1; active[0] <= 1;
end else begin end else begin
active1 <= 0; active[0] <= 0;
end end
active2 <= active1;
active[3:1] <= active;
shift_out <= instr_any_mulh; shift_out <= instr_any_mulh;
if (!resetn) begin if (!resetn)
active1 <= 0; active <= 0;
active2 <= 0;
end
end end
assign pcpi_wr = active2; assign pcpi_wr = active[EXTRA_FFS ? 3 : 1];
assign pcpi_wait = 0; assign pcpi_wait = 0;
assign pcpi_ready = active2; assign pcpi_ready = active[EXTRA_FFS ? 3 : 1];
assign pcpi_rd = shift_out ? rd >> 32 : rd; assign pcpi_rd = shift_out ? (EXTRA_FFS ? rd_q : rd) >> 32 : (EXTRA_FFS ? rd_q : rd);
endmodule endmodule