@@ -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