Register mult_p before accumulation to prevent synthesis glitches
This commit is contained in:
@@ -365,6 +365,7 @@ module matmul_axi_slave (
|
|||||||
reg mult_start;
|
reg mult_start;
|
||||||
wire mult_done [0:3];
|
wire mult_done [0:3];
|
||||||
wire [63:0] mult_p [0:3];
|
wire [63:0] mult_p [0:3];
|
||||||
|
reg [63:0] mult_p_r [0:3]; // registered for stable accumulation
|
||||||
reg [31:0] m_in_a [0:3];
|
reg [31:0] m_in_a [0:3];
|
||||||
reg [31:0] m_in_b [0:3];
|
reg [31:0] m_in_b [0:3];
|
||||||
|
|
||||||
@@ -429,17 +430,21 @@ module matmul_axi_slave (
|
|||||||
C_WAIT_MULT: begin
|
C_WAIT_MULT: begin
|
||||||
mult_start <= 1'b0;
|
mult_start <= 1'b0;
|
||||||
if (mult_done[0] && mult_done[1] && mult_done[2] && mult_done[3]) begin
|
if (mult_done[0] && mult_done[1] && mult_done[2] && mult_done[3]) begin
|
||||||
|
mult_p_r[0] <= mult_p[0];
|
||||||
|
mult_p_r[1] <= mult_p[1];
|
||||||
|
mult_p_r[2] <= mult_p[2];
|
||||||
|
mult_p_r[3] <= mult_p[3];
|
||||||
state <= C_ACCUM;
|
state <= C_ACCUM;
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
C_ACCUM: begin
|
C_ACCUM: begin
|
||||||
if (cur_bank == 1'b0) begin
|
if (cur_bank == 1'b0) begin
|
||||||
b0_c[calc_idx] <= {2'b0, mult_p[0]} + {2'b0, mult_p[1]} +
|
b0_c[calc_idx] <= {2'b0, mult_p_r[0]} + {2'b0, mult_p_r[1]} +
|
||||||
{2'b0, mult_p[2]} + {2'b0, mult_p[3]};
|
{2'b0, mult_p_r[2]} + {2'b0, mult_p_r[3]};
|
||||||
end else begin
|
end else begin
|
||||||
b1_c[calc_idx] <= {2'b0, mult_p[0]} + {2'b0, mult_p[1]} +
|
b1_c[calc_idx] <= {2'b0, mult_p_r[0]} + {2'b0, mult_p_r[1]} +
|
||||||
{2'b0, mult_p[2]} + {2'b0, mult_p[3]};
|
{2'b0, mult_p_r[2]} + {2'b0, mult_p_r[3]};
|
||||||
end
|
end
|
||||||
|
|
||||||
if (calc_idx == 4'd15) begin
|
if (calc_idx == 4'd15) begin
|
||||||
|
|||||||
Reference in New Issue
Block a user