Skip to content

Commit e12f242

Browse files
committed
Enable shift register extraction for external input delay stages.
1 parent f6fad5a commit e12f242

File tree

1 file changed

+17
-17
lines changed

1 file changed

+17
-17
lines changed

finn-rtllib/mvu/mvu_vvu_8sx9_dsp58.sv

Lines changed: 17 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -110,17 +110,17 @@ module mvu_vvu_8sx9_dsp58 #(
110110
assign vld = L[0];
111111

112112
//-------------------- Shift register for ZERO flag --------------------\\
113-
logic Z [0:MAX_PIPELINE_STAGES-2] = '{default:0}; // We need MAX_PIPELINE_STAGES-1 pipeline stages (note: INMODE is buffered inside DSP fabric)
114-
115-
if (MAX_PIPELINE_STAGES > 1) begin : genZreg
113+
// We need MAX_PIPELINE_STAGES-1 delay stages (INMODE is registed once more inside DSP)
114+
uwire [MAX_PIPELINE_STAGES-1:0] inmode_zero;
115+
assign inmode_zero[0] = zero;
116+
if(MAX_PIPELINE_STAGES > 1) begin : genZReg
117+
logic [MAX_PIPELINE_STAGES-1:1] Z = '1;
116118
always_ff @(posedge clk) begin
117-
if (rst) Z <= '{default: 0};
118-
else if(en) begin
119-
Z[0] <= zero;
120-
if (MAX_PIPELINE_STAGES > 2) Z[1:MAX_PIPELINE_STAGES-2] <= Z[0:MAX_PIPELINE_STAGES-3];
121-
end
119+
if(rst) Z <= '1;
120+
else if(en) Z <= inmode_zero[MAX_PIPELINE_STAGES-2:0];
122121
end
123-
end;
122+
assign inmode_zero[MAX_PIPELINE_STAGES-1:1] = Z;
123+
end : genZReg
124124

125125
//-------------------- Buffer for input activations --------------------\\
126126
localparam int unsigned PAD_BITS_ACT = 9 - ACTIVATION_WIDTH;
@@ -131,10 +131,10 @@ module mvu_vvu_8sx9_dsp58 #(
131131
localparam int LANES_OCCUPIED = i == CHAINLEN-1 ? SIMD - 3*i : 3;
132132

133133
if (EXTERNAL_PREGS > 0) begin : genExternalPregAct
134-
logic [0:EXTERNAL_PREGS-1][LANES_OCCUPIED-1:0][ACTIVATION_WIDTH-1:0] A = '{ default : 0};
134+
(* EXTRACT_SHREG = "true" *)
135+
logic [0:EXTERNAL_PREGS-1][LANES_OCCUPIED-1:0][ACTIVATION_WIDTH-1:0] A = '{ default : 'x };
135136
always_ff @(posedge clk) begin
136-
if (rst) A <= '{default: 0};
137-
else if(en) begin
137+
if(en) begin
138138
A[EXTERNAL_PREGS-1] <=
139139
// synthesis translate_off
140140
zero ? '1 :
@@ -177,10 +177,10 @@ module mvu_vvu_8sx9_dsp58 #(
177177
localparam int LANES_OCCUPIED = j == CHAINLEN-1 ? SIMD - 3*j : 3;
178178

179179
if (EXTERNAL_PREGS > 0) begin : genExternalPregWeight
180-
logic [0:PE-1][0:EXTERNAL_PREGS-1][LANES_OCCUPIED-1:0][WEIGHT_WIDTH-1:0] B = '{ default : 0};
180+
(* EXTRACT_SHREG = "true" *)
181+
logic [0:PE-1][0:EXTERNAL_PREGS-1][LANES_OCCUPIED-1:0][WEIGHT_WIDTH-1:0] B = '{ default : 'x };
181182
always_ff @(posedge clk) begin
182-
if (rst) B <= '{default: 0};
183-
else if (en) begin
183+
if(en) begin
184184
B[i][EXTERNAL_PREGS-1] <=
185185
// synthesis translate_off
186186
zero ? '1 :
@@ -253,7 +253,7 @@ module mvu_vvu_8sx9_dsp58 #(
253253
logic InmodeZero = 0;
254254
always_ff @(posedge clk) begin
255255
if (rst) InmodeZero <= 0;
256-
else if (en) InmodeZero <= ( TOTAL_PREGS > 0 ? Z[TOTAL_PREGS-1] : zero );
256+
else if (en) InmodeZero <= inmode_zero[TOTAL_PREGS];
257257
end
258258
always_ff @(posedge clk) begin
259259
if (rst) Mreg <= 0;
@@ -401,7 +401,7 @@ module mvu_vvu_8sx9_dsp58 #(
401401
.INMODE({
402402
INTERNAL_PREGS==2 ? 1'b0 : 1'b1,
403403
2'b00,
404-
TOTAL_PREGS > 0 ? Z[TOTAL_PREGS-1] : zero,
404+
inmode_zero[TOTAL_PREGS],
405405
INTERNAL_PREGS==2 ? 1'b0 : 1'b1
406406
}), // 5-bit input: INMODE control
407407
.NEGATE('0), // 3-bit input: Negates the input of the multiplier

0 commit comments

Comments
 (0)