source: branches/reconfiguration/modules/vci_mem_cache/caba/test/memcache_cc_test/dspin_memcache_cc_test/caba/source/src/dspin_memcache_cc_test.cpp @ 872

Last change on this file since 872 was 872, checked in by cfuguet, 9 years ago

reconf: adding test platform for the vci_mem_cache test mechanisms

  • The goal is to test the recently introduced test mechanisms of the coherence network in the VciMemCache?.
File size: 5.3 KB
Line 
1/**
2 * \file   dspin_memcache_cc_test.cpp
3 * \date   October 10, 2014
4 * \author Cesar Fuguet <cesar.fuguet-tortolero@lip6.fr>
5 */
6#include "dspin_memcache_cc_test.h"
7#include <cstdlib>
8
9#define tmpl(x) template<size_t M2P_WIDTH, size_t P2M_WIDTH> x \
10    DspinMemcacheCcTest<M2P_WIDTH, P2M_WIDTH>
11
12namespace soclib { namespace caba {
13
14tmpl(/**/)::DspinMemcacheCcTest(sc_module_name name) :
15    BaseModule(name),
16    m_srcid(0),
17    r_gen_test_fsm("r_gen_test_fsm"),
18    r_sign("r_sign")
19{
20    SC_METHOD(transition);
21    dont_initialize();
22    sensitive << p_clk.pos();
23
24    SC_METHOD(genMoore);
25    dont_initialize();
26    sensitive << p_clk.neg();
27}
28
29tmpl(/**/)::~DspinMemcacheCcTest()
30{
31
32}
33
34tmpl(void)::transition()
35{
36    if (!p_resetn.read()) {
37        r_gen_test_fsm = P2M_HEADER;
38        r_sign = 1;
39        return;
40    }
41
42    switch(r_gen_test_fsm.read()) {
43        case P2M_HEADER:
44            if (!p_dspin_p2m.read.read()) break;
45
46            assert(!p_dspin_m2p.write.read());
47            assert(!p_dspin_clack.write.read());
48
49            r_gen_test_fsm = P2M_SIGNATURE;
50
51#if SOCLIB_MODULE_DEBUG
52            std::cout << this->name() << ":P2M_HEADER" << std::endl;
53#endif
54            break;
55
56        case P2M_SIGNATURE:
57            if (!p_dspin_p2m.read.read()) break;
58
59            assert(!p_dspin_m2p.write.read());
60            assert(!p_dspin_clack.write.read());
61
62            r_gen_test_fsm = WAIT_M2P_AND_CLACK;
63
64#if SOCLIB_MODULE_DEBUG
65            std::cout << this->name() << ":P2M_SIGNATURE" << std::endl;
66#endif
67            break;
68
69        case WAIT_M2P_AND_CLACK:
70        {
71            if (!p_dspin_m2p.write.read() || !p_dspin_clack.write.read()) break;
72
73            uint64_t m2p_dest =
74                FlitParam::dspin_get(p_dspin_m2p.data.read(),
75                                     FlitParam::TEST_M2P_DEST);
76            uint64_t m2p_test =
77                FlitParam::dspin_get(p_dspin_m2p.data.read(),
78                                     FlitParam::TEST_M2P_TEST);
79            uint64_t clack_dest =
80                FlitParam::dspin_get(p_dspin_clack.data.read(),
81                                     FlitParam::TEST_CLACK_DEST);
82            uint64_t clack_test =
83                FlitParam::dspin_get(p_dspin_clack.data.read(),
84                                     FlitParam::TEST_CLACK_TEST);
85
86            assert(!p_dspin_m2p.eop.read());
87            assert(!p_dspin_clack.eop.read());
88            assert((uint32_t)m2p_dest == m_srcid);
89            assert((uint32_t)clack_dest == m_srcid);
90            assert(m2p_test);
91            assert(clack_test);
92
93            r_gen_test_fsm = CHECK_SIGNATURE;
94
95#if SOCLIB_MODULE_DEBUG
96            std::cout << this->name() << ":WAIT_M2P_AND_CLACK" << std::endl;
97#endif
98            break;
99        }
100
101        case CHECK_SIGNATURE:
102        {
103            uint64_t m2p_sign =
104                FlitParam::dspin_get(p_dspin_m2p.data.read(),
105                                     FlitParam::TEST_M2P_SIGNATURE);
106            uint64_t clack_sign =
107                FlitParam::dspin_get(p_dspin_clack.data.read(),
108                                     FlitParam::TEST_CLACK_SIGNATURE);
109
110            assert((uint32_t)(m2p_sign & ((1ULL << 32) - 1)) ==
111                    r_sign.read());
112            assert((uint32_t)(m2p_sign >> 32) ==
113                   (r_sign.read() & ((1 << 7) - 1)));
114            assert((uint32_t)(clack_sign & ((1ULL << 32) - 1)) ==
115                    r_sign.read());
116            assert((uint32_t)(clack_sign >> 32) ==
117                   (r_sign.read() & ((1 << 7) - 1)));
118
119            if ((uint32_t)(m2p_sign & ((1ULL << 32) - 1)) == (1UL << 31)) {
120                std::cout << this->name() << ": success" << std::endl;
121                exit(EXIT_SUCCESS);
122            }
123
124            r_sign = r_sign.read() << 1;
125            r_gen_test_fsm = P2M_HEADER;
126
127#if SOCLIB_MODULE_DEBUG
128            std::cout << this->name() << ":CHECK_SIGNATURE" << std::endl;
129#endif
130            break;
131        }
132    }
133}
134
135tmpl(void)::genMoore()
136{
137    p_dspin_p2m.write = false;
138    p_dspin_p2m.data = 0;
139    p_dspin_p2m.eop = 0;
140    p_dspin_m2p.read = 0;
141    p_dspin_clack.read = 0;
142
143    switch(r_gen_test_fsm.read()) {
144        case P2M_HEADER:
145        {
146            uint64_t flit = 0;
147            FlitParam::dspin_set(flit, 0, FlitParam::TEST_P2M_DEST);
148            FlitParam::dspin_set(flit, m_srcid, FlitParam::TEST_P2M_SRCID);
149            FlitParam::dspin_set(flit, 1, FlitParam::TEST_P2M_TEST);
150            FlitParam::dspin_set(flit, FlitParam::TYPE_TEST,
151                                 FlitParam::P2M_TYPE);
152            p_dspin_p2m.data = flit;
153            p_dspin_p2m.write = true;
154            break;
155        }
156
157        case P2M_SIGNATURE:
158        {
159            uint64_t flit = 0;
160            FlitParam::dspin_set(flit, r_sign.read(),
161                                 FlitParam::TEST_P2M_SIGNATURE);
162            p_dspin_p2m.eop = true;
163            p_dspin_p2m.data = flit;
164            p_dspin_p2m.write = true;
165            break;
166        }
167
168        case WAIT_M2P_AND_CLACK:
169            p_dspin_m2p.read = true;
170            p_dspin_clack.read = true;
171            break;
172
173        case CHECK_SIGNATURE:
174            p_dspin_m2p.read = true;
175            p_dspin_clack.read = true;
176            break;
177    }
178}
179
180}                               /* namespace caba */
181}                               /* namespace soclib */
182
183/*
184 * vim: ts=4 : sw=4 : sts=4 : et
185 */
Note: See TracBrowser for help on using the repository browser.