summaryrefslogtreecommitdiff
path: root/src/storage
diff options
context:
space:
mode:
authorSiddarth-Suresh <65844402+Siddarth-Suresh@users.noreply.github.com>2025-03-11 15:54:22 -0400
committerSiddarth-Suresh <65844402+Siddarth-Suresh@users.noreply.github.com>2025-03-11 15:54:22 -0400
commit07e0b709f35ee83d91c62dfbc9cb3f4de7e7ef98 (patch)
tree16b169816c5475ab07bc0c2df2ebd50b6884acc8 /src/storage
parentfdb15ea8595d7c702d7577e86a1a96adc6ecdf81 (diff)
read has to wait until cache has the right line from memory after eviction, write only has to wait until eviction and does not care about line replacement in cache from memory
Diffstat (limited to 'src/storage')
-rw-r--r--src/storage/cache.cc13
1 files changed, 8 insertions, 5 deletions
diff --git a/src/storage/cache.cc b/src/storage/cache.cc
index 08699ed..1224aa9 100644
--- a/src/storage/cache.cc
+++ b/src/storage/cache.cc
@@ -34,7 +34,7 @@ Response Cache::write(Accessor accessor, signed int data, int address)
this->requester = accessor;
if (this->requester == accessor) {
- fetch_resource(address);
+ fetch_resource(WRITE,address);
if (this->is_waiting)
r = BLOCKED;
else if (this->wait_time == 0) {
@@ -58,7 +58,7 @@ Response Cache::write_line(Accessor accessor, std::array<signed int, LINE_SIZE>
this->requester = accessor;
if (this->requester == accessor) {
- fetch_resource(address);
+ fetch_resource(WRITE,address);
if (this->is_waiting)
r = BLOCKED;
else if (this->wait_time == 0) {
@@ -80,7 +80,7 @@ Response Cache::read(Accessor accessor, int address, std::array<signed int, LINE
if (this->requester == IDLE)
this->requester = accessor;
if (this->requester == accessor) {
- fetch_resource(address);
+ fetch_resource(READ,address);
if (this->is_waiting)
r = BLOCKED;
else if (this->wait_time == 0) {
@@ -99,7 +99,7 @@ Response Cache::read_word(Accessor accessor, int address, signed int &data)
if (this->requester == IDLE)
this->requester = accessor;
if (this->requester == accessor) {
- fetch_resource(address);
+ fetch_resource(READ,address);
if (this->is_waiting)
r = BLOCKED;
else if (this->wait_time == 0) {
@@ -112,7 +112,7 @@ Response Cache::read_word(Accessor accessor, int address, signed int &data)
return r;
}
-void Cache::fetch_resource(int expected)
+void Cache::fetch_resource(Operation op, int expected)
{
Response r = OK;
int tag, index, offset;
@@ -131,6 +131,9 @@ void Cache::fetch_resource(int expected)
r = this->lower->write_line(L1CACHE, actual, ((index << LINE_SPEC) + (meta->at(0) << (L1_CACHE_SPEC + LINE_SPEC))));
if (r == OK) {
meta->at(1) = -1;
+ if(op == READ){
+ r = WAIT; //if operation is read, need to wait until cache is loaded with right value from memory address, if operation is write, then this is not necessary
+ }
}
} else {
r = this->lower->read(L1CACHE, expected, actual);