@@ -46,8 +46,8 @@ module VX_decode import VX_gpu_pkg::*; #(
4646 reg [EX_BITS - 1 : 0 ] ex_type;
4747 reg [INST_OP_BITS - 1 : 0 ] op_type;
4848 op_args_t op_args;
49- reg [NUM_REGS_BITS - 1 : 0 ] rd_v, rs1_v, rs2_v, rs3_v;
50- reg use_rd, use_rs1, use_rs2, use_rs3;
49+ reg [NUM_REGS_BITS - 1 : 0 ] rd_v, rs1_v, rs2_v, rs3_v, rs4_v ;
50+ reg use_rd, use_rs1, use_rs2, use_rs3, use_rs4 ;
5151 reg is_wstall;
5252
5353 wire [31 : 0 ] instr = fetch_if.data.instr;
@@ -70,6 +70,8 @@ module VX_decode import VX_gpu_pkg::*; #(
7070 `UNUSED_VAR (use_rs1)
7171 `UNUSED_VAR (use_rs2)
7272 `UNUSED_VAR (use_rs3)
73+ `UNUSED_VAR (use_rs4)
74+ `UNUSED_VAR (rs4_v)
7375
7476 wire is_itype_sh = funct3[0 ] && ~ funct3[1 ];
7577 wire is_fpu_csr = (u_12 <= `VX_CSR_FCSR );
@@ -149,10 +151,12 @@ module VX_decode import VX_gpu_pkg::*; #(
149151 rs1_v = 'x ;
150152 rs2_v = 'x ;
151153 rs3_v = 'x ;
154+ rs4_v = 'x ;
152155 use_rd = 0 ;
153156 use_rs1 = 0 ;
154157 use_rs2 = 0 ;
155158 use_rs3 = 0 ;
159+ use_rs4 = 0 ;
156160 is_wstall = 0 ;
157161
158162 case (opcode)
@@ -518,17 +522,25 @@ module VX_decode import VX_gpu_pkg::*; #(
518522 `ifdef EXT_TCU_ENABLE
519523 7'h02 : begin
520524 case (funct3)
521- 3'h0 : begin // WMMA
525+ 3'h0 : begin // WMMA (dense/sparse)
522526 ex_type = EX_TCU ;
523527 op_type = INST_OP_BITS ' (INST_TCU_WMMA );
524- op_args.tcu.fmt_s = rs1[3 : 0 ];
525- op_args.tcu.fmt_d = rd[3 : 0 ];
526- op_args.tcu.step_m = '0 ;
527- op_args.tcu.step_n = '0 ;
528+ op_args.tcu.fmt_s = rs1[3 : 0 ];
529+ op_args.tcu.fmt_d = rd[3 : 0 ];
530+ op_args.tcu.step_m = '0 ;
531+ op_args.tcu.step_n = '0 ;
532+ op_args.tcu.step_k = '0 ;
533+ op_args.tcu.sparsity_degree = rs2[1 : 0 ];
528534 `USED_IREG (rd);
529535 `USED_IREG (rs1);
530536 `USED_IREG (rs2);
531537 `USED_IREG (rs3);
538+ if (rs2[1 : 0 ] != 2'b00 ) begin
539+ // Sparse WMMA metadata source is an integer reg (a0..),
540+ // while exact per-uop rs4 is resolved later in VX_tcu_uops.
541+ use_rs4 = 1'b1 ;
542+ rs4_v = make_reg_num (REG_TYPE_I , 5 '(10 )); // a0 base
543+ end
532544 end
533545 default : ;
534546 endcase
@@ -544,7 +556,7 @@ module VX_decode import VX_gpu_pkg::*; #(
544556 // disable write to integer register r0
545557 wire wb = use_rd && (rd_v != 0 );
546558
547- wire [2 : 0 ] used_rs = { use_rs3, use_rs2, use_rs1} ;
559+ wire [NUM_SRC_OPDS - 1 : 0 ] used_rs = { use_rs4, use_rs3, use_rs2, use_rs1} ;
548560
549561 VX_elastic_buffer # (
550562 .DATAW (OUT_DATAW ),
@@ -554,8 +566,8 @@ module VX_decode import VX_gpu_pkg::*; #(
554566 .reset (reset),
555567 .valid_in (fetch_if.valid),
556568 .ready_in (fetch_if.ready),
557- .data_in ({ fetch_if.data.uuid, fetch_if.data.wid, fetch_if.data.tmask, fetch_if.data.PC , ex_type, op_type, op_args, wb, used_rs, rd_v, rs1_v, rs2_v, rs3_v} ),
558- .data_out ({ decode_if.data.uuid, decode_if.data.wid, decode_if.data.tmask, decode_if.data.PC , decode_if.data.ex_type, decode_if.data.op_type, decode_if.data.op_args, decode_if.data.wb, decode_if.data.used_rs, decode_if.data.rd, decode_if.data.rs1, decode_if.data.rs2, decode_if.data.rs3} ),
569+ .data_in ({ fetch_if.data.uuid, fetch_if.data.wid, fetch_if.data.tmask, fetch_if.data.PC , ex_type, op_type, op_args, wb, used_rs, rd_v, rs1_v, rs2_v, rs3_v, rs4_v } ),
570+ .data_out ({ decode_if.data.uuid, decode_if.data.wid, decode_if.data.tmask, decode_if.data.PC , decode_if.data.ex_type, decode_if.data.op_type, decode_if.data.op_args, decode_if.data.wb, decode_if.data.used_rs, decode_if.data.rd, decode_if.data.rs1, decode_if.data.rs2, decode_if.data.rs3, decode_if.data.rs4 } ),
559571 .valid_out (decode_if.valid),
560572 .ready_out (decode_if.ready)
561573 );
0 commit comments