source: trunk/platforms/caba-ring-memcache-mipsel/top_wrapper_ring.cpp@ 16

Last change on this file since 16 was 3, checked in by nipo, 17 years ago

Import platforms

  • Property svn:eol-style set to native
  • Property svn:executable set to *
  • Property svn:keywords set to "Author Date Id Rev URL Revision"
  • Property svn:mime-type set to text/plain
File size: 8.2 KB
Line 
1#include <systemc>
2#include <sys/time.h>
3#include <iostream>
4#include <cstdlib>
5#include <cstdarg>
6
7#include "mapping_table.h"
8#include "mips.h"
9#include "ississ2.h"
10#include "iss_simhelper.h"
11#include "vci_simple_ram.h"
12#include "vci_multi_tty.h"
13#include "vci_mem_cache.h"
14#include "vci_cc_xcache_wrapper.h"
15#include "vci_ring_initiator_wrapper.h"
16#include "vci_ring_target_wrapper.h"
17
18//#define SOCVIEW 1
19
20#ifdef USE_GDB_SERVER
21#include "iss/gdbserver.h"
22#endif
23
24#include "segmentation.h"
25
26int _main(int argc, char *argv[])
27{
28 using namespace sc_core;
29 // Avoid repeating these everywhere
30 using soclib::common::IntTab;
31 using soclib::common::Segment;
32
33 // Define VCI parameters
34 typedef soclib::caba::VciParams<4,8,32,1,1,1,8,4,4,1> vci_param;
35 typedef soclib::common::IssIss2<soclib::common::IssSimhelper<soclib::common::MipsElIss> > proc_iss;
36
37 // Mapping table
38
39 soclib::common::MappingTable maptabp(32, IntTab(8), IntTab(8), 0x00300000);
40
41 maptabp.add(Segment("reset", RESET_BASE, RESET_SIZE, IntTab(0), true));
42 maptabp.add(Segment("excep", EXCEP_BASE, EXCEP_SIZE, IntTab(0), true));
43 maptabp.add(Segment("tty" , TTY_BASE , TTY_SIZE , IntTab(1), false));
44 maptabp.add(Segment("mc_r" , MC_R_BASE , MC_R_SIZE , IntTab(2), false, true, IntTab(0)));
45 maptabp.add(Segment("mc_m" , MC_M_BASE , MC_M_SIZE , IntTab(2), true ));
46
47 std::cout << maptabp << std::endl;
48
49 soclib::common::MappingTable maptabc(32, IntTab(8), IntTab(8), 0x00300000);
50 maptabc.add(Segment("proc" , PROC0_BASE , PROC_SIZE , IntTab(0), false, true, IntTab(0)));
51 std::cout << maptabc << std::endl;
52
53 soclib::common::MappingTable maptabx(32, IntTab(8), IntTab(8), 0x00300000);
54 maptabx.add(Segment("xram" , MC_M_BASE , MC_M_SIZE , IntTab(0), false));
55
56 std::cout << maptabx << std::endl;
57
58 // Signals
59
60 sc_clock signal_clk("clk");
61 sc_signal<bool> signal_resetn("resetn");
62
63 sc_signal<bool> signal_proc_it0("proc_it0");
64 sc_signal<bool> signal_proc_it1("proc_it1");
65 sc_signal<bool> signal_proc_it2("proc_it2");
66 sc_signal<bool> signal_proc_it3("proc_it3");
67 sc_signal<bool> signal_proc_it4("proc_it4");
68 sc_signal<bool> signal_proc_it5("proc_it5");
69
70 soclib::caba::VciSignals<vci_param> signal_vci_ini_proc("vci_ini_proc");
71 soclib::caba::VciSignals<vci_param> signal_vci_tgt_proc("vci_tgt_proc");
72
73 soclib::caba::VciSignals<vci_param> signal_vci_tgt_tty("vci_tgt_tty");
74
75 soclib::caba::VciSignals<vci_param> signal_vci_tgt_rom("vci_tgt_rom");
76
77 soclib::caba::VciSignals<vci_param> signal_vci_tgt_xram("vci_tgt_xram");
78
79 soclib::caba::VciSignals<vci_param> signal_vci_ixr_memc("vci_ixr_memc");
80 soclib::caba::VciSignals<vci_param> signal_vci_ini_memc("vci_ini_memc");
81 soclib::caba::VciSignals<vci_param> signal_vci_tgt_memc("vci_tgt_memc");
82
83 sc_signal<bool> signal_tty_irq("signal_tty_irq");
84
85 // Components
86 // VCI ports indexation : 3 intiateurs et 5 cibles
87
88 // INIT0 : proc_ini
89 // INIT1 : memc_ini
90 // INIT2 : memc_ixr
91
92 // TGT 0 : rom_tgt
93 // TGT 1 : tty_tgt
94 // TGT 2 : xram_tgt
95 // TGT 3 : memc_tgt
96 // TGT 4 : proc_tgt
97
98 soclib::common::Loader loader("soft/bin.soft");
99
100 soclib::caba::VciCcXcacheWrapper<vci_param, proc_iss >
101 proc("proc", 0, maptabp,maptabc,IntTab(0),IntTab(0),4,64,16,4,64,16,CLEANUP_OFFSET);
102
103 soclib::caba::VciSimpleRam<vci_param>
104 rom("rom", IntTab(0), maptabp, loader);
105
106 soclib::caba::VciSimpleRam<vci_param>
107 xram("xram",IntTab(0),maptabx, loader);
108
109 soclib::caba::VciMemCache<vci_param>
110 memc("memc",maptabp,maptabc,maptabx,IntTab(0),IntTab(0),IntTab(2),16,256,16);
111
112 soclib::caba::VciMultiTty<vci_param>
113 tty("tty",IntTab(1),maptabp,"tty",NULL);
114
115 // ring wrapppers
116 // Ring p
117 soclib::caba::VciRingInitiatorWrapper<vci_param> proc_iwrapper("proc_iwrapper", true, 2, 2, maptabp, IntTab(),0);
118 soclib::caba::VciRingTargetWrapper<vci_param> rom_wrapper("rom_wrapper", true, 2, 2, maptabp, IntTab(),0);
119 soclib::caba::VciRingTargetWrapper<vci_param> tty_wrapper("tty_wrapper", false, 2, 2, maptabp, IntTab(),1);
120 soclib::caba::VciRingTargetWrapper<vci_param> memc_twrapper("memc_twrapper", false, 2, 2, maptabp, IntTab(),2);
121
122 // Ring C
123 soclib::caba::VciRingInitiatorWrapper<vci_param> memc_iwrapper("memc_iwrapper", true, 2, 2, maptabc, IntTab(),0);
124 soclib::caba::VciRingTargetWrapper<vci_param> proc_twrapper("proc_twrapper", true, 2, 2, maptabc, IntTab(),0);
125
126 // Ring X
127 soclib::caba::VciRingInitiatorWrapper<vci_param> memc_ixwrapper("memc_ixwrapper", true, 2, 2, maptabx, IntTab(),0);
128 soclib::caba::VciRingTargetWrapper<vci_param> xram_wrapper("xram_wrapper", true, 2, 2, maptabx, IntTab(),0);
129
130 // Ring internal signals
131 soclib::caba::RingSignals signal_p[4];
132 soclib::caba::RingSignals signal_c[2];
133 soclib::caba::RingSignals signal_x[2];
134
135 // Net-List
136
137 proc.p_clk(signal_clk);
138 proc.p_resetn(signal_resetn);
139 proc.p_irq[0](signal_proc_it0);
140 proc.p_irq[1](signal_proc_it1);
141 proc.p_irq[2](signal_proc_it2);
142 proc.p_irq[3](signal_proc_it3);
143 proc.p_irq[4](signal_proc_it4);
144 proc.p_irq[5](signal_proc_it5);
145 proc.p_vci_ini(signal_vci_ini_proc);
146 proc.p_vci_tgt(signal_vci_tgt_proc);
147
148 rom.p_clk(signal_clk);
149 rom.p_resetn(signal_resetn);
150 rom.p_vci(signal_vci_tgt_rom);
151
152 tty.p_clk(signal_clk);
153 tty.p_resetn(signal_resetn);
154 tty.p_vci(signal_vci_tgt_tty);
155 tty.p_irq[0](signal_tty_irq);
156
157 memc.p_clk(signal_clk);
158 memc.p_resetn(signal_resetn);
159 memc.p_vci_tgt(signal_vci_tgt_memc);
160 memc.p_vci_ini(signal_vci_ini_memc);
161 memc.p_vci_ixr(signal_vci_ixr_memc);
162
163 xram.p_clk(signal_clk);
164 xram.p_resetn(signal_resetn);
165 xram.p_vci(signal_vci_tgt_xram);
166
167 // Ring p connection
168 proc_iwrapper.p_clk(signal_clk);
169 proc_iwrapper.p_resetn(signal_resetn);
170 proc_iwrapper.p_ring_in(signal_p[0]);
171 proc_iwrapper.p_ring_out(signal_p[1]);
172 proc_iwrapper.p_vci(signal_vci_ini_proc);
173
174 rom_wrapper.p_clk(signal_clk);
175 rom_wrapper.p_resetn(signal_resetn);
176 rom_wrapper.p_ring_in(signal_p[1]);
177 rom_wrapper.p_ring_out(signal_p[2]);
178 rom_wrapper.p_vci(signal_vci_tgt_rom);
179
180 tty_wrapper.p_clk(signal_clk);
181 tty_wrapper.p_resetn(signal_resetn);
182 tty_wrapper.p_ring_in(signal_p[2]);
183 tty_wrapper.p_ring_out(signal_p[3]);
184 tty_wrapper.p_vci(signal_vci_tgt_tty);
185
186 memc_twrapper.p_clk(signal_clk);
187 memc_twrapper.p_resetn(signal_resetn);
188 memc_twrapper.p_ring_in(signal_p[3]);
189 memc_twrapper.p_ring_out(signal_p[0]);
190 memc_twrapper.p_vci(signal_vci_tgt_memc);
191
192 // Ring c connection
193 memc_iwrapper.p_clk(signal_clk);
194 memc_iwrapper.p_resetn(signal_resetn);
195 memc_iwrapper.p_ring_in(signal_c[0]);
196 memc_iwrapper.p_ring_out(signal_c[1]);
197 memc_iwrapper.p_vci(signal_vci_ini_memc);
198
199 proc_twrapper.p_clk(signal_clk);
200 proc_twrapper.p_resetn(signal_resetn);
201 proc_twrapper.p_ring_in(signal_c[1]);
202 proc_twrapper.p_ring_out(signal_c[0]);
203 proc_twrapper.p_vci(signal_vci_tgt_proc);
204
205 // Ring x connection
206 memc_ixwrapper.p_clk(signal_clk);
207 memc_ixwrapper.p_resetn(signal_resetn);
208 memc_ixwrapper.p_ring_in(signal_x[0]);
209 memc_ixwrapper.p_ring_out(signal_x[1]);
210 memc_ixwrapper.p_vci(signal_vci_ixr_memc);
211
212 xram_wrapper.p_clk(signal_clk);
213 xram_wrapper.p_resetn(signal_resetn);
214 xram_wrapper.p_ring_in(signal_x[1]);
215 xram_wrapper.p_ring_out(signal_x[0]);
216 xram_wrapper.p_vci(signal_vci_tgt_xram);
217
218 int ncycles;
219
220#ifndef SOCVIEW
221 if (argc == 2) {
222 ncycles = std::atoi(argv[1]);
223 } else {
224 std::cerr
225 << std::endl
226 << "The number of simulation cycles must "
227 "be defined in the command line"
228 << std::endl;
229 exit(1);
230 }
231
232 sc_start(sc_core::sc_time(0, SC_NS));
233 signal_resetn = false;
234
235 sc_start(sc_core::sc_time(1, SC_NS));
236 signal_resetn = true;
237
238 for (int i = 0; i < ncycles ; i+=1000) {
239 sc_start(sc_core::sc_time(1000, SC_NS));
240 //proc.print_stats();
241 //memc.print_stats();
242 }
243
244 std::cout << "Hit ENTER to end simulation" << std::endl;
245
246 char buf[1];
247
248 std::cin.getline(buf,1);
249 return EXIT_SUCCESS;
250#else
251 ncycles = 1;
252 sc_start(sc_core::sc_time(0, SC_NS));
253 signal_resetn = false;
254 sc_start(sc_core::sc_time(1, SC_NS));
255 signal_resetn = true;
256
257 debug();
258 return EXIT_SUCCESS;
259#endif
260}
261
262int sc_main (int argc, char *argv[])
263{
264 try {
265 return _main(argc, argv);
266 } catch (std::exception &e) {
267 std::cout << e.what() << std::endl;
268 } catch (...) {
269 std::cout << "Unknown exception occured" << std::endl;
270 throw;
271 }
272 return 1;
273}
Note: See TracBrowser for help on using the repository browser.