Commit d8a2bef8 authored by Gaurav Kukreja's avatar Gaurav Kukreja

Major bugfix in branch_predictor, stupid me. Simple changes to cache

Signed-off-by: Gaurav Kukreja's avatarGaurav Kukreja <gaurav@gauravk.in>
parent d126c154
...@@ -28,24 +28,21 @@ unsigned int bPredTableEntries; ...@@ -28,24 +28,21 @@ unsigned int bPredTableEntries;
unsigned int prevBlockValid; unsigned int prevBlockValid;
unsigned long prevBlockEndAdd; unsigned long prevBlockEndAdd;
void removeHeadEntry()
{
// bPredTable_head and the next pointer must not be NULL
// TODO: Add an assert!
bPredTableEntry_t *tmp;
tmp = bPredTable_head;
bPredTable_head = bPredTable_head->next;
bPredTable_head->prev = NULL;
free(tmp);
}
void insertEntryToTail(bPredTableEntry_t *entry) void insertEntryToTail(bPredTableEntry_t *entry)
{ {
// printf("***************** Inserting Entry! 0x%lx\n\n", entry->branchInstAdd);
if (bPredTableEntries == BPRED_TABLE_MAX_ENTRIES) if (bPredTableEntries == BPRED_TABLE_MAX_ENTRIES)
{ {
// Table Capacity full, must remove least recently used to make space // Table Capacity full, must remove least recently used to make space
bPredTableEntry_t *tmp;
tmp = bPredTable_head;
bPredTable_head = bPredTable_head->next;
bPredTable_head->prev = NULL;
bPredTableEntries--;
free(tmp);
} }
if (bPredTable_head == NULL && if (bPredTable_head == NULL &&
bPredTable_tail == NULL) bPredTable_tail == NULL)
{ {
...@@ -53,6 +50,7 @@ void insertEntryToTail(bPredTableEntry_t *entry) ...@@ -53,6 +50,7 @@ void insertEntryToTail(bPredTableEntry_t *entry)
entry->prev = NULL; entry->prev = NULL;
bPredTable_head = entry; bPredTable_head = entry;
bPredTable_tail = entry; bPredTable_tail = entry;
bPredTableEntries++;
return; return;
} }
else else
...@@ -61,6 +59,7 @@ void insertEntryToTail(bPredTableEntry_t *entry) ...@@ -61,6 +59,7 @@ void insertEntryToTail(bPredTableEntry_t *entry)
entry->prev = bPredTable_tail; entry->prev = bPredTable_tail;
entry->next = NULL; entry->next = NULL;
bPredTable_tail = entry; bPredTable_tail = entry;
bPredTableEntries++;
return; return;
} }
} }
...@@ -115,7 +114,12 @@ unsigned int enterBlock (unsigned long blockObjStartAdd, ...@@ -115,7 +114,12 @@ unsigned int enterBlock (unsigned long blockObjStartAdd,
predicted = 0; predicted = 0;
} }
#define ADDRESS_IS_LINE_NUMBER
#ifdef ADDRESS_IS_LINE_NUMBER
if (blockObjStartAdd == prevBlockEndAdd + 1)
#else
if (blockObjStartAdd == prevBlockEndAdd + 4) if (blockObjStartAdd == prevBlockEndAdd + 4)
#endif
{ {
// Branch was not taken! // Branch was not taken!
isBranchTaken = 0; isBranchTaken = 0;
...@@ -131,6 +135,7 @@ unsigned int enterBlock (unsigned long blockObjStartAdd, ...@@ -131,6 +135,7 @@ unsigned int enterBlock (unsigned long blockObjStartAdd,
{ {
if (entry->branchInstAdd == prevBlockEndAdd) if (entry->branchInstAdd == prevBlockEndAdd)
{ {
// printf ("Entry Found!\n");
// Entry Found! // Entry Found!
if (entry->prediction == STRONGLY_NOT_TAKEN) if (entry->prediction == STRONGLY_NOT_TAKEN)
{ {
...@@ -201,9 +206,10 @@ unsigned int enterBlock (unsigned long blockObjStartAdd, ...@@ -201,9 +206,10 @@ unsigned int enterBlock (unsigned long blockObjStartAdd,
} }
else else
{ {
// printf ("Entry NOT Found! 0x%lx\n", prevBlockEndAdd);
// Entry was not found! // Entry was not found!
entry = malloc(sizeof(bPredTableEntry_t)); entry = malloc(sizeof(bPredTableEntry_t));
entry->branchInstAdd = blockObjEndAdd; entry->branchInstAdd = prevBlockEndAdd;
if (isBranchTaken) if (isBranchTaken)
{ {
entry->prediction = WEAKLY_NOT_TAKEN; entry->prediction = WEAKLY_NOT_TAKEN;
...@@ -219,10 +225,14 @@ unsigned int enterBlock (unsigned long blockObjStartAdd, ...@@ -219,10 +225,14 @@ unsigned int enterBlock (unsigned long blockObjStartAdd,
prevBlockEndAdd = blockObjEndAdd; prevBlockEndAdd = blockObjEndAdd;
// if (!predicted) if (!predicted)
// { {
// printf("Branch NOT Predicted\n"); printf("Branch NOT Predicted. Start 0x%lx; End 0x%lx\n\n", blockObjStartAdd, blockObjEndAdd);
// } }
else
{
// printf(" ****** Predicted. Start 0x%lx; End 0x%lx\n\n", blockObjStartAdd, blockObjEndAdd);
}
return predicted; return predicted;
} }
......
...@@ -66,8 +66,8 @@ cacheLine_t **L1DCache; ...@@ -66,8 +66,8 @@ cacheLine_t **L1DCache;
cacheLine_t **L1ICache; cacheLine_t **L1ICache;
cacheLine_t **L2Cache; cacheLine_t **L2Cache;
unsigned int memWriteLatency = 55; unsigned int memWriteLatency = 50;
unsigned int memReadLatency = 55; unsigned int memReadLatency = 50;
unsigned int memReadPrefetchLatency = 0; unsigned int memReadPrefetchLatency = 0;
unsigned long L1D_Hit_Read = 0; unsigned long L1D_Hit_Read = 0;
...@@ -100,6 +100,9 @@ typedef struct prevAccess prevAccess_t; ...@@ -100,6 +100,9 @@ typedef struct prevAccess prevAccess_t;
prevAccess_t *prevAccessList_head; prevAccess_t *prevAccessList_head;
prevAccess_t *prevAccessList_tail; prevAccess_t *prevAccessList_tail;
// Round Robin L2 Cache Replacement
unsigned int L2_RR_evictSetIndex;
/**** LOCAL FUNCTIONS *********************************************************/ /**** LOCAL FUNCTIONS *********************************************************/
void insertAccess(prevAccess_t **head, prevAccess_t **tail, unsigned long address, unsigned long seqAccess) void insertAccess(prevAccess_t **head, prevAccess_t **tail, unsigned long address, unsigned long seqAccess)
...@@ -218,14 +221,14 @@ void initCacheParams () ...@@ -218,14 +221,14 @@ void initCacheParams ()
L1ICacheConf.isWriteThrough = 0; L1ICacheConf.isWriteThrough = 0;
L1ICacheConf.hitLatency = 1; L1ICacheConf.hitLatency = 0;
L1ICacheConf.missLatency = 0; L1ICacheConf.missLatency = 0;
/*** L2 Cache *****************/ /*** L2 Cache *****************/
L2CacheConf.lineLenBytes = 32; L2CacheConf.lineLenBytes = 32;
L2CacheConf.cacheSizeBytes = 256 * 1024; // 256 KB L2CacheConf.cacheSizeBytes = 512 * 1024; // 256 KB
L2CacheConf.numSets = 16; L2CacheConf.numSets = 16;
L2CacheConf.numLines = L2CacheConf.cacheSizeBytes / L2CacheConf.numLines = L2CacheConf.cacheSizeBytes /
...@@ -253,8 +256,8 @@ void initCacheParams () ...@@ -253,8 +256,8 @@ void initCacheParams ()
L2CacheConf.isWriteThrough = 0; L2CacheConf.isWriteThrough = 0;
L2CacheConf.hitLatency = 14; L2CacheConf.hitLatency = 16;
L2CacheConf.missLatency = 14; L2CacheConf.missLatency = 16;
} }
...@@ -392,7 +395,17 @@ unsigned long long cortexA5_simICache(unsigned long address, ...@@ -392,7 +395,17 @@ unsigned long long cortexA5_simICache(unsigned long address,
if(l2InvalidSetIndex == -1) if(l2InvalidSetIndex == -1)
{ {
l2InvalidSetIndex = random() % L2CacheConf.numSets; // l2InvalidSetIndex = random() % L2CacheConf.numSets;
l2InvalidSetIndex = L2_RR_evictSetIndex++;
if (L2_RR_evictSetIndex == L2CacheConf.numSets)
L2_RR_evictSetIndex = 0;
if(IS_CACHELINE_DIRTY(L2Cache[l2Index][l2InvalidSetIndex].flags))
{
// Write Back to memory!
latency += memWriteLatency;
L2_Hit_Writeback++;
}
} }
L2Cache[l2Index][l2InvalidSetIndex].tag = l2Tag; L2Cache[l2Index][l2InvalidSetIndex].tag = l2Tag;
...@@ -543,7 +556,10 @@ unsigned long long cortexA5_simDCache(unsigned long address, ...@@ -543,7 +556,10 @@ unsigned long long cortexA5_simDCache(unsigned long address,
if(l2InvalidSetIndex == -1) if(l2InvalidSetIndex == -1)
{ {
l2InvalidSetIndex = random() % L2CacheConf.numSets; // l2InvalidSetIndex = random() % L2CacheConf.numSets;
l2InvalidSetIndex = L2_RR_evictSetIndex;
if (L2_RR_evictSetIndex == L2CacheConf.numSets)
L2_RR_evictSetIndex = 0;
if(IS_CACHELINE_DIRTY(L2Cache[l2Index][l2InvalidSetIndex].flags)) if(IS_CACHELINE_DIRTY(L2Cache[l2Index][l2InvalidSetIndex].flags))
{ {
...@@ -586,6 +602,7 @@ unsigned long long cortexA5_simDCache(unsigned long address, ...@@ -586,6 +602,7 @@ unsigned long long cortexA5_simDCache(unsigned long address,
* *
* Add the latency. * Add the latency.
*/ */
latency += L2CacheConf.hitLatency; latency += L2CacheConf.hitLatency;
SET_CACHELINE_INVALID(L2Cache[index][setIndex].flags); SET_CACHELINE_INVALID(L2Cache[index][setIndex].flags);
SET_CACHELINE_CLEAN(L2Cache[index][setIndex].flags); SET_CACHELINE_CLEAN(L2Cache[index][setIndex].flags);
...@@ -681,6 +698,8 @@ void cortexA5_cacheSimInit(struct csim_result_t *result) ...@@ -681,6 +698,8 @@ void cortexA5_cacheSimInit(struct csim_result_t *result)
prevAccessList_tail = NULL; prevAccessList_tail = NULL;
prefetch_table_entries = 0; prefetch_table_entries = 0;
L2_RR_evictSetIndex = 0;
return; return;
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment