aboutsummaryrefslogtreecommitdiff
path: root/qtmips_machine/cache.h
diff options
context:
space:
mode:
authorKarel Kočí <cynerd@email.cz>2018-05-23 20:23:10 +0200
committerKarel Kočí <cynerd@email.cz>2018-05-23 20:23:10 +0200
commitddde26b916c99078421992100849101455756415 (patch)
tree25a8dee1fb6ae3a78d5a46e2aabd5aa4f8bb7fb3 /qtmips_machine/cache.h
parentf1fc0fc1ad628d19382fe2a026a767af6f6ba12f (diff)
downloadqtmips-ddde26b916c99078421992100849101455756415.tar.gz
qtmips-ddde26b916c99078421992100849101455756415.tar.bz2
qtmips-ddde26b916c99078421992100849101455756415.zip
Add cache statistics
Diffstat (limited to 'qtmips_machine/cache.h')
-rw-r--r--qtmips_machine/cache.h10
1 files changed, 8 insertions, 2 deletions
diff --git a/qtmips_machine/cache.h b/qtmips_machine/cache.h
index d7bd967..6cf3a2c 100644
--- a/qtmips_machine/cache.h
+++ b/qtmips_machine/cache.h
@@ -11,7 +11,7 @@ namespace machine {
class Cache : public MemoryAccess {
Q_OBJECT
public:
- Cache(Memory *m, const MachineConfigCache *c);
+ Cache(Memory *m, const MachineConfigCache *c, unsigned memory_access_penalty_r = 1, unsigned memory_access_penalty_w = 1);
void wword(std::uint32_t address, std::uint32_t value);
std::uint32_t rword(std::uint32_t address) const;
@@ -21,6 +21,9 @@ public:
unsigned hit() const; // Number of recorded hits
unsigned miss() const; // Number of recorded misses
+ unsigned stalled_cycles() const; // Number of wasted cycles in memory waitin statistic
+ double speed_improvement() const; // Speed improvement in percents in comare with no used cache
+ double usage_efficiency() const; // Usage efficiency in percents
void reset(); // Reset whole state of cache
@@ -29,11 +32,13 @@ public:
signals:
void hit_update(unsigned) const;
void miss_update(unsigned) const;
+ void statistics_update(unsigned stalled_cycles, double speed_improv, double usage_effic) const;
void cache_update(unsigned associat, unsigned set, bool valid, bool dirty, std::uint32_t tag, const std::uint32_t *data) const;
private:
MachineConfigCache cnf;
Memory *mem;
+ unsigned access_pen_r, access_pen_w;
struct cache_data {
bool valid, dirty;
@@ -47,11 +52,12 @@ private:
unsigned **lfu; // Access count
} replc; // Data used for replacement policy
- mutable unsigned hitc, missc; // Hit and miss counters
+ mutable unsigned hit_read, miss_read, hit_write, miss_write; // Hit and miss counters
void access(std::uint32_t address, std::uint32_t *data, bool write, std::uint32_t value = 0) const;
void kick(unsigned associat_indx, unsigned row) const;
std::uint32_t base_address(std::uint32_t tag, unsigned row) const;
+ void update_statistics() const;
};
}