@@ -93,7 +93,7 @@ generate
9393 end
9494
9595 assign o_imm = i_cnt_done ? signbit : i_ctrl[0 ] ? imm11_7[0 ] : imm24_20[0 ];
96- end else begin : gen_immdec_w_eq_4
96+ end else if (W == 4 ) begin : gen_immdec_w_eq_4
9797 reg [4 :0 ] rd_addr;
9898 reg [4 :0 ] rs1_addr;
9999 reg [4 :0 ] rs2_addr;
@@ -223,6 +223,150 @@ generate
223223 assign o_imm[1 ] = i_ctrl[0 ] ? i8 : i21;
224224 assign o_imm[0 ] = i_ctrl[0 ] ? i7_2 : i20_2;
225225
226+ end else begin : gen_immdec_w_eq_8
227+
228+ reg [4 :0 ] rd_addr;
229+ reg [4 :0 ] rs1_addr;
230+ reg [4 :0 ] rs2_addr;
231+
232+ reg i31;
233+ reg i30;
234+ reg i29;
235+ reg i28;
236+ reg i27;
237+ reg i26;
238+ reg i25;
239+ reg i24;
240+ reg i23;
241+ reg i22;
242+ reg i21;
243+ reg i20;
244+ reg i19;
245+ reg i18;
246+ reg i17;
247+ reg i16;
248+ reg i15;
249+ reg i14;
250+ reg i13;
251+ reg i12;
252+ reg i11;
253+ reg i10;
254+ reg i9;
255+ reg i8;
256+ reg i7;
257+
258+ reg i7_2;
259+ reg i20_2;
260+
261+ wire signbit = i31 & ! i_csr_imm_en;
262+
263+ assign o_csr_imm[7 ] = 1'b0 ;
264+ assign o_csr_imm[6 ] = 1'b0 ;
265+ assign o_csr_imm[5 ] = 1'b0 ;
266+ assign o_csr_imm[4 ] = i19;
267+ assign o_csr_imm[3 ] = i18;
268+ assign o_csr_imm[2 ] = i17;
269+ assign o_csr_imm[1 ] = i16;
270+ assign o_csr_imm[0 ] = i15;
271+
272+ assign o_rd_addr = rd_addr;
273+ assign o_rs1_addr = rs1_addr;
274+ assign o_rs2_addr = rs2_addr;
275+ always @(posedge i_clk) begin
276+ if (i_wb_en) begin
277+ // Common
278+ i31 <= i_wb_rdt[31 ];
279+
280+ // Bit lane 3
281+ i19 <= i_wb_rdt[19 ];
282+ i15 <= i_wb_rdt[15 ];
283+ i20 <= i_wb_rdt[20 ];
284+ i7 <= i_wb_rdt[7 ];
285+ i27 <= i_wb_rdt[27 ];
286+ i23 <= i_wb_rdt[23 ];
287+ i10 <= i_wb_rdt[10 ];
288+
289+ // Bit lane 2
290+ i22 <= i_wb_rdt[22 ];
291+ i9 <= i_wb_rdt[ 9 ];
292+ i26 <= i_wb_rdt[26 ];
293+ i30 <= i_wb_rdt[30 ];
294+ i14 <= i_wb_rdt[14 ];
295+ i18 <= i_wb_rdt[18 ];
296+
297+ // Bit lane 1
298+ i21 <= i_wb_rdt[21 ];
299+ i8 <= i_wb_rdt[ 8 ];
300+ i25 <= i_wb_rdt[25 ];
301+ i29 <= i_wb_rdt[29 ];
302+ i13 <= i_wb_rdt[13 ];
303+ i17 <= i_wb_rdt[17 ];
304+
305+ // Bit lane 0
306+ i11 <= i_wb_rdt[11 ];
307+ i7_2 <= i_wb_rdt[7 ];
308+ i20_2 <= i_wb_rdt[20 ];
309+ i24 <= i_wb_rdt[24 ];
310+ i28 <= i_wb_rdt[28 ];
311+ i12 <= i_wb_rdt[12 ];
312+ i16 <= i_wb_rdt[16 ];
313+
314+ rd_addr <= i_wb_rdt[11 :7 ];
315+ rs1_addr <= i_wb_rdt[19 :15 ];
316+ rs2_addr <= i_wb_rdt[24 :20 ];
317+ end
318+ if (i_cnt_en) begin
319+ // Bit lane 6, 7
320+ i10 <= i_ctrl[2 ] ? i7 : i_ctrl[1 ] ? signbit : i20;
321+ i23 <= i_ctrl[2 ] ? i7 : i_ctrl[1 ] ? signbit : i20;
322+ i27 <= i_ctrl[2 ] ? signbit : i_ctrl[1 ] ? signbit : i15;
323+ i7 <= signbit;
324+ i20 <= i19;
325+ i15 <= i_ctrl[3 ] ? signbit : i23;
326+ i19 <= i_ctrl[3 ] ? signbit : i27;
327+
328+
329+ // Bit lane 4, 5
330+ i22 <= i30;
331+ i9 <= i30;
332+ i26 <= (i_ctrl[1 ] | i_ctrl[2 ]) ? signbit : i14;
333+ i30 <= (i_ctrl[1 ] | i_ctrl[2 ]) ? signbit : i18;
334+ i14 <= i_ctrl[3 ] ? signbit : i22;
335+ i18 <= i_ctrl[3 ] ? signbit : i26;
336+
337+
338+ // Bit lane 2, 3
339+ i21 <= i29;
340+ i8 <= i29;
341+ i25 <= (i_ctrl[1 ] | i_ctrl[2 ]) ? signbit : i13;
342+ i29 <= (i_ctrl[1 ] | i_ctrl[2 ]) ? signbit : i17;
343+ i13 <= i_ctrl[3 ] ? signbit : i21;
344+ i17 <= i_ctrl[3 ] ? signbit : i25;
345+
346+
347+ // Bit lane 0, 1
348+ i7_2 <= i28;
349+ i20_2 <= i28;
350+ i28 <= (i_ctrl[1 ] | i_ctrl[2 ]) ? signbit : i16;
351+ i16 <= i_ctrl[3 ] ? signbit : i24;
352+ i11 <= (i_ctrl[1 ] | i_ctrl[2 ]) ? signbit : i12;
353+ i24 <= (i_ctrl[1 ] | i_ctrl[2 ]) ? signbit : i12;
354+ i12 <= i_ctrl[3 ] ? signbit : i20_2;
355+ end
356+ end
357+
358+ assign o_imm[7 ] = (i_cnt_done ? signbit : (i_ctrl[0 ] ? i27 : i27));
359+ assign o_imm[3 ] = ((i_ctrl[0 ] ? i10 : i23));
360+
361+ assign o_imm[6 ] = i_ctrl[0 ] ? i26 : i26;
362+ assign o_imm[2 ] = i_ctrl[0 ] ? i9 : i22;
363+
364+ assign o_imm[5 ] = i_ctrl[0 ] ? i25 : i25;
365+ assign o_imm[1 ] = i_ctrl[0 ] ? i8 : i21;
366+
367+ assign o_imm[4 ] = i_ctrl[0 ] ? i11 : i24;
368+ assign o_imm[0 ] = i_ctrl[0 ] ? i7_2 : i20_2;
369+
226370 end
227371endgenerate
228372
0 commit comments