@@ -89,12 +89,11 @@ module spatz_decoder
8989 automatic vreg_t ls_vd = decoder_req_i.instr[11 : 7 ];
9090 automatic vreg_t ls_rs1 = decoder_req_i.instr[19 : 15 ];
9191 automatic vreg_t ls_s2 = decoder_req_i.instr[24 : 20 ];
92- automatic logic [2 : 0 ] ls_width = decoder_req_i.instr[14 : 12 ];
92+ automatic logic [2 : 0 ] ls_width = decoder_req_i.instr[14 : 12 ];// index ew
9393 automatic logic ls_vm = decoder_req_i.instr[25 ];
9494 automatic logic [1 : 0 ] ls_mop = decoder_req_i.instr[27 : 26 ];
9595 automatic logic ls_mew = decoder_req_i.instr[28 ];
9696 automatic logic [2 : 0 ] ls_nf = decoder_req_i.instr[31 : 29 ];
97-
9897 // Retrieve VSEW
9998 unique case ({ ls_mew, ls_width} )
10099 4'b0000 : spatz_req.vtype.vsew = EW_8 ;
@@ -103,7 +102,6 @@ module spatz_decoder
103102 4'b0111 : spatz_req.vtype.vsew = EW_64 ;
104103 default : illegal_instr = 1'b1 ;
105104 endcase
106-
107105 spatz_req.op_mem.vm = ls_vm;
108106 spatz_req.ex_unit = LSU ;
109107
@@ -156,7 +154,38 @@ module spatz_decoder
156154 spatz_req.op_mem.ew = spatz_req.vtype.vsew;
157155 spatz_req.vtype.vsew = decoder_req_i.vtype.vsew;
158156 end
159-
157+ // riscv_instr::VLXBLK4EI8_V,
158+ // riscv_instr::VLXBLK4EI16_V,
159+ // riscv_instr::VLXBLK6EI8_V,
160+ // riscv_instr::VLXBLK6EI16_V,
161+ // riscv_instr::VLXBLK8EI8_V,
162+ // riscv_instr::VLXBLK8EI16_V,
163+ // riscv_instr::VLXBLK12EI8_V,
164+ // riscv_instr::VLXBLK12EI16_V,
165+ // riscv_instr::VLXBLK16EI8_V,
166+ // riscv_instr::VLXBLK16EI16_V: begin
167+ // spatz_req.op = VLXBLK;
168+ // spatz_req.op_mem.is_load = 1'b1;
169+ // spatz_req.vd = ls_vd;
170+ // spatz_req.use_vd = 1'b1;
171+ // spatz_req.rs1 = decoder_req_i.rs1;
172+ // spatz_req.vs2 = ls_s2;
173+ // spatz_req.use_vs2 = 1'b1;
174+
175+ // unique case (ls_nf)
176+ // 3'd0: spatz_req.op_mem.blk_len = BLKLEN_4;
177+ // 3'd1: spatz_req.op_mem.blk_len = BLKLEN_6;
178+ // 3'd2: spatz_req.op_mem.blk_len = BLKLEN_8;
179+ // 3'd3: spatz_req.op_mem.blk_len = BLKLEN_12;
180+ // 3'd4: spatz_req.op_mem.blk_len = BLKLEN_16;
181+ // default: illegal_instr = 1'b1;
182+ // endcase
183+
184+ // // Indexed block load: op_mem.ew = index width, vtype.vsew = data element width
185+ // spatz_req.op_mem.ew = spatz_req.vtype.vsew;
186+ // spatz_req.vtype.vsew = decoder_req_i.vtype.vsew;
187+
188+ // end
160189 riscv_instr :: VSE8_V ,
161190 riscv_instr :: VSE16_V ,
162191 riscv_instr :: VSE32_V ,
@@ -209,6 +238,59 @@ module spatz_decoder
209238 endcase // decoder_req_i.instr
210239 end
211240
241+ riscv_instr :: VLXBLK4EI8_V ,
242+ riscv_instr :: VLXBLK4EI16_V ,
243+ riscv_instr :: VLXBLK6EI8_V ,
244+ riscv_instr :: VLXBLK6EI16_V ,
245+ riscv_instr :: VLXBLK8EI8_V ,
246+ riscv_instr :: VLXBLK8EI16_V ,
247+ riscv_instr :: VLXBLK12EI8_V ,
248+ riscv_instr :: VLXBLK12EI16_V ,
249+ riscv_instr :: VLXBLK16EI8_V ,
250+ riscv_instr :: VLXBLK16EI16_V : begin
251+ automatic vreg_t blk_vd = decoder_req_i.instr[11 : 7 ];
252+ automatic vreg_t blk_rs1 = decoder_req_i.instr[19 : 15 ];
253+ automatic vreg_t blk_vs2 = decoder_req_i.instr[24 : 20 ];
254+ automatic logic [2 : 0 ] blk_width = decoder_req_i.instr[14 : 12 ];
255+ automatic logic [6 : 0 ] blk_funct7 = decoder_req_i.instr[31 : 25 ];
256+
257+ spatz_req.op = VLXBLK ;
258+ spatz_req.ex_unit = LSU ;
259+ spatz_req.op_mem.is_load = 1'b1 ;
260+
261+ spatz_req.vd = blk_vd;
262+ spatz_req.use_vd = 1'b1 ;
263+
264+ spatz_req.rs1 = decoder_req_i.rs1;
265+
266+ spatz_req.vs2 = blk_vs2;
267+ spatz_req.use_vs2 = 1'b1 ;
268+
269+ // New custom encoding has no vm field. Treat as unmasked.
270+ spatz_req.op_mem.vm = 1'b1 ;
271+
272+ // Indexed block load:
273+ // op_mem.ew = index element width
274+ // vtype.vsew = data element width from current vtype CSR
275+ unique case (blk_width)
276+ 3'b000 : spatz_req.op_mem.ew = EW_8 ;
277+ 3'b101 : spatz_req.op_mem.ew = EW_16 ;
278+ default : illegal_instr = 1'b1 ;
279+ endcase
280+
281+ spatz_req.vtype.vsew = decoder_req_i.vtype.vsew;
282+
283+ // Block length is encoded in funct7[31:25]
284+ unique case (blk_funct7)
285+ 7'b0001000 : spatz_req.op_mem.blk_len = BLKLEN_4 ;
286+ 7'b0001001 : spatz_req.op_mem.blk_len = BLKLEN_6 ;
287+ 7'b0001010 : spatz_req.op_mem.blk_len = BLKLEN_8 ;
288+ 7'b0001011 : spatz_req.op_mem.blk_len = BLKLEN_12 ;
289+ 7'b0001100 : spatz_req.op_mem.blk_len = BLKLEN_16 ;
290+ default : illegal_instr = 1'b1 ;
291+ endcase
292+ end
293+
212294 // Vector instruction
213295 riscv_instr :: VADD_VV ,
214296 riscv_instr :: VADD_VX ,
0 commit comments