-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathcache_system.cpp
More file actions
90 lines (72 loc) · 2.7 KB
/
Copy pathcache_system.cpp
File metadata and controls
90 lines (72 loc) · 2.7 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
#include "cache_system.h"
CacheSystem::CacheSystem(int l1_lat, int l2_lat, int mem_lat)
: l1i(1024, 64, 4, ReplacementPolicy::LRU), // 1KB, 64B block, 4-way
l1d(1024, 64, 4, ReplacementPolicy::LRU), // 1KB, 64B block, 4-way
l2(4096, 64, 8, ReplacementPolicy::LRU), // 4KB, 64B block, 8-way Unified
l1_latency(l1_lat),
l2_latency(l2_lat),
mem_latency(mem_lat) {}
AccessResult CacheSystem::accessInstruction(uint32_t address) {
AccessResult result;
result.l1_hit = false;
result.l2_hit = false;
result.total_latency = 0;
// 1. Check L1I
result.total_latency += l1_latency;
l1i.access(address, result.l1_hit);
if (result.l1_hit) {
result.level_reached = "L1I";
return result;
}
// 2. L1I Miss -> Check L2
result.total_latency += l2_latency;
l2.access(address, result.l2_hit);
if (result.l2_hit) {
result.level_reached = "L2";
l1i.insertBlock(address); // Bring block to L1I
return result;
}
// 3. L2 Miss -> Main Memory
result.total_latency += mem_latency;
result.level_reached = "Main Memory";
// Fill hierarchy: Main Memory -> L2 -> L1I
l2.insertBlock(address);
l1i.insertBlock(address);
return result;
}
AccessResult CacheSystem::accessData(uint32_t address, bool is_write) {
AccessResult result;
result.l1_hit = false;
result.l2_hit = false;
result.total_latency = 0;
// 1. Check L1D
result.total_latency += l1_latency;
l1d.access(address, result.l1_hit);
if (result.l1_hit) {
result.level_reached = "L1D";
// Handle write-through/back logic would go here if specialized
return result;
}
// 2. L1D Miss -> Check L2
result.total_latency += l2_latency;
l2.access(address, result.l2_hit);
if (result.l2_hit) {
result.level_reached = "L2";
l1d.insertBlock(address); // Bring block to L1D
return result;
}
// 3. L2 Miss -> Main Memory
result.total_latency += mem_latency;
result.level_reached = "Main Memory";
// Fill hierarchy: Main Memory -> L2 -> L1D
l2.insertBlock(address);
l1d.insertBlock(address);
return result;
}
void CacheSystem::printStats() {
std::cout << "\n========== CACHE HIERARCHY STATS ==========" << std::endl;
std::cout << "L1 Instruction Cache: " << l1i.hits << " Hits, " << l1i.misses << " Misses" << std::endl;
std::cout << "L1 Data Cache: " << l1d.hits << " Hits, " << l1d.misses << " Misses" << std::endl;
std::cout << "L2 Unified Cache: " << l2.hits << " Hits, " << l2.misses << " Misses" << std::endl;
std::cout << "===========================================\n" << std::endl;
}