blob: 5c1b645bd00cefbe349107bd165f273f5ed06c8f (
plain)
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
91
92
93
94
95
96
97
98
99
100
|
#include "if.h"
#include "cache.h"
#include "controller.h"
#include "dram.h"
#include "instrDTO.h"
#include <catch2/catch_test_macros.hpp>
class IFPipeFixture
{
public:
IFPipeFixture()
{
Dram *d;
d = new Dram(this->m_delay);
// 0xC00 is a nop
p = {0xC000, 0xC001, 0xC002, 0xC003};
d->load(p);
this->c = new Cache(d, this->c_delay);
this->f = new IF(nullptr);
this->ct = new Controller(this->f, this->c, true);
}
~IFPipeFixture()
{
delete this->ct;
delete this->c;
};
/**
* Fetch a clean line not in cache.
*/
void fetch_through(InstrDTO &instr)
{
int i;
Response r;
for (i = 0; i < this->m_delay + 1; ++i) {
r = this->ct->advance(instr);
// check response
CHECK(r == BLOCKED);
}
this->fetch_cache(instr);
}
/**
* Fetch a line in cache.
*/
void fetch_cache(InstrDTO &instr)
{
int i;
Response r;
for (i = 0; i < this->c_delay; ++i) {
r = this->ct->advance(instr);
// check response
CHECK(r == WAIT);
}
r = this->ct->advance(instr);
// check response
CHECK(r == OK);
}
int m_delay = 3;
int c_delay = 1;
std::vector<signed int> p;
Cache *c;
IF *f;
Controller *ct;
};
TEST_CASE_METHOD(IFPipeFixture, "fetch returns single instuction", "[if_pipe]")
{
InstrDTO instr;
int expected_cycles;
expected_cycles = this->m_delay + this->c_delay + 2;
this->fetch_through(instr);
CHECK(instr.get_if_cycle() == expected_cycles);
REQUIRE(instr.get_instr_bits() == this->p[0]);
}
TEST_CASE_METHOD(IFPipeFixture, "fetch returns two instuctions", "[if_pipe]")
{
InstrDTO instr;
int expected_cycles;
expected_cycles = this->m_delay + this->c_delay + 2;
this->fetch_through(instr);
CHECK(instr.get_if_cycle() == expected_cycles);
REQUIRE(instr.get_instr_bits() == this->p[0]);
expected_cycles += this->c_delay + 1;
this->fetch_cache(instr);
CHECK(instr.get_if_cycle() == expected_cycles);
REQUIRE(instr.get_instr_bits() == this->p[1]);
}
|