diff --git a/rtl/isolde_decoder.sv b/rtl/isolde_decoder.sv index 4365033c..3d50fb8e 100644 --- a/rtl/isolde_decoder.sv +++ b/rtl/isolde_decoder.sv @@ -103,6 +103,8 @@ module isolde_decoder read_ptr <= read_ptr + 1; case (isolde_opcode_q) isolde_opcode_vle32_4: load_quad_word(); + isolde_opcode_gemm: decode_64b_gemm(); + endcase end endcase @@ -156,4 +158,38 @@ module isolde_decoder end end endtask + + + + task static decode_64b_gemm; + /** + (v4i32 QPR:$rd2), ( IntOp ( iPTR GPR:$rd1) + ,( iPTR GPR:$rs1) + ,( v4i32 QPR:$rs4) + ,( iPTR GPR:$rs2) + ,( v4i32 QPR:$rs5) + ,( iPTR GPR:$rs3) + ,( i32 imm:$transA) + ,( i32 imm:$transB) + ) + **/ + begin + if (3'h1 == read_ptr) begin + //first 32 bits + // isolde_rf_bus.wdata_0[3] <= isolde_decoder_instr_batch_i[1][24:20]; //rs2 + // isolde_rf_bus.wdata_0[3] <= isolde_decoder_instr_batch_i[1][19:15]; //rs1 + // isolde_rf_bus.wdata_0[3] <= isolde_decoder_instr_batch_i[1][14:12]; //funct3 + // isolde_rf_bus.wdata_0[3] <= isolde_decoder_instr_batch_i[1][11:7]; //rd1 + // // extension 32 bits + // isolde_rf_bus.wdata_0[1] <= isolde_decoder_instr_batch_i[0][61:57]; //rs6 + isolde_rf_bus.raddr_1 <= isolde_decoder_instr_batch_i[0][56:52]; //rs5 + isolde_rf_bus.raddr_0 <= isolde_decoder_instr_batch_i[0][51:47]; //rs4 + // isolde_rf_bus.wdata_0[1] <= isolde_decoder_instr_batch_i[0][46:44]; //_ext_funct3 + // isolde_rf_bus.wdata_0[1] <= isolde_decoder_instr_batch_i[0][43:39]; //rd2 + isolde_decoder_exec_bus.funct2 <= isolde_decoder_instr_batch_i[0][38:37]; //_ext_funct2 + // isolde_rf_bus.wdata_0[1] <= isolde_decoder_instr_batch_i[0][36:32]; //rs3 + + end + end + endtask endmodule diff --git a/rtl/isolde_exec_block.sv b/rtl/isolde_exec_block.sv index ff6d5589..5d62f629 100644 --- a/rtl/isolde_exec_block.sv +++ b/rtl/isolde_exec_block.sv @@ -126,9 +126,17 @@ module isolde_exec_block `ifndef SYNTHESIS $fwrite(log_fh, " --- %s\n", "isolde_exec_block::start_gemm"); $fwrite(log_fh, " func3=%b\n", isolde_exec_from_decoder.func3); - $fwrite(log_fh, " rd=%d\n", isolde_exec_from_decoder.rd); + $fwrite(log_fh, " rd1=%d\n", isolde_exec_from_decoder.rd); $fwrite(log_fh, " rs1=%d\n", isolde_exec_from_decoder.rs1); $fwrite(log_fh, " rs2=%d\n", isolde_exec_from_decoder.rs2); + $fwrite(log_fh, " rs4=%d\n", isolde_rf_bus.raddr_0 ); + $fwrite(log_fh, " Q[%d] = [ %d, %d, %d, %d ]\n", isolde_rf_bus.raddr_0, isolde_rf_bus.rdata_0[0], isolde_rf_bus.rdata_0[1], + isolde_rf_bus.rdata_0[2], isolde_rf_bus.rdata_0[3]); + $fwrite(log_fh, " rs5=%d\n", isolde_rf_bus.raddr_1 ); + $fwrite(log_fh, " Q[%d] = [ %d, %d, %d, %d ]\n", isolde_rf_bus.raddr_1, isolde_rf_bus.rdata_1[0], isolde_rf_bus.rdata_1[1], + isolde_rf_bus.rdata_1[2], isolde_rf_bus.rdata_1[3]); + $fwrite(log_fh, " funct2=%b\n", isolde_exec_from_decoder.funct2 ); + `endif begin cnt_max <= 4; // wait cycles time for completion diff --git a/rtl/isolde_fetch2exec_if.sv b/rtl/isolde_fetch2exec_if.sv index d466dfb4..1af80f81 100644 --- a/rtl/isolde_fetch2exec_if.sv +++ b/rtl/isolde_fetch2exec_if.sv @@ -13,8 +13,9 @@ interface isolde_fetch2exec_if ( // isolde_decoder_pkg::isolde_opcode_e isolde_opcode; //decoded instruction logic [2:0] func3; //instr[14-12] - logic [4:0] rd; //register destination vector - logic [4:0] rs1; //register source vector - logic [4:0] rs2; //register source vector - + logic [4:0] rd; //register destination + logic [4:0] rs1; //register source + logic [4:0] rs2; //register source +// + logic [1:0] funct2; endinterface