From b86d7a517d2ad1ade0f1386555a99057660279ef Mon Sep 17 00:00:00 2001 From: Eyck Jentzsch Date: Wed, 25 Oct 2023 17:13:52 +0200 Subject: [PATCH] adds dynamic cycle estimation --- contrib/instr/TGC5C_instr.yaml | 48 +-- contrib/instr/TGC5C_slow.yaml | 624 ++++++++++++++++++++++++++++++ src/iss/plugin/cycle_estimate.cpp | 40 +- src/iss/plugin/cycle_estimate.h | 26 +- 4 files changed, 685 insertions(+), 53 deletions(-) create mode 100644 contrib/instr/TGC5C_slow.yaml diff --git a/contrib/instr/TGC5C_instr.yaml b/contrib/instr/TGC5C_instr.yaml index 6ea4d78..ef9ab64 100644 --- a/contrib/instr/TGC5C_instr.yaml +++ b/contrib/instr/TGC5C_instr.yaml @@ -27,84 +27,84 @@ RV32I: mask: 0b00000000000000000111000001111111 size: 32 branch: true - delay: [1,1] + delay: [1,2] BEQ: index: 4 encoding: 0b00000000000000000000000001100011 mask: 0b00000000000000000111000001111111 size: 32 branch: true - delay: [1,1] + delay: [1,2] BNE: index: 5 encoding: 0b00000000000000000001000001100011 mask: 0b00000000000000000111000001111111 size: 32 branch: true - delay: [1,1] + delay: [1,2] BLT: index: 6 encoding: 0b00000000000000000100000001100011 mask: 0b00000000000000000111000001111111 size: 32 branch: true - delay: [1,1] + delay: [1,2] BGE: index: 7 encoding: 0b00000000000000000101000001100011 mask: 0b00000000000000000111000001111111 size: 32 branch: true - delay: [1,1] + delay: [1,2] BLTU: index: 8 encoding: 0b00000000000000000110000001100011 mask: 0b00000000000000000111000001111111 size: 32 branch: true - delay: [1,1] + delay: [1,2] BGEU: index: 9 encoding: 0b00000000000000000111000001100011 mask: 0b00000000000000000111000001111111 size: 32 branch: true - delay: [1,1] + delay: [1,2] LB: index: 10 encoding: 0b00000000000000000000000000000011 mask: 0b00000000000000000111000001111111 size: 32 branch: false - delay: 1 + delay: 2 LH: index: 11 encoding: 0b00000000000000000001000000000011 mask: 0b00000000000000000111000001111111 size: 32 branch: false - delay: 1 + delay: 2 LW: index: 12 encoding: 0b00000000000000000010000000000011 mask: 0b00000000000000000111000001111111 size: 32 branch: false - delay: 1 + delay: 2 LBU: index: 13 encoding: 0b00000000000000000100000000000011 mask: 0b00000000000000000111000001111111 size: 32 branch: false - delay: 1 + delay: 2 LHU: index: 14 encoding: 0b00000000000000000101000000000011 mask: 0b00000000000000000111000001111111 size: 32 branch: false - delay: 1 + delay: 2 SB: index: 15 encoding: 0b00000000000000000000000000100011 @@ -356,56 +356,56 @@ RV32M: mask: 0b11111110000000000111000001111111 size: 32 branch: false - delay: 1 + delay: 2 MULH: index: 50 encoding: 0b00000010000000000001000000110011 mask: 0b11111110000000000111000001111111 size: 32 branch: false - delay: 1 + delay: 2 MULHSU: index: 51 encoding: 0b00000010000000000010000000110011 mask: 0b11111110000000000111000001111111 size: 32 branch: false - delay: 1 + delay: 2 MULHU: index: 52 encoding: 0b00000010000000000011000000110011 mask: 0b11111110000000000111000001111111 size: 32 branch: false - delay: 1 + delay: 2 DIV: index: 53 encoding: 0b00000010000000000100000000110011 mask: 0b11111110000000000111000001111111 size: 32 branch: false - delay: 1 + delay: 17 DIVU: index: 54 encoding: 0b00000010000000000101000000110011 mask: 0b11111110000000000111000001111111 size: 32 branch: false - delay: 1 + delay: 17 REM: index: 55 encoding: 0b00000010000000000110000000110011 mask: 0b11111110000000000111000001111111 size: 32 branch: false - delay: 1 + delay: 17 REMU: index: 56 encoding: 0b00000010000000000111000000110011 mask: 0b11111110000000000111000001111111 size: 32 branch: false - delay: 1 + delay: 17 Zca: C__ADDI4SPN: index: 57 @@ -420,7 +420,7 @@ Zca: mask: 0b1110000000000011 size: 16 branch: false - delay: 1 + delay: 2 C__SW: index: 59 encoding: 0b1100000000000000 @@ -542,14 +542,14 @@ Zca: mask: 0b1110000000000011 size: 16 branch: true - delay: [1,1] + delay: [1,2] C__BNEZ: index: 76 encoding: 0b1110000000000001 mask: 0b1110000000000011 size: 16 branch: true - delay: [1,1] + delay: [1,2] C__SLLI: index: 77 encoding: 0b0000000000000010 @@ -564,7 +564,7 @@ Zca: mask: 0b1110000000000011 size: 16 branch: false - delay: 1 + delay: 2 C__MV: index: 79 encoding: 0b1000000000000010 diff --git a/contrib/instr/TGC5C_slow.yaml b/contrib/instr/TGC5C_slow.yaml new file mode 100644 index 0000000..658b18a --- /dev/null +++ b/contrib/instr/TGC5C_slow.yaml @@ -0,0 +1,624 @@ + +RV32I: + LUI: + index: 0 + encoding: 0b00000000000000000000000000110111 + mask: 0b00000000000000000000000001111111 + size: 32 + branch: false + delay: 1 + AUIPC: + index: 1 + encoding: 0b00000000000000000000000000010111 + mask: 0b00000000000000000000000001111111 + size: 32 + branch: false + delay: 1 + JAL: + index: 2 + encoding: 0b00000000000000000000000001101111 + mask: 0b00000000000000000000000001111111 + size: 32 + branch: true + delay: 1 + JALR: + index: 3 + encoding: 0b00000000000000000000000001100111 + mask: 0b00000000000000000111000001111111 + size: 32 + branch: true + delay: [1,2] + BEQ: + index: 4 + encoding: 0b00000000000000000000000001100011 + mask: 0b00000000000000000111000001111111 + size: 32 + branch: true + delay: [1,2] + BNE: + index: 5 + encoding: 0b00000000000000000001000001100011 + mask: 0b00000000000000000111000001111111 + size: 32 + branch: true + delay: [1,2] + BLT: + index: 6 + encoding: 0b00000000000000000100000001100011 + mask: 0b00000000000000000111000001111111 + size: 32 + branch: true + delay: [1,2] + BGE: + index: 7 + encoding: 0b00000000000000000101000001100011 + mask: 0b00000000000000000111000001111111 + size: 32 + branch: true + delay: [1,2] + BLTU: + index: 8 + encoding: 0b00000000000000000110000001100011 + mask: 0b00000000000000000111000001111111 + size: 32 + branch: true + delay: [1,2] + BGEU: + index: 9 + encoding: 0b00000000000000000111000001100011 + mask: 0b00000000000000000111000001111111 + size: 32 + branch: true + delay: [1,2] + LB: + index: 10 + encoding: 0b00000000000000000000000000000011 + mask: 0b00000000000000000111000001111111 + size: 32 + branch: false + delay: 2 + LH: + index: 11 + encoding: 0b00000000000000000001000000000011 + mask: 0b00000000000000000111000001111111 + size: 32 + branch: false + delay: 2 + LW: + index: 12 + encoding: 0b00000000000000000010000000000011 + mask: 0b00000000000000000111000001111111 + size: 32 + branch: false + delay: 2 + LBU: + index: 13 + encoding: 0b00000000000000000100000000000011 + mask: 0b00000000000000000111000001111111 + size: 32 + branch: false + delay: 2 + LHU: + index: 14 + encoding: 0b00000000000000000101000000000011 + mask: 0b00000000000000000111000001111111 + size: 32 + branch: false + delay: 2 + SB: + index: 15 + encoding: 0b00000000000000000000000000100011 + mask: 0b00000000000000000111000001111111 + size: 32 + branch: false + delay: 1 + SH: + index: 16 + encoding: 0b00000000000000000001000000100011 + mask: 0b00000000000000000111000001111111 + size: 32 + branch: false + delay: 1 + SW: + index: 17 + encoding: 0b00000000000000000010000000100011 + mask: 0b00000000000000000111000001111111 + size: 32 + branch: false + delay: 1 + ADDI: + index: 18 + encoding: 0b00000000000000000000000000010011 + mask: 0b00000000000000000111000001111111 + size: 32 + branch: false + delay: 1 + SLTI: + index: 19 + encoding: 0b00000000000000000010000000010011 + mask: 0b00000000000000000111000001111111 + size: 32 + branch: false + delay: 1 + SLTIU: + index: 20 + encoding: 0b00000000000000000011000000010011 + mask: 0b00000000000000000111000001111111 + size: 32 + branch: false + delay: 1 + XORI: + index: 21 + encoding: 0b00000000000000000100000000010011 + mask: 0b00000000000000000111000001111111 + size: 32 + branch: false + delay: 1 + ORI: + index: 22 + encoding: 0b00000000000000000110000000010011 + mask: 0b00000000000000000111000001111111 + size: 32 + branch: false + delay: 1 + ANDI: + index: 23 + encoding: 0b00000000000000000111000000010011 + mask: 0b00000000000000000111000001111111 + size: 32 + branch: false + delay: 1 + SLLI: + index: 24 + encoding: 0b00000000000000000001000000010011 + mask: 0b11111110000000000111000001111111 + size: 32 + branch: false + delay: "u_24:20" + SRLI: + index: 25 + encoding: 0b00000000000000000101000000010011 + mask: 0b11111110000000000111000001111111 + size: 32 + branch: false + delay: "u_24:20" + SRAI: + index: 26 + encoding: 0b01000000000000000101000000010011 + mask: 0b11111110000000000111000001111111 + size: 32 + branch: false + delay: "u_24:20" + ADD: + index: 27 + encoding: 0b00000000000000000000000000110011 + mask: 0b11111110000000000111000001111111 + size: 32 + branch: false + delay: 1 + SUB: + index: 28 + encoding: 0b01000000000000000000000000110011 + mask: 0b11111110000000000111000001111111 + size: 32 + branch: false + delay: 1 + SLL: + index: 29 + encoding: 0b00000000000000000001000000110011 + mask: 0b11111110000000000111000001111111 + size: 32 + branch: false + delay: "X_24:20" + SLT: + index: 30 + encoding: 0b00000000000000000010000000110011 + mask: 0b11111110000000000111000001111111 + size: 32 + branch: false + delay: 1 + SLTU: + index: 31 + encoding: 0b00000000000000000011000000110011 + mask: 0b11111110000000000111000001111111 + size: 32 + branch: false + delay: 1 + XOR: + index: 32 + encoding: 0b00000000000000000100000000110011 + mask: 0b11111110000000000111000001111111 + size: 32 + branch: false + delay: 1 + SRL: + index: 33 + encoding: 0b00000000000000000101000000110011 + mask: 0b11111110000000000111000001111111 + size: 32 + branch: false + delay: "X_24:20" + SRA: + index: 34 + encoding: 0b01000000000000000101000000110011 + mask: 0b11111110000000000111000001111111 + size: 32 + branch: false + delay: "X_24:20" + OR: + index: 35 + encoding: 0b00000000000000000110000000110011 + mask: 0b11111110000000000111000001111111 + size: 32 + branch: false + delay: 1 + AND: + index: 36 + encoding: 0b00000000000000000111000000110011 + mask: 0b11111110000000000111000001111111 + size: 32 + branch: false + delay: 1 + FENCE: + index: 37 + encoding: 0b00000000000000000000000000001111 + mask: 0b00000000000000000111000001111111 + size: 32 + branch: false + delay: 1 + ECALL: + index: 38 + encoding: 0b00000000000000000000000001110011 + mask: 0b11111111111111111111111111111111 + attributes: [[name:no_cont]] + size: 32 + branch: false + delay: 1 + EBREAK: + index: 39 + encoding: 0b00000000000100000000000001110011 + mask: 0b11111111111111111111111111111111 + attributes: [[name:no_cont]] + size: 32 + branch: false + delay: 1 + MRET: + index: 40 + encoding: 0b00110000001000000000000001110011 + mask: 0b11111111111111111111111111111111 + attributes: [[name:no_cont]] + size: 32 + branch: false + delay: 1 + WFI: + index: 41 + encoding: 0b00010000010100000000000001110011 + mask: 0b11111111111111111111111111111111 + size: 32 + branch: false + delay: 1 +Zicsr: + CSRRW: + index: 42 + encoding: 0b00000000000000000001000001110011 + mask: 0b00000000000000000111000001111111 + size: 32 + branch: false + delay: 1 + CSRRS: + index: 43 + encoding: 0b00000000000000000010000001110011 + mask: 0b00000000000000000111000001111111 + size: 32 + branch: false + delay: 1 + CSRRC: + index: 44 + encoding: 0b00000000000000000011000001110011 + mask: 0b00000000000000000111000001111111 + size: 32 + branch: false + delay: 1 + CSRRWI: + index: 45 + encoding: 0b00000000000000000101000001110011 + mask: 0b00000000000000000111000001111111 + size: 32 + branch: false + delay: 1 + CSRRSI: + index: 46 + encoding: 0b00000000000000000110000001110011 + mask: 0b00000000000000000111000001111111 + size: 32 + branch: false + delay: 1 + CSRRCI: + index: 47 + encoding: 0b00000000000000000111000001110011 + mask: 0b00000000000000000111000001111111 + size: 32 + branch: false + delay: 1 +Zifencei: + FENCE_I: + index: 48 + encoding: 0b00000000000000000001000000001111 + mask: 0b00000000000000000111000001111111 + attributes: [[name:flush]] + size: 32 + branch: false + delay: 1 +RV32M: + MUL: + index: 49 + encoding: 0b00000010000000000000000000110011 + mask: 0b11111110000000000111000001111111 + size: 32 + branch: false + delay: 32 + MULH: + index: 50 + encoding: 0b00000010000000000001000000110011 + mask: 0b11111110000000000111000001111111 + size: 32 + branch: false + delay: 32 + MULHSU: + index: 51 + encoding: 0b00000010000000000010000000110011 + mask: 0b11111110000000000111000001111111 + size: 32 + branch: false + delay: 32 + MULHU: + index: 52 + encoding: 0b00000010000000000011000000110011 + mask: 0b11111110000000000111000001111111 + size: 32 + branch: false + delay: 32 + DIV: + index: 53 + encoding: 0b00000010000000000100000000110011 + mask: 0b11111110000000000111000001111111 + size: 32 + branch: false + delay: 33 + DIVU: + index: 54 + encoding: 0b00000010000000000101000000110011 + mask: 0b11111110000000000111000001111111 + size: 32 + branch: false + delay: 33 + REM: + index: 55 + encoding: 0b00000010000000000110000000110011 + mask: 0b11111110000000000111000001111111 + size: 32 + branch: false + delay: 33 + REMU: + index: 56 + encoding: 0b00000010000000000111000000110011 + mask: 0b11111110000000000111000001111111 + size: 32 + branch: false + delay: 33 +Zca: + C__ADDI4SPN: + index: 57 + encoding: 0b0000000000000000 + mask: 0b1110000000000011 + size: 16 + branch: false + delay: 1 + C__LW: + index: 58 + encoding: 0b0100000000000000 + mask: 0b1110000000000011 + size: 16 + branch: false + delay: 2 + C__SW: + index: 59 + encoding: 0b1100000000000000 + mask: 0b1110000000000011 + size: 16 + branch: false + delay: 1 + C__ADDI: + index: 60 + encoding: 0b0000000000000001 + mask: 0b1110000000000011 + size: 16 + branch: false + delay: 1 + C__NOP: + index: 61 + encoding: 0b0000000000000001 + mask: 0b1110111110000011 + size: 16 + branch: false + delay: 1 + C__JAL: + index: 62 + encoding: 0b0010000000000001 + mask: 0b1110000000000011 + attributes: [[name:enable, value:1]] + size: 16 + branch: true + delay: 1 + C__LI: + index: 63 + encoding: 0b0100000000000001 + mask: 0b1110000000000011 + size: 16 + branch: false + delay: 1 + C__LUI: + index: 64 + encoding: 0b0110000000000001 + mask: 0b1110000000000011 + size: 16 + branch: false + delay: 1 + C__ADDI16SP: + index: 65 + encoding: 0b0110000100000001 + mask: 0b1110111110000011 + size: 16 + branch: false + delay: 1 + __reserved_clui: + index: 66 + encoding: 0b0110000000000001 + mask: 0b1111000001111111 + size: 16 + branch: false + delay: 1 + C__SRLI: + index: 67 + encoding: 0b1000000000000001 + mask: 0b1111110000000011 + attributes: [[name:enable, value:1]] + size: 16 + branch: false + delay: "u_12:12*16+u_6:2" + C__SRAI: + index: 68 + encoding: 0b1000010000000001 + mask: 0b1111110000000011 + attributes: [[name:enable, value:1]] + size: 16 + branch: false + delay: "u_12:12*16+u_6:2" + C__ANDI: + index: 69 + encoding: 0b1000100000000001 + mask: 0b1110110000000011 + size: 16 + branch: false + delay: 1 + C__SUB: + index: 70 + encoding: 0b1000110000000001 + mask: 0b1111110001100011 + size: 16 + branch: false + delay: 1 + C__XOR: + index: 71 + encoding: 0b1000110000100001 + mask: 0b1111110001100011 + size: 16 + branch: false + delay: 1 + C__OR: + index: 72 + encoding: 0b1000110001000001 + mask: 0b1111110001100011 + size: 16 + branch: false + delay: 1 + C__AND: + index: 73 + encoding: 0b1000110001100001 + mask: 0b1111110001100011 + size: 16 + branch: false + delay: 1 + C__J: + index: 74 + encoding: 0b1010000000000001 + mask: 0b1110000000000011 + size: 16 + branch: true + delay: 1 + C__BEQZ: + index: 75 + encoding: 0b1100000000000001 + mask: 0b1110000000000011 + size: 16 + branch: true + delay: [1,2] + C__BNEZ: + index: 76 + encoding: 0b1110000000000001 + mask: 0b1110000000000011 + size: 16 + branch: true + delay: [1,2] + C__SLLI: + index: 77 + encoding: 0b0000000000000010 + mask: 0b1111000000000011 + attributes: [[name:enable, value:1]] + size: 16 + branch: false + delay: "u_12:12*16+u_6:2" + C__LWSP: + index: 78 + encoding: 0b0100000000000010 + mask: 0b1110000000000011 + size: 16 + branch: false + delay: 2 + C__MV: + index: 79 + encoding: 0b1000000000000010 + mask: 0b1111000000000011 + size: 16 + branch: false + delay: 1 + C__JR: + index: 80 + encoding: 0b1000000000000010 + mask: 0b1111000001111111 + size: 16 + branch: true + delay: 1 + __reserved_cmv: + index: 81 + encoding: 0b1000000000000010 + mask: 0b1111111111111111 + size: 16 + branch: false + delay: 1 + C__ADD: + index: 82 + encoding: 0b1001000000000010 + mask: 0b1111000000000011 + size: 16 + branch: false + delay: 1 + C__JALR: + index: 83 + encoding: 0b1001000000000010 + mask: 0b1111000001111111 + size: 16 + branch: true + delay: 1 + C__EBREAK: + index: 84 + encoding: 0b1001000000000010 + mask: 0b1111111111111111 + size: 16 + branch: false + delay: 1 + C__SWSP: + index: 85 + encoding: 0b1100000000000010 + mask: 0b1110000000000011 + size: 16 + branch: false + delay: 1 + DII: + index: 86 + encoding: 0b0000000000000000 + mask: 0b1111111111111111 + size: 16 + branch: false + delay: 1 + diff --git a/src/iss/plugin/cycle_estimate.cpp b/src/iss/plugin/cycle_estimate.cpp index b389cb4..705b976 100644 --- a/src/iss/plugin/cycle_estimate.cpp +++ b/src/iss/plugin/cycle_estimate.cpp @@ -1,4 +1,3 @@ - /******************************************************************************* * Copyright (C) 2017 - 2023, MINRES Technologies GmbH * All rights reserved. @@ -34,6 +33,7 @@ ******************************************************************************/ #include "cycle_estimate.h" +#include #include #include @@ -48,11 +48,12 @@ iss::plugin::cycle_estimate::cycle_estimate(string const& config_file_name) { } -iss::plugin::cycle_estimate::~cycle_estimate() { -} +iss::plugin::cycle_estimate::~cycle_estimate() = default; bool iss::plugin::cycle_estimate::registration(const char* const version, vm_if& vm) { instr_if = vm.get_arch()->get_instrumentation_if(); + assert(instr_if && "No instrumentation interface available but callback executed"); + reg_base_ptr = reinterpret_cast(vm.get_arch()->get_regs_base_ptr()); if(!instr_if) return false; const string core_name = instr_if->core_type_name(); if (config_file_name.length() > 0) { @@ -67,17 +68,23 @@ bool iss::plugin::cycle_estimate::registration(const char* const version, vm_if& auto isa_subset = p.first; auto instructions = p.second; for (auto const& instr : instructions) { - instr_desc res; + auto idx = instr.second["index"].as(); + if(delays.size()<=idx) + delays.resize(idx+1); + auto& res = delays[idx]; res.is_branch = instr.second["branch"].as(); auto delay = instr.second["delay"]; if(delay.IsSequence()) { res.not_taken = delay[0].as(); res.taken = delay[1].as(); } else { - res.not_taken = delay.as(); - res.taken = res.not_taken; + try { + res.not_taken = delay.as(); + res.taken = res.not_taken; + } catch (const YAML::BadConversion& e) { + res.f = iss::plugin::calculator(reg_base_ptr, delay.as()); + } } - delays.push_back(std::move(res)); } } } catch (YAML::ParserException &e) { @@ -90,15 +97,18 @@ bool iss::plugin::cycle_estimate::registration(const char* const version, vm_if& } } return true; - } void iss::plugin::cycle_estimate::callback(instr_info_t instr_info) { - assert(instr_if && "No instrumentation interface available but callback executed"); - auto entry = delays[instr_info.instr_id]; - bool taken = instr_if->is_branch_taken(); - if (taken && (entry.taken > 1)) - instr_if->update_last_instr_cycles(entry.taken); - else if (entry.not_taken > 1) - instr_if->update_last_instr_cycles(entry.not_taken); + size_t instr_id = instr_info.instr_id; + auto entry = delays[instr_id]; + if(instr_info.phase_id==PRE_SYNC) { + if(entry.f) + current_delay = entry.f(instr_if->get_instr_word()); + } else { + if(!entry.f) + current_delay = instr_if->is_branch_taken()? entry.taken: entry.not_taken; + if(current_delay>1) + instr_if->update_last_instr_cycles(current_delay); + } } diff --git a/src/iss/plugin/cycle_estimate.h b/src/iss/plugin/cycle_estimate.h index 079a805..7fc1b46 100644 --- a/src/iss/plugin/cycle_estimate.h +++ b/src/iss/plugin/cycle_estimate.h @@ -40,24 +40,20 @@ #include #include #include +#include namespace iss { namespace plugin { class cycle_estimate: public vm_plugin { - BEGIN_BF_DECL(instr_desc, uint32_t) - BF_FIELD(taken, 24, 8) - BF_FIELD(not_taken, 16, 8) - BF_FIELD(is_branch, 8, 8) - BF_FIELD(size, 0, 8) - instr_desc(uint32_t size, uint32_t taken, uint32_t not_taken, bool branch): instr_desc() { - this->size=size; - this->taken=taken; - this->not_taken=not_taken; - this->is_branch=branch; - } - END_BF_DECL(); + struct instr_desc { + size_t size; + bool is_branch; + unsigned not_taken; + unsigned taken; + std::function f; + }; public: cycle_estimate() = delete; @@ -76,13 +72,15 @@ public: bool registration(const char *const version, vm_if &arch) override; - sync_type get_sync() override { return POST_SYNC; }; + sync_type get_sync() override { return ALL_SYNC; }; void callback(instr_info_t instr_info) override; private: - iss::instrumentation_if *instr_if; + iss::instrumentation_if *instr_if{nullptr}; + uint32_t* reg_base_ptr {nullptr}; std::vector delays; + unsigned current_delay{0}; struct pair_hash { size_t operator()(const std::pair &p) const { std::hash hash;