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 | |
---|
12 | namespace soclib { namespace caba { |
---|
13 | |
---|
14 | tmpl(/**/)::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 | |
---|
29 | tmpl(/**/)::~DspinMemcacheCcTest() |
---|
30 | { |
---|
31 | |
---|
32 | } |
---|
33 | |
---|
34 | tmpl(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 | |
---|
135 | tmpl(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 | */ |
---|