From 5241e1d9733ea69a91d3f497bc794ce881ad49fd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Karel=20Ko=C4=8D=C3=AD?= Date: Mon, 15 Jan 2018 13:13:56 +0100 Subject: Change how we configure cache and configure hazard unit --- qtmips_gui/coreview/memory.cpp | 4 +-- qtmips_machine/machineconfig.cpp | 71 +++++++++++++++++++++++++++++++++------- qtmips_machine/machineconfig.h | 42 ++++++++++++++++++------ qtmips_machine/qtmipsmachine.cpp | 19 ++--------- 4 files changed, 95 insertions(+), 41 deletions(-) diff --git a/qtmips_gui/coreview/memory.cpp b/qtmips_gui/coreview/memory.cpp index 13355db..cde1c72 100644 --- a/qtmips_gui/coreview/memory.cpp +++ b/qtmips_gui/coreview/memory.cpp @@ -18,9 +18,7 @@ Memory::Memory(machine::QtMipsMachine *machine) : QGraphicsObject(nullptr) { con_req_write = new Connector(M_PI_2); con_req_read = new Connector(M_PI_2); - if (machine->config().cache()) { - // TODO cache? - } + // TODO cache? name = new QGraphicsSimpleTextItem("Memory", this); QRectF name_box = name->boundingRect(); diff --git a/qtmips_machine/machineconfig.cpp b/qtmips_machine/machineconfig.cpp index cf8629c..e479d66 100644 --- a/qtmips_machine/machineconfig.cpp +++ b/qtmips_machine/machineconfig.cpp @@ -2,18 +2,36 @@ using namespace machine; +MachineConfigCache::MachineConfigCache() { + // TODO +} + +MachineConfigCache::MachineConfigCache(const MachineConfigCache *cc) { + // TODO +} + +bool MachineConfigCache::operator==(const MachineConfigCache &c) const { + // TODO + return true; +} + +bool MachineConfigCache::operator!=(const MachineConfigCache &c) const { + return !operator==(c); +} + MachineConfig::MachineConfig() { pipeline = false; delayslot = true; - cache_type = CCT_NONE; - elf_path = QString(""); + hunit = HU_STALL_FORWARD; } MachineConfig::MachineConfig(const MachineConfig *cc) { pipeline = cc->pipelined(); delayslot = cc->delay_slot(); - cache_type = cc->cache(); elf_path = cc->elf(); + cch_program = cc->cache_program(); + cch_data = cc->cache_data(); + hunit = cc->hazard_unit(); } void MachineConfig::set_pipelined(bool v) { @@ -26,14 +44,22 @@ void MachineConfig::set_delay_slot(bool v) { pipeline = false; } -void MachineConfig::set_cache(enum CacheType cc) { - cache_type = cc; -} - void MachineConfig::set_elf(QString path) { elf_path = path; } +void MachineConfig::set_cache_program(const MachineConfigCache &c) { + cch_program = c; +} + +void MachineConfig::set_cache_data(const MachineConfigCache &c) { + cch_data = c; +} + +void MachineConfig::set_hazard_unit(enum MachineConfig::HazardUnit hu) { + hunit = hu; +} + bool MachineConfig::pipelined() const { return pipeline; } @@ -42,10 +68,33 @@ bool MachineConfig::delay_slot() const { return delayslot; } -enum MachineConfig::CacheType MachineConfig::cache() const { - return cache_type; -} - QString MachineConfig::elf() const { return elf_path; } + +MachineConfigCache MachineConfig::cache_program() const { + return cch_program; +} + +MachineConfigCache MachineConfig::cache_data() const { + return cch_data; +} + +enum MachineConfig::HazardUnit MachineConfig::hazard_unit() const { + return hunit; +} + +bool MachineConfig::operator==(const MachineConfig &c) const { +#define CMP(GETTER) (GETTER)() == (c.GETTER)() + return CMP(pipelined) && \ + CMP(delay_slot) && \ + CMP(elf) && \ + CMP(cache_program) && \ + CMP(cache_data) && \ + CMP(hazard_unit); +#undef CMP +} + +bool MachineConfig::operator!=(const MachineConfig &c) const { + return !operator==(c); +} diff --git a/qtmips_machine/machineconfig.h b/qtmips_machine/machineconfig.h index c55228a..10b8458 100644 --- a/qtmips_machine/machineconfig.h +++ b/qtmips_machine/machineconfig.h @@ -5,38 +5,60 @@ namespace machine { +class MachineConfigCache { +public: + MachineConfigCache(); + MachineConfigCache(const MachineConfigCache *cc); + + // TODO + + bool operator ==(const MachineConfigCache &c) const; + bool operator !=(const MachineConfigCache &c) const; + +private: + // TODO +}; + class MachineConfig { public: MachineConfig(); MachineConfig(const MachineConfig *cc); - enum CacheType { - CCT_NONE, - CCT_ASSOCIATIVE, - // TODO + enum HazardUnit { + HU_NONE, + HU_STALL, + HU_STALL_FORWARD }; // Configure if CPU is pipelined // In default disabled. void set_pipelined(bool); - // Configure if we want to do jump prediction + // Configure if cpu should simulate delay slot in non-pipelined core // In default enabled. When disabled it also automatically disables pipelining. void set_delay_slot(bool); - // Configure cache type - // In default CCT_NONE is used. - void set_cache(enum CacheType); // Set path to source elf file. This has to be set before core is initialized. void set_elf(QString path); + // Configure cache + void set_cache_program(const MachineConfigCache&); + void set_cache_data(const MachineConfigCache&); + // Hazard unit + void set_hazard_unit(enum HazardUnit); bool pipelined() const; bool delay_slot() const; - enum CacheType cache() const; QString elf() const; + MachineConfigCache cache_program() const; + MachineConfigCache cache_data() const; + enum HazardUnit hazard_unit() const; + + bool operator ==(const MachineConfig &c) const; + bool operator !=(const MachineConfig &c) const; private: bool pipeline, delayslot; - enum CacheType cache_type; QString elf_path; + MachineConfigCache cch_program, cch_data; + enum HazardUnit hunit; }; } diff --git a/qtmips_machine/qtmipsmachine.cpp b/qtmips_machine/qtmipsmachine.cpp index f2683fb..c60cdce 100644 --- a/qtmips_machine/qtmipsmachine.cpp +++ b/qtmips_machine/qtmipsmachine.cpp @@ -14,25 +14,10 @@ QtMipsMachine::QtMipsMachine(const MachineConfig &cc) : QObject(), mcnf(&cc) { regs = new Registers(); mem = new Memory(*mem_program_only); - MemoryAccess *coremem; - switch (cc.cache()) { - case MachineConfig::CCT_NONE: - cch = nullptr; - coremem = mem; - break; - case MachineConfig::CCT_ASSOCIATIVE: - // TODO - coremem = mem; - //coremem = cch = new CacheAssociative(); - break; - default: - throw QTMIPS_EXCEPTION(Sanity, "Trying to configure unknown cache type", ""); - } - if (cc.pipelined()) - cr = new CorePipelined(regs, coremem); + cr = new CorePipelined(regs, mem); else - cr = new CoreSingle(regs, coremem, cc.delay_slot()); + cr = new CoreSingle(regs, mem, cc.delay_slot()); run_t = new QTimer(this); set_speed(0); // In default run as fast as possible -- cgit v1.2.3