Changeset 1016 for branches/reconfiguration/modules/dspin_router/caba
- Timestamp:
- Sep 14, 2015, 9:42:16 AM (9 years ago)
- Location:
- branches/reconfiguration/modules/dspin_router/caba
- Files:
-
- 13 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/reconfiguration/modules/dspin_router/caba/source/include/dspin_router.h
r1010 r1016 29 29 /////////////////////////////////////////////////////////////////////////// 30 30 // Implementation Note : 31 // The xfirst_route(), broadcast_route() and is_broadcast() functions 32 // defined below are used to decode the DSPIN first flit format: 31 // DSPIN first flit format: 33 32 // - In case of a non-broadcast packet : 34 33 // | X | Y |---------------------------------------|BC | … … 36 35 // 37 36 // - In case of a broacast 38 // | XMIN | XMAX | YMIN | YMAX |---------------- ---|BC |39 // | 5 | 5 | 5 | 5 | flit_width - 2 2| 1 |37 // | XMIN | XMAX | YMIN | YMAX |----------------|SP|BC | 38 // | 5 | 5 | 5 | 5 | flit_width - 21| 1| 1 | 40 39 /////////////////////////////////////////////////////////////////////////// 41 40 … … 147 146 void genMoore(); 148 147 149 int xfirst_route( size_t xdest, size_t ydest);148 int route( sc_uint<flit_width> data ); 150 149 int recovery_route( size_t xdest, size_t ydest ); 151 int route( sc_uint<flit_width> data ); 150 int broadcast_route( int iter, int source, sc_uint<flit_width> data ); 151 int reallocation_route(); 152 152 153 int broadcast_route( int iter, int source, sc_uint<flit_width> data );154 153 bool is_broadcast( sc_uint<flit_width> data ); 155 sc_uint<flit_width>compute_broadcast_header( int source );154 internal_flit_t compute_broadcast_header( int source ); 156 155 157 bool is_destination_blackhole( size_t xdest, size_t ydest, int bhpos ); 156 bool is_reconfigurable(); 157 bool is_recovery_routing_enabled(); 158 bool is_reallocation_enabled(); 159 bool is_destination_blackhole( size_t xdest, size_t ydest ); 158 160 int blackhole_position(); 159 160 inline bool is_network_recovery_enable()161 {162 return (((p_recovery_cfg->read() >> 7) & 0x1) != 0);163 }164 165 inline int migration_route()166 {167 return ((p_recovery_cfg->read() >> 4) & 0x7);168 }169 170 inline bool is_reconfigurable()171 {172 return (p_recovery_cfg != NULL);173 }174 161 175 162 public: -
branches/reconfiguration/modules/dspin_router/caba/source/src/dspin_router.cpp
r1006 r1016 26 26 * 27 27 */ 28 29 ///////////////////////////////////////////////////////////////////////////30 // Implementation Note :31 // The xfirst_route(), broadcast_route() and is_broadcast() functions32 // defined below are used to decode the DSPIN first flit format:33 // - In case of a non-broadcast packet :34 // | X | Y |---------------------------------------|BC |35 // | x_width | y_width | flit_width - (x_width + y_width + 2) | 0 |36 //37 // - In case of a broacast38 // | XMIN | XMAX | YMIN | YMAX |----------------|SP|BC |39 // | 5 | 5 | 5 | 5 | flit_width - 21| 1| 1 |40 ///////////////////////////////////////////////////////////////////////////41 42 28 #include "../include/dspin_router.h" 43 29 #include "dspin_router_config.h" 30 31 #include <cassert> 44 32 45 33 namespace soclib { namespace caba { … … 132 120 tmpl(int)::blackhole_position() 133 121 { 134 if ( is_reconfigurable() ) { 135 return p_recovery_cfg->read() & 0xF; 136 } 137 return BH_NONE; 122 assert( is_reconfigurable() ); 123 return p_recovery_cfg->read() & 0xF; 138 124 } 139 125 … … 141 127 tmpl(void)::bind_recovery_port(sc_signal<uint32_t> &s) 142 128 { 143 if ( !is_reconfigurable()) {129 if ( not is_reconfigurable() ) { 144 130 std::cerr << "Error in " << name() 145 131 << ": router configuration not supported." << std::endl … … 150 136 } 151 137 138 tmpl(bool)::is_recovery_routing_enabled() 139 { 140 assert( is_reconfigurable() ); 141 return (((p_recovery_cfg->read() >> 4) & 0x1) != 0); 142 } 143 144 tmpl(bool)::is_reallocation_enabled() 145 { 146 assert( is_reconfigurable() ); 147 return (blackhole_position() != NORMAL); 148 } 149 150 tmpl(int)::reallocation_route() 151 { 152 assert( is_reconfigurable() ); 153 return ((p_recovery_cfg->read() >> 5) & 0x7); 154 } 155 156 tmpl(bool)::is_reconfigurable() 157 { 158 return (p_recovery_cfg != NULL); 159 } 160 152 161 /////////////////////////////////////////////////// 153 tmpl(int)::xfirst_route( size_t xdest, size_t ydest ) 154 { 155 return (xdest < m_local_x ? REQ_WEST : 156 (xdest > m_local_x ? REQ_EAST : 157 (ydest < m_local_y ? REQ_SOUTH : 158 (ydest > m_local_y ? REQ_NORTH : REQ_LOCAL)))); 162 tmpl(bool)::is_destination_blackhole( size_t xdest, size_t ydest ) 163 { 164 assert ( is_reconfigurable() ); 165 166 const int bhpos = blackhole_position(); 167 168 const bool is_n = (bhpos == N_OF_X); 169 const bool is_s = (bhpos == S_OF_X); 170 const bool is_w = (bhpos == W_OF_X); 171 const bool is_e = (bhpos == E_OF_X); 172 const bool is_nw = (bhpos == NW_OF_X); 173 const bool is_ne = (bhpos == NE_OF_X); 174 const bool is_sw = (bhpos == SW_OF_X); 175 const bool is_se = (bhpos == SE_OF_X); 176 177 if ( bhpos == NORMAL ) return false; 178 179 size_t xhole; 180 if (is_nw || is_w || is_sw) xhole = m_local_x + 1; 181 else if (is_ne || is_se || is_e ) xhole = m_local_x - 1; 182 else xhole = m_local_x; 183 184 size_t yhole; 185 if (is_sw || is_s || is_se) yhole = m_local_y + 1; 186 else if (is_nw || is_n || is_ne) yhole = m_local_y - 1; 187 else yhole = m_local_y; 188 189 return ((xdest == xhole) && (ydest == yhole)); 159 190 } 160 191 161 192 /////////////////////////////////////////////////// 162 tmpl(bool)::is_destination_blackhole( size_t xdest, size_t ydest, int bhpos ) 163 { 164 size_t xhole, yhole; 165 switch (bhpos) { 166 case BH_N: 167 xhole = m_local_x; 168 yhole = m_local_y - 1; 169 break; 170 case BH_NW: 171 xhole = m_local_x + 1; 172 yhole = m_local_y - 1; 173 break; 174 case BH_W: 175 xhole = m_local_x + 1; 176 yhole = m_local_y; 177 break; 178 case BH_SW: 179 xhole = m_local_x + 1; 180 yhole = m_local_y + 1; 181 break; 182 case BH_S: 183 xhole = m_local_x; 184 yhole = m_local_y + 1; 185 break; 186 case BH_SE: 187 xhole = m_local_x - 1; 188 yhole = m_local_y + 1; 189 break; 190 case BH_E: 191 xhole = m_local_x - 1; 192 yhole = m_local_y; 193 break; 194 case BH_NE: 195 xhole = m_local_x - 1; 196 yhole = m_local_y - 1; 197 break; 198 default: 199 return false; 200 } 201 202 return ((xdest == xhole) && (ydest == yhole)); 203 } 204 205 /////////////////////////////////////////////////// 206 tmpl(int)::recovery_route( size_t xdest, size_t ydest ) 207 { 208 int bhpos = blackhole_position(); 209 210 if ( xdest > m_local_x ) { 211 if ( (bhpos == BH_NE) || (bhpos == BH_E) || (bhpos == BH_SE) || 212 (bhpos == BH_S) ) { 193 tmpl(int)::recovery_route( size_t dx, size_t dy ) 194 { 195 // use normal routing (X-first) when the recovery routing is disabled 196 int bhpos = NORMAL; 197 bool normal = true; 198 if (is_reconfigurable()) { 199 assert(not is_reallocation_enabled() or 200 not is_destination_blackhole(dx, dy)); 201 202 bhpos = blackhole_position(); 203 204 normal = (bhpos == NORMAL) or 205 (not is_recovery_routing_enabled() and 206 not is_destination_blackhole(dx, dy)); 207 } 208 209 const bool is_n = not normal and (bhpos == N_OF_X); 210 const bool is_s = not normal and (bhpos == S_OF_X); 211 const bool is_w = not normal and (bhpos == W_OF_X); 212 const bool is_e = not normal and (bhpos == E_OF_X); 213 const bool is_nw = not normal and (bhpos == NW_OF_X); 214 const bool is_ne = not normal and (bhpos == NE_OF_X); 215 const bool is_sw = not normal and (bhpos == SW_OF_X); 216 const bool is_se = not normal and (bhpos == SE_OF_X); 217 218 const size_t lx = m_local_x; 219 const size_t ly = m_local_y; 220 221 if ( dx > lx ) { 222 if ( is_ne || is_e || is_se || is_s || normal ) 213 223 return REQ_EAST; 214 } 215 else if ( bhpos == BH_N ) { 216 if ( (m_local_y == 1) || (m_local_x == 0) || (ydest >= m_local_y) || 217 (xdest > (m_local_x + 1)) ) { 224 225 else if ( is_n ) { 226 if ( (ly == 1) || (lx == 0) || (dy >= ly) || (dx > (lx + 1)) ) 218 227 return REQ_EAST; 219 } 220 else { 228 else 221 229 return REQ_WEST; 222 } 223 } 224 else if ( bhpos == BH_NW ) { 225 if ( (m_local_y == 1) || (ydest >= m_local_y) || 226 (xdest > (m_local_x + 2)) ) { 230 } 231 else if ( is_nw ) { 232 if ( (ly == 1) || (dy >= ly) || (dx > (lx + 2)) ) 227 233 return REQ_EAST; 228 } 229 else { 234 else 230 235 return REQ_SOUTH; 231 } 232 } 233 else if ( bhpos == BH_W ) { 234 if ( (m_local_y == 0) || (ydest > m_local_y)) { 236 } 237 else if ( is_w ) { 238 if ( (ly == 0) || (dy > ly)) 235 239 return REQ_NORTH; 236 } 237 else { 240 else 238 241 return REQ_SOUTH; 239 } 240 } 241 else if ( bhpos == BH_SW ) { 242 if ( (ydest <= m_local_y) || (xdest > (m_local_x + 1)) ) { 242 } 243 else if ( is_sw ) { 244 if ( (dy <= ly) || (dx > (lx + 1)) ) 243 245 return REQ_EAST; 244 } 245 else { 246 else 246 247 return REQ_NORTH; 247 }248 248 } 249 249 std::cout << "error: unexpected condition in function " … … 251 251 << std::endl; 252 252 exit(1); 253 } // end if (xdest > m_local_x) 254 else if ( xdest < m_local_x ) { 255 if ( (bhpos == BH_N) || (bhpos == BH_NW) || (bhpos == BH_W) || 256 (bhpos == BH_SW) || (bhpos == BH_S) ) { 253 } // end if (dx > lx) 254 else if ( dx < lx ) { 255 if ( is_n || is_nw || is_w || is_sw || is_s || normal ) 257 256 return REQ_WEST; 258 } 259 else if ( bhpos == BH_NE) {260 if ( ( xdest < (m_local_x - 1)) || (ydest >= m_local_y) ) {257 258 else if ( is_ne ) { 259 if ( (dx < (lx - 1)) || (dy >= ly) ) 261 260 return REQ_WEST; 262 } 263 else { 261 else 264 262 return REQ_SOUTH; 265 } 266 } 267 else if ( bhpos == BH_SE ) { 268 if ( (m_local_x == 1) && (ydest > (m_local_y + 1)) ) { 263 } 264 else if ( is_se ) { 265 if ( (lx == 1) && (dy > (ly + 1)) ) 269 266 return REQ_NORTH; 270 } 271 else { 267 else 272 268 return REQ_WEST; 273 } 274 } 275 else if ( bhpos == BH_E ) { 276 if ( (m_local_y == 0) || 277 ((m_local_x == 1) && (ydest > m_local_y)) ) { 269 } 270 else if ( is_e ) { 271 if ( (ly == 0) || ((lx == 1) && (dy > ly)) ) 278 272 return REQ_NORTH; 279 } 280 else { 273 else 281 274 return REQ_SOUTH; 282 }283 275 } 284 276 std::cout << "error: unexpected condition in function " … … 286 278 << std::endl; 287 279 exit(1); 288 } // end if (xdest < m_local_x) 289 else if ( ydest > m_local_y ) { 290 if ( bhpos != BH_S ) { 291 return REQ_NORTH; 292 } 293 else if ( m_local_x != 0 ) { 294 return REQ_WEST; 295 } 296 else { 297 return REQ_EAST; 298 } 299 } // end if (ydest > m_local_y) 300 else if ( ydest < m_local_y ) { 301 if ( bhpos != BH_N ) { 302 return REQ_SOUTH; 303 } 304 else if ( m_local_x != 0) { 305 return REQ_WEST; 306 } 307 else { 308 return REQ_EAST; 309 } 310 } // end if (ydest < m_local_y) 280 } // end if (dx < lx) 281 else if ( dy > ly ) { 282 if ( ! is_s ) return REQ_NORTH; 283 else if ( lx != 0 ) return REQ_WEST; 284 else return REQ_EAST; 285 } 286 else if ( dy < ly ) { 287 if ( ! is_n ) return REQ_SOUTH; 288 else if ( lx != 0) return REQ_WEST; 289 else return REQ_EAST; 290 } 311 291 return REQ_LOCAL; 312 292 } … … 315 295 tmpl(int)::route( sc_uint<flit_width> data ) 316 296 { 317 size_t xdest= (size_t)(data >> m_x_shift) & m_x_mask;318 size_t ydest= (size_t)(data >> m_y_shift) & m_y_mask;319 if ( blackhole_position() != BH_NONE ) 320 {321 // reroute the request if its destination is the blackhole (this322 // i s to implement the segment recoverymechanism)323 if ( is_ destination_blackhole(xdest, ydest, blackhole_position()))297 const size_t dx = (size_t)(data >> m_x_shift) & m_x_mask; 298 const size_t dy = (size_t)(data >> m_y_shift) & m_y_mask; 299 300 if ( is_reconfigurable() ) { 301 // reroute requests whose destination is the blackhole (this is to 302 // implement the segment reallocation mechanism) 303 if ( is_reallocation_enabled() and is_destination_blackhole(dx, dy)) 324 304 { 325 int dir = migration_route(); 326 327 #if SOCLIB_MODULE_DEBUG 328 std::cout << "<" << name() << "> migration: " 329 << "route request to DIR = " << dir << std::endl; 330 #endif 331 return dir; 332 } 333 334 if (is_network_recovery_enable()) 335 { 336 int dir = recovery_route(xdest, ydest); 337 338 #if SOCLIB_MODULE_DEBUG 339 std::cout << "<" << name() << "> network recovery: " 340 << "route request to DIR = " << dir << std::endl; 341 #endif 342 return dir; 343 } 344 } 345 return xfirst_route(xdest, ydest); 305 return reallocation_route(); 306 } 307 } 308 309 // use the recovery routing 310 return recovery_route(dx, dy); 346 311 } 347 312 … … 349 314 tmpl(int)::broadcast_route(int step, int source, sc_uint<flit_width> data) 350 315 { 351 const size_t lx 352 const size_t ly 316 const size_t lx = m_local_x; 317 const size_t ly = m_local_y; 353 318 const size_t xmin = (data >> (flit_width - 5 )) & 0x1F; 354 319 const size_t xmax = (data >> (flit_width - 10)) & 0x1F; 355 320 const size_t ymin = (data >> (flit_width - 15)) & 0x1F; 356 321 const size_t ymax = (data >> (flit_width - 20)) & 0x1F; 357 const int bh = blackhole_position(); 358 359 int sel = REQ_NOP; 360 bool special = ((data & 0x2) != 0); 361 322 323 int bhpos = NORMAL; 324 bool recovery = false; 325 if (is_reconfigurable()) { 326 bhpos = blackhole_position(); 327 recovery = is_recovery_routing_enabled(); 328 } 329 330 const bool is_n = recovery and (bhpos == N_OF_X); 331 const bool is_s = recovery and (bhpos == S_OF_X); 332 const bool is_w = recovery and (bhpos == W_OF_X); 333 const bool is_e = recovery and (bhpos == E_OF_X); 334 const bool is_nw = recovery and (bhpos == NW_OF_X); 335 const bool is_ne = recovery and (bhpos == NE_OF_X); 336 const bool is_sw = recovery and (bhpos == SW_OF_X); 337 const bool is_se = recovery and (bhpos == SE_OF_X); 338 339 const bool special = ((data & 0x2) != 0) and recovery; 340 341 int sel = REQ_NOP; 362 342 switch(source) { 363 343 case REQ_LOCAL : … … 365 345 else if ( step == 2 ) sel = REQ_SOUTH; 366 346 else if ( step == 3 ) { 367 if ( (bh == BH_N) && (lx != 0) && (ly != 1) ) {347 if ( is_n && (lx != 0) && (ly != 1) ) 368 348 sel = REQ_NOP; 369 break; 370 } 371 sel = REQ_EAST; 349 else 350 sel = REQ_EAST; 372 351 } 373 352 else if ( step == 4 ) { 374 if ( (bh == BH_NE) && (lx != 1) && (ly != 1) ) {353 if ( is_ne && (lx != 1) && (ly != 1) ) 375 354 sel = REQ_NOP; 376 break; 377 } 378 sel = REQ_WEST; 355 else 356 sel = REQ_WEST; 379 357 } 380 358 break; … … 383 361 else if ( step == 2 ) sel = REQ_LOCAL; 384 362 else if ( step == 3 ) { 385 if ( bh == BH_SW ) {363 if ( is_sw ) 386 364 sel = REQ_EAST; 387 break; 388 } 389 sel = REQ_NOP; 365 else 366 sel = REQ_NOP; 390 367 } 391 368 else if ( step == 4 ) { 392 if ( (bh == BH_SE) && (!special || (lx == 1))) {369 if ( is_se && (!special || (lx == 1))) 393 370 sel = REQ_WEST; 394 break; 395 } 396 sel = REQ_NOP; 371 else 372 sel = REQ_NOP; 397 373 } 398 374 break; … … 401 377 else if ( step == 2 ) sel = REQ_LOCAL; 402 378 else if ( step == 3 ) { 403 if ( bh == BH_NW ) {379 if ( is_nw ) 404 380 sel = REQ_EAST; 405 break; 406 } 407 if ( (bh == BH_NE) && ((lx == 1) || (ly == 1)) ) { 381 else if ( is_ne && ((lx == 1) || (ly == 1)) ) 408 382 sel = REQ_WEST; 409 break; 410 } 411 sel = REQ_NOP; 383 else 384 sel = REQ_NOP; 412 385 } 413 386 else if ( step == 4 ) sel = REQ_NOP; … … 415 388 case REQ_EAST : 416 389 if ( step == 1 ) { 417 if ( (bh == BH_NE) && (lx != 1) && (ly != 1) ) {390 if ( is_ne && (lx != 1) && (ly != 1) ) 418 391 sel = REQ_NOP; 419 break; 420 } 421 sel = REQ_WEST; 392 else 393 sel = REQ_WEST; 422 394 } 423 395 else if ( step == 2 ) sel = REQ_NORTH; … … 427 399 case REQ_WEST : 428 400 if ( step == 1 ) { 429 if ( (bh == BH_N) && (ly != 1) ) {401 if ( is_n && (ly != 1) ) 430 402 sel = REQ_NOP; 431 break; 432 } 433 if ( (bh == BH_S) && special ) { 403 else if ( is_s && special ) 434 404 sel = REQ_NOP; 435 break; 436 } 437 sel = REQ_EAST; 405 else 406 sel = REQ_EAST; 438 407 } 439 408 else if ( step == 2 ) sel = REQ_NORTH; … … 443 412 } 444 413 445 if ( (sel == REQ_NORTH) && !(ly < ymax) ) sel = REQ_NOP; 446 else if ( (sel == REQ_SOUTH) && !(ly > ymin) ) sel = REQ_NOP; 447 else if ( (sel == REQ_EAST ) && !(lx < xmax) ) sel = REQ_NOP; 448 else if ( (sel == REQ_WEST ) && !(lx > xmin) ) sel = REQ_NOP; 449 450 #if 0 451 /* This code can be used if we want to inhibit requests to the 452 * blackhole. However, it is not strictly necessary because the 453 * blackhole will consume the request and will do nothing with it */ 454 455 if ( (sel == REQ_NORTH) && (bh == BH_S) ) sel = REQ_NOP; 456 else if ( (sel == REQ_SOUTH) && (bh == BH_N) ) sel = REQ_NOP; 457 else if ( (sel == REQ_EAST ) && (bh == BH_W) ) sel = REQ_NOP; 458 else if ( (sel == REQ_WEST ) && (bh == BH_E) ) sel = REQ_NOP; 459 #endif 414 // inhibit requests to the blackhole or beyond the mesh boundaries. 415 if ( (sel == REQ_NORTH) && (!(ly < ymax) || is_s)) sel = REQ_NOP; 416 else if ( (sel == REQ_SOUTH) && (!(ly > ymin) || is_n)) sel = REQ_NOP; 417 else if ( (sel == REQ_EAST ) && (!(lx < xmax) || is_w)) sel = REQ_NOP; 418 else if ( (sel == REQ_WEST ) && (!(lx > xmin) || is_e)) sel = REQ_NOP; 460 419 461 420 return sel; … … 469 428 470 429 ///////////////////////////////////////////////////////// 471 tmpl(sc_uint<flit_width>)::compute_broadcast_header(int source) 472 { 473 const int bh = blackhole_position(); 474 sc_uint<flit_width> header = r_fifo_in[source].read().data; 475 sc_uint<flit_width> special = 0x2; 430 tmpl(typename DspinRouter<flit_width>::internal_flit_t):: 431 compute_broadcast_header(int source) 432 { 433 const int bhpos = blackhole_position(); 434 435 const int is_nw = (bhpos == NW_OF_X); 436 const int is_ne = (bhpos == NE_OF_X); 437 438 internal_flit_t header; 439 header.eop = false; 440 header.data = r_fifo_in[source].read().data; 441 442 const int SPECIAL = 0x2; 476 443 switch (source) { 477 444 case REQ_NORTH: 478 if ( (bh == BH_NW) || (bh == BH_NE) ) { 479 header |= special; 480 } 445 if ( is_nw || is_ne ) header.data |= SPECIAL; 481 446 break; 482 447 … … 484 449 * network with the special bit set. This can arrive if an initiator 485 450 * or a local interconnect uses the broadcast header reserved bits 486 * internally and don't reset them*/451 * internally */ 487 452 case REQ_LOCAL: 488 header &= ~special;453 header.data &= ~SPECIAL; 489 454 break; 490 455 } … … 521 486 const char* bh_str[] = 522 487 { 523 "BH_NONE", 524 "BH_N", 525 "BH_NE", 526 "BH_E", 527 "BH_SE", 528 "BH_S", 529 "BH_SW", 530 "BH_W", 531 "BH_NW" 488 "N_OF_X", 489 "NE_OF_X", 490 "E_OF_X", 491 "SE_OF_X", 492 "S_OF_X", 493 "SW_OF_X", 494 "W_OF_X", 495 "NW_OF_X" 532 496 }; 533 497 534 498 std::cout << "DSPIN_ROUTER " << name(); 535 std::cout << " / bh = " << bh_str[blackhole_position()]; 499 500 if ( is_reconfigurable() ) { 501 std::cout << " / bh = " << bh_str[blackhole_position()]; 502 if (is_recovery_routing_enabled()) 503 std::cout << " / recovery_routing "; 504 if (is_reallocation_enabled()) 505 std::cout << " / reallocation dir = " 506 << port_name[reallocation_route()]; 507 } 508 536 509 537 510 for( size_t i = 0 ; i < 5 ; i++) // loop on input ports … … 640 613 { 641 614 std::cout << "ERROR in DSPIN_ROUTER " << name() 642 << " : broadcast packet must be 2 flits" << std::endl; 615 << " : broadcast packet must be 2 flits" 616 << std::endl; 643 617 exit(1); 644 618 } 645 619 646 internal_flit_t header; 647 header.eop = false; 648 header.data = compute_broadcast_header(i); 620 const internal_flit_t& header = compute_broadcast_header(i); 649 621 650 622 fifo_in_read[i] = true; … … 652 624 r_buf_in[i] = header; 653 625 r_index_in[i] = req_in[i]; 654 if ( req_in[i] == REQ_NOP ) r_fsm_in[i] = INFSM_REQ_SECOND;655 else r_fsm_in[i] = INFSM_REQ_FIRST;626 if ( req_in[i] == REQ_NOP ) r_fsm_in[i] = INFSM_REQ_SECOND; 627 else r_fsm_in[i] = INFSM_REQ_FIRST; 656 628 } 657 629 else // unicast -
branches/reconfiguration/modules/dspin_router/caba/test/recovery_bcast_evaluation/dspin_broadcast_generator/caba/source/src/dspin_broadcast_generator.cpp
r1009 r1016 1 1 /* -*- c++ -*- 2 2 * SOCLIB_LGPL_HEADER_BEGIN 3 * 3 * 4 4 * This file is part of SoCLib, GNU LGPLv2.1. 5 * 5 * 6 6 * SoCLib is free software; you can redistribute it and/or modify it 7 7 * under the terms of the GNU Lesser General Public License as published 8 8 * by the Free Software Foundation; version 2.1 of the License. 9 * 9 * 10 10 * SoCLib is distributed in the hope that it will be useful, but 11 11 * WITHOUT ANY WARRANTY; without even the implied warranty of 12 12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 13 13 * Lesser General Public License for more details. 14 * 14 * 15 15 * You should have received a copy of the GNU Lesser General Public 16 16 * License along with SoCLib; if not, write to the Free Software 17 17 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 18 18 * 02110-1301 USA 19 * 19 * 20 20 * SOCLIB_LGPL_HEADER_END 21 21 * 22 * Authors : alain.greiner@lip6.fr 22 * Authors : alain.greiner@lip6.fr 23 23 * Date : july 2010 24 24 * Copyright: UPMC - LIP6 … … 44 44 const size_t x_size, 45 45 const size_t y_size, 46 const size_t srcid, // srcid for random 46 const size_t srcid, // srcid for random 47 47 const size_t load, // requested load * 1000 48 48 const size_t fifo_depth) // Fifo depth 49 49 : BaseModule(name), 50 50 51 51 p_clk( "clk" ), 52 52 p_resetn( "resetn" ), … … 58 58 59 59 r_send_fsm( "r_send_fsm" ), 60 r_send_length( "r_send_length" ), 60 r_send_length( "r_send_length" ), 61 61 r_send_dest( "r_send_dest" ), 62 62 r_send_date( "r_send_date" ), … … 69 69 70 70 r_max_fill_status( "r_max_fill_status" ), 71 71 72 72 r_date_fifo( "r_date_fifo", fifo_depth ), 73 73 … … 127 127 128 128 /////////////////////////// CMD FSM 129 switch( r_send_fsm.read() ) 129 switch( r_send_fsm.read() ) 130 130 { 131 131 case SEND_IDLE: … … 141 141 break; 142 142 case SEND_BROADCAST: 143 if( p_out.read.read() ) 143 if( p_out.read.read() ) 144 144 { 145 145 r_send_length = r_send_length.read() - 1; … … 164 164 if (latency > r_receive_bc_max_latency.read()) 165 165 r_receive_bc_max_latency = latency; 166 166 167 167 r_receive_fsm = RECEIVE_IDLE; 168 168 } … … 178 178 if (r_date_fifo.filled_status() > r_max_fill_status.read()) 179 179 r_max_fill_status.write(r_date_fifo.filled_status()); 180 180 181 181 } // end transition 182 182 … … 210 210 p_out.eop = eop; 211 211 p_out.write = write; 212 212 213 213 p_in.read = true; 214 214 … … 221 221 const char* rsp_str[] = { "IDLE", "RECEIVE_BROADCAST" }; 222 222 223 std::cout << "DSPIN_GENERATOR " << name() 224 << " : send_fsm = " << cmd_str[r_send_fsm.read()] 225 << " / recv_fsm = " << rsp_str[r_receive_fsm.read()] 223 std::cout << "DSPIN_GENERATOR " << name() 224 << " : send_fsm = " << cmd_str[r_send_fsm.read()] 225 << " / recv_fsm = " << rsp_str[r_receive_fsm.read()] 226 226 << " / fifo_content = " << r_date_fifo.filled_status() << std::endl; 227 227 } // end print_trace … … 253 253 // indent-tabs-mode: nil 254 254 // End: 255 256 // vim: ts=4 : sts=4 : sw=4 : et -
branches/reconfiguration/modules/dspin_router/caba/test/recovery_bcast_evaluation/soclib.conf
r1009 r1016 1 1 # append compilation flags 2 2 cflags = config.default.toolchain.cflags 3 #cflags.extend(['-ggdb']) 3 # cflags.extend(['-ggdb']) 4 # cflags.extend(['-DUNICAST']) 4 5 config.default.toolchain.set("cflags", cflags) 5 6 6 7 7 # append modules' description file paths -
branches/reconfiguration/modules/dspin_router/caba/test/recovery_bcast_evaluation/synthetic_dspin_network/caba/metadata/synthetic_dspin_network.sd
r1009 r1016 18 18 Uses('caba:dspin_broadcast_generator', 19 19 cmd_width=DSPIN_FLIT_WIDTH, 20 rsp_width=DSPIN_FLIT_WIDTH), 21 Uses('caba:dspin_packet_generator', 22 cmd_width=DSPIN_FLIT_WIDTH, 20 23 rsp_width=DSPIN_FLIT_WIDTH) 21 24 ], -
branches/reconfiguration/modules/dspin_router/caba/test/recovery_bcast_evaluation/synthetic_dspin_network/caba/source/include/synthetic_dspin_network.h
r1009 r1016 2 2 * 3 3 * SOCLIB_LGPL_HEADER_BEGIN 4 * 4 * 5 5 * This file is part of SoCLib, GNU LGPLv2.1. 6 * 6 * 7 7 * SoCLib is free software; you can redistribute it and/or modify it 8 8 * under the terms of the GNU Lesser General Public License as published 9 9 * by the Free Software Foundation; version 2.1 of the License. 10 * 10 * 11 11 * SoCLib is distributed in the hope that it will be useful, but 12 12 * WITHOUT ANY WARRANTY; without even the implied warranty of 13 13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 14 14 * Lesser General Public License for more details. 15 * 15 * 16 16 * You should have received a copy of the GNU Lesser General Public 17 17 * License along with SoCLib; if not, write to the Free Software 18 18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 19 19 * 02110-1301 USA 20 * 20 * 21 21 * SOCLIB_LGPL_HEADER_END 22 22 * 23 * Authors : Cesar Armando Fuguet Tortolero 23 * Authors : Cesar Armando Fuguet Tortolero 24 24 * Date : jul 2015 25 25 * Copyright: UPMC - LIP6 … … 32 32 #include "caba_base_module.h" 33 33 #include "dspin_router.h" 34 35 #if UNICAST 36 #include "dspin_packet_generator.h" 37 #else 34 38 #include "dspin_broadcast_generator.h" 39 #endif 35 40 36 41 namespace soclib { … … 47 52 static const int DSPIN_GENERATOR_FIFO_DEPTH = 50; 48 53 54 #if UNICAST 55 typedef DspinPacketGenerator<DSPIN_WIDTH, DSPIN_WIDTH> 56 DspinNetworkGenerator; 57 #else 49 58 typedef DspinBroadcastGenerator<DSPIN_WIDTH, DSPIN_WIDTH> 50 59 DspinNetworkGenerator; 60 #endif 61 51 62 typedef DspinRouter<DSPIN_WIDTH> 52 63 DspinNetworkRouter; … … 54 65 DspinNetworkSignal; 55 66 56 67 57 68 public: 58 69 … … 71 82 void print_stats(const size_t x, const size_t y); 72 83 73 84 74 85 private: 75 86 76 87 const size_t m_x_size; 77 88 const size_t m_y_size; 78 89 79 90 DspinNetworkGenerator **dspinGenerator; 80 91 DspinNetworkRouter **dspinRouter; … … 83 94 DspinNetworkSignal ***sH; 84 95 DspinNetworkSignal ***sV; 85 96 86 97 sc_core::sc_signal<uint32_t>** sConfigRouter; 87 98 }; // end class SyntheticDspinNetwork -
branches/reconfiguration/modules/dspin_router/caba/test/recovery_bcast_evaluation/synthetic_dspin_network/caba/source/src/synthetic_dspin_network.cpp
r1009 r1016 2 2 * 3 3 * SOCLIB_LGPL_HEADER_BEGIN 4 * 4 * 5 5 * This file is part of SoCLib, GNU LGPLv2.1. 6 * 6 * 7 7 * SoCLib is free software; you can redistribute it and/or modify it 8 8 * under the terms of the GNU Lesser General Public License as published 9 9 * by the Free Software Foundation; version 2.1 of the License. 10 * 10 * 11 11 * SoCLib is distributed in the hope that it will be useful, but 12 12 * WITHOUT ANY WARRANTY; without even the implied warranty of 13 13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 14 14 * Lesser General Public License for more details. 15 * 15 * 16 16 * You should have received a copy of the GNU Lesser General Public 17 17 * License along with SoCLib; if not, write to the Free Software 18 18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 19 19 * 02110-1301 USA 20 * 20 * 21 21 * SOCLIB_LGPL_HEADER_END 22 22 * 23 * Authors : Cesar Armando Fuguet Tortolero 23 * Authors : Cesar Armando Fuguet Tortolero 24 24 * Date : jul 2015 25 25 * Copyright: UPMC - LIP6 … … 34 34 namespace caba { 35 35 using namespace soclib::common; 36 36 37 37 38 38 SyntheticDspinNetwork::SyntheticDspinNetwork(sc_module_name name, … … 58 58 const int SRCID = (x << Y_WIDTH) | y; 59 59 generator_name << "generator[" << x << "][" << y << "]"; 60 #if UNICAST 61 const size_t PACKET_LENGTH = 8; 62 new(&dspinGenerator[x][y]) 63 DspinNetworkGenerator(generator_name.str().c_str(), 64 (size_t)SRCID, 65 PACKET_LENGTH, 66 load, 67 (size_t)DSPIN_GENERATOR_FIFO_DEPTH, 68 0 ); 69 #else 60 70 new(&dspinGenerator[x][y]) 61 71 DspinNetworkGenerator(generator_name.str().c_str(), … … 65 75 load, 66 76 DSPIN_GENERATOR_FIFO_DEPTH); 67 68 } 69 } 70 77 #endif 78 79 } 80 } 81 71 82 // DSPIN router instantiation 72 83 dspinRouter = (DspinNetworkRouter**) … … 74 85 75 86 for (size_t x = 0; x < m_x_size; ++x) { 76 87 dspinRouter[x] = (DspinNetworkRouter*) 77 88 malloc(sizeof(DspinNetworkRouter) * m_y_size); 78 89 … … 102 113 m_x_size, m_y_size); 103 114 104 115 105 116 // netlist 106 117 for (size_t x = 0; x < m_x_size; ++x) { … … 133 144 for (size_t x = 0; x < m_x_size; ++x) { 134 145 for (size_t y = 0; y < m_y_size; ++y) { 146 #if UNICAST 147 dspinGenerator[x][y].~DspinPacketGenerator(); 148 #else 135 149 dspinGenerator[x][y].~DspinBroadcastGenerator(); 150 #endif 136 151 dspinRouter[x][y].~DspinRouter(); 137 152 } … … 151 166 152 167 153 static inline uint32_t configRouter(int bypass_mode,154 int re allocation_dir,168 static inline uint32_t configRouter(int reallocation_dir, 169 int recovery_mode, 155 170 int blackhole_pos) 156 171 { 157 return (bypass_mode << 7) | (reallocation_dir << 4) | blackhole_pos; 172 return ((reallocation_dir & 0x7) << 5) | 173 ((recovery_mode & 0x1) << 4) | 174 (blackhole_pos & 0xF); 158 175 } 159 176 … … 164 181 for (size_t x = 0; x < m_x_size; ++x) { 165 182 for (size_t y = 0; y < m_y_size; ++y) { 166 const uint32_t CONFIG_NONE = configRouter(0, REQ_NOP, BH_NONE);183 const uint32_t CONFIG_NONE = configRouter(0, 0, NORMAL); 167 184 sConfigRouter[x][y].write(CONFIG_NONE); 168 185 } 169 186 } 170 187 171 188 172 189 // initialize mesh's boundary signals … … 184 201 } 185 202 } // end reset() 186 203 187 204 188 205 void SyntheticDspinNetwork::set_faulty_router(const size_t faulty_x, … … 199 216 // reconfigure the faulty router's contour 200 217 if (faulty_y < (m_y_size - 1)) { 201 const uint32_t CONFIG_N = configRouter( 1, REQ_SOUTH, BH_N);218 const uint32_t CONFIG_N = configRouter(REQ_SOUTH, 1, N_OF_X); 202 219 sConfigRouter[faulty_x][faulty_y + 1].write(CONFIG_N); 203 220 204 221 if (faulty_x > 0) { 205 const uint32_t CONFIG_NW = configRouter( 1, REQ_EAST, BH_NW);222 const uint32_t CONFIG_NW = configRouter(REQ_EAST, 1, NW_OF_X); 206 223 sConfigRouter[faulty_x - 1][faulty_y + 1].write(CONFIG_NW); 207 224 } 208 225 if (faulty_x < (m_x_size - 1)) { 209 const uint32_t CONFIG_NE = configRouter( 1, REQ_WEST, BH_NE);226 const uint32_t CONFIG_NE = configRouter(REQ_WEST, 1, NE_OF_X); 210 227 sConfigRouter[faulty_x + 1][faulty_y + 1].write(CONFIG_NE); 211 228 } … … 213 230 214 231 if (faulty_y > 0) { 215 const uint32_t CONFIG_S = configRouter( 1, REQ_NORTH, BH_S);232 const uint32_t CONFIG_S = configRouter(REQ_NORTH, 1, S_OF_X); 216 233 sConfigRouter[faulty_x][faulty_y - 1].write(CONFIG_S); 217 234 218 235 if (faulty_x > 0) { 219 const uint32_t CONFIG_SW = configRouter( 1, REQ_EAST, BH_SW);236 const uint32_t CONFIG_SW = configRouter(REQ_EAST, 1, SW_OF_X); 220 237 sConfigRouter[faulty_x - 1][faulty_y - 1].write(CONFIG_SW); 221 238 } 222 239 if (faulty_x < (m_x_size - 1)) { 223 const uint32_t CONFIG_SE = configRouter( 1, REQ_WEST, BH_SE);240 const uint32_t CONFIG_SE = configRouter(REQ_WEST, 1, SE_OF_X); 224 241 sConfigRouter[faulty_x + 1][faulty_y - 1].write(CONFIG_SE); 225 242 } … … 227 244 228 245 if (faulty_x > 0) { 229 const uint32_t CONFIG_W = configRouter( 1, REQ_EAST, BH_W);246 const uint32_t CONFIG_W = configRouter(REQ_EAST, 1, W_OF_X); 230 247 sConfigRouter[faulty_x - 1][faulty_y].write(CONFIG_W); 231 248 } 232 249 233 250 if (faulty_x < (m_x_size - 1)) { 234 const uint32_t CONFIG_E = configRouter( 1, REQ_WEST, BH_E);251 const uint32_t CONFIG_E = configRouter(REQ_WEST, 1, E_OF_X); 235 252 sConfigRouter[faulty_x + 1][faulty_y].write(CONFIG_E); 236 253 } … … 245 262 dspinGenerator[x][y].print_stats(); 246 263 } 247 264 248 265 249 266 } // end namespace caba … … 256 273 // indent-tabs-mode: nil 257 274 // End: 275 276 // vim: ts=4 : sts=4 : sw=4 : et -
branches/reconfiguration/modules/dspin_router/caba/test/recovery_bcast_evaluation/top.cpp
r1009 r1016 73 73 continue; 74 74 } 75 75 76 76 std::cout << " Arguments are (key, value) couples." << std::endl; 77 77 std::cout << " The order is not important." << std::endl; 78 78 std::cout << " Accepted arguments are :" << std::endl << std::endl; 79 std::cout << " -L dspingenerators' accepted load * 1000" << std::endl;79 std::cout << " -L generators' accepted load * 1000" << std::endl; 80 80 std::cout << " -X number of clusters per row" << std::endl; 81 81 std::cout << " -Y number of clusters per column" << std::endl; 82 82 std::cout << " -N simulation's cycles" << std::endl; 83 83 std::cout << " -F deactivate a router" << std::endl; 84 85 exit(1); 84 86 } 85 87 } // end parse_args() … … 137 139 // deactivate a router in the center of the mesh and create its 138 140 // recovery cycle-free contour 139 syntheticDspinNetwork.set_faulty_router(args.x_size / 2, args.y_size / 2); 141 syntheticDspinNetwork.set_faulty_router(args.x_size / 2, 142 args.y_size / 2); 140 143 } 141 144 … … 154 157 } 155 158 156 159 157 160 return 0; 158 161 } // end sc_main() … … 164 167 // indent-tabs-mode: nil 165 168 // End: 169 170 // vim: ts=4 : sts=4 : sw=4 : et -
branches/reconfiguration/modules/dspin_router/caba/test/simple_segment_recovery_test/Makefile
r934 r1016 70 70 71 71 mkconfig $(SIMULATOR) $(CONF): $(PLATFORM)/scripts/onerun.py 72 ./$< -o $(CONFDIR) -p $(PLATFORM) -x3 -y3 -n1 - c72 ./$< -o $(CONFDIR) -p $(PLATFORM) -x3 -y3 -n1 -f -c 73 73 74 74 $(BUILD_DIR): -
branches/reconfiguration/modules/dspin_router/caba/test/simple_segment_recovery_test/main.c
r947 r1016 25 25 /* configure the routers around the blackhole (1, 1) to define a cycle-free 26 26 * contour */ 27 const int PATH_RECOVERY = 1;27 const int RECOVERY = 1; 28 28 uint32_t val; 29 29 30 30 printf("router(0, 2): configuring as NW\n"); 31 assert(xcu_get_register(0, 2, XICU_CFG_REG, 0) == BH_NONE); 32 val = (PATH_RECOVERY << 7) | (REQ_SOUTH << 4) | BH_NW; 31 val = (REQ_SOUTH << 5) | (RECOVERY << 4) | NW_OF_X; 33 32 xcu_set_register(0, 2, XICU_CFG_REG, 0, val); /* configure NW */ 34 33 35 34 printf("router(0, 1): configuring as W\n"); 36 assert(xcu_get_register(0, 1, XICU_CFG_REG, 0) == BH_NONE); 37 val = (PATH_RECOVERY << 7) | (REQ_LOCAL << 4) | BH_W; 35 val = (REQ_LOCAL << 5) | (RECOVERY << 4) | W_OF_X; 38 36 xcu_set_register(0, 1, XICU_CFG_REG, 0, val); /* configure W */ 39 37 40 38 printf("router(0, 0): configuring as SW\n"); 41 assert(xcu_get_register(0, 0, XICU_CFG_REG, 0) == BH_NONE); 42 val = (PATH_RECOVERY << 7) | (REQ_NORTH << 4) | BH_SW; 39 val = (REQ_NORTH << 5) | (RECOVERY << 4) | SW_OF_X; 43 40 xcu_set_register(0, 0, XICU_CFG_REG, 0, val); /* configure SW */ 44 41 45 42 printf("router(1, 2): configuring as N\n"); 46 assert(xcu_get_register(1, 2, XICU_CFG_REG, 0) == BH_NONE); 47 val = (PATH_RECOVERY << 7) | (REQ_WEST << 4) | BH_N; 43 val = (REQ_WEST << 5) | (RECOVERY << 4) | N_OF_X; 48 44 xcu_set_register(1, 2, XICU_CFG_REG, 0, val); /* configure N */ 49 45 50 46 printf("router(2, 2): configuring as NE\n"); 51 assert(xcu_get_register(2, 2, XICU_CFG_REG, 0) == BH_NONE); 52 val = (PATH_RECOVERY << 7) | (REQ_WEST << 4) | BH_NE; 47 val = (REQ_WEST << 5) | (RECOVERY << 4) | NE_OF_X; 53 48 xcu_set_register(2, 2, XICU_CFG_REG, 0, val); /* configure NE */ 54 49 55 50 printf("router(2, 1): configuring as E\n"); 56 assert(xcu_get_register(2, 1, XICU_CFG_REG, 0) == BH_NONE); 57 val = (PATH_RECOVERY << 7) | (REQ_SOUTH << 4) | BH_E; 51 val = (REQ_SOUTH << 5) | (RECOVERY << 4) | E_OF_X; 58 52 xcu_set_register(2, 1, XICU_CFG_REG, 0, val); /* configure E */ 59 53 60 54 printf("router(2, 0): configuring as SE\n"); 61 assert(xcu_get_register(2, 0, XICU_CFG_REG, 0) == BH_NONE); 62 val = (PATH_RECOVERY << 7) | (REQ_WEST << 4) | BH_SE; 55 val = (REQ_WEST << 5) | (RECOVERY << 4) | SE_OF_X; 63 56 xcu_set_register(2, 0, XICU_CFG_REG, 0, val); /* configure SE */ 64 57 65 58 printf("router(1, 0): configuring as S\n"); 66 assert(xcu_get_register(1, 0, XICU_CFG_REG, 0) == BH_NONE); 67 val = (PATH_RECOVERY << 7) | (REQ_WEST << 4) | BH_S; 59 val = (REQ_WEST << 5) | (RECOVERY << 4) | S_OF_X; 68 60 xcu_set_register(1, 0, XICU_CFG_REG, 0, val); /* configure S */ 69 61 70 assert((xcu_get_register(0, 2, XICU_CFG_REG, 0) & 0xF) == BH_NW);71 assert((xcu_get_register(0, 1, XICU_CFG_REG, 0) & 0xF) == BH_W);72 assert((xcu_get_register(0, 0, XICU_CFG_REG, 0) & 0xF) == BH_SW);73 assert((xcu_get_register(1, 2, XICU_CFG_REG, 0) & 0xF) == BH_N);74 assert((xcu_get_register(2, 2, XICU_CFG_REG, 0) & 0xF) == BH_NE);75 assert((xcu_get_register(2, 1, XICU_CFG_REG, 0) & 0xF) == BH_E);76 assert((xcu_get_register(2, 0, XICU_CFG_REG, 0) & 0xF) == BH_SE);77 assert((xcu_get_register(1, 0, XICU_CFG_REG, 0) & 0xF) == BH_S);62 assert((xcu_get_register(0, 2, XICU_CFG_REG, 0) & 0xF) == NW_OF_X); 63 assert((xcu_get_register(0, 1, XICU_CFG_REG, 0) & 0xF) == W_OF_X); 64 assert((xcu_get_register(0, 0, XICU_CFG_REG, 0) & 0xF) == SW_OF_X); 65 assert((xcu_get_register(1, 2, XICU_CFG_REG, 0) & 0xF) == N_OF_X); 66 assert((xcu_get_register(2, 2, XICU_CFG_REG, 0) & 0xF) == NE_OF_X); 67 assert((xcu_get_register(2, 1, XICU_CFG_REG, 0) & 0xF) == E_OF_X); 68 assert((xcu_get_register(2, 0, XICU_CFG_REG, 0) & 0xF) == SE_OF_X); 69 assert((xcu_get_register(1, 0, XICU_CFG_REG, 0) & 0xF) == S_OF_X); 78 70 79 71 /* Test the recovered segment that has been migrated to the EAST cluster */ -
branches/reconfiguration/modules/dspin_router/caba/test/simple_segment_recovery_test/reset.S
r934 r1016 21 21 #define Y_MASK ((1<<Y_WIDTH)-1) 22 22 23 #define XCU_REG(func, idx) ((((func)<<5)|(idx)) << 2) 24 #define XCU_CFG_REG 17 25 #define XCU_BARRIER 5 26 27 #define MEMC_REG(func,idx) (((func<<7)|idx) << 2) 28 #define MEMC_CONFIG 0 29 #define MEMC_SCRATCHPAD 4 30 23 31 reset: 24 32 .set noreorder … … 33 41 34 42 /* 35 * All processors compute: 36 * cid = (x * Y_SIZE) + y 37 * pid = (cid * NB_PROCS_MAX) + lpid 43 * Get processor ID 38 44 */ 39 45 mfc0 k0, CP0_PROCID 40 andi k0, k0, 0xFFF /* k0 <= proc_xyl */46 andi k0, k0, 0xFFF /* k0 <= proc_xyl */ 41 47 42 /* Only the processor 0 continues the execution */ 48 /* 49 * Release local gateway hardware barrier 50 */ 51 la k1, SEG_XCU_BASE /* k1 <= ICU base address */ 52 li t0, XCU_REG(XCU_CFG_REG, XCU_BARRIER) 53 or k1, k1, t0 /* k1 <= &XICU[CFG_REG][BARRIER] */ 54 li t0, 0xFFFFFFFF 55 sw t0, 0(k1) 56 57 /* 58 * Disable the scratchpad mode on the local memory cache 59 */ 60 la k1, SEG_MMC_BASE /* k1 <= MMC base address */ 61 li t0, MEMC_REG(MEMC_CONFIG, MEMC_SCRATCHPAD) 62 or k1, k1, t0 /* k1 <= &MEMC[CONFIG][SCRATCHPAD] */ 63 sw zero, 0(k1) 64 65 /* Only the processor 0 continues the execution */ 43 66 beqz k0, 1f 44 67 nop … … 47 70 1: /* processor 0 initializes stack pointer (16K) */ 48 71 la sp, _stack 49 addiu sp, sp, (1<<14) /* sp <= _stack + 16K */72 addiu sp, sp, (1<<14) /* sp <= _stack + 16K */ 50 73 51 74 /* jumps to main in kernel mode */ -
branches/reconfiguration/modules/dspin_router/caba/test/simple_segment_recovery_test/test.sh
r942 r1016 13 13 PLATFORM=../../../../../platforms/tsar_generic_iob 14 14 SIMULATOR=$PLATFORM/simul.x 15 $SIMULATOR -DSOFT $SOFT -DISK /dev/null -FAULTY_ROUTER 0 1 1 > output/log 2>&1 15 $SIMULATOR -DSOFT $SOFT \ 16 -DISK /dev/null \ 17 -FAULTY_ROUTER 0 1 1 \ 18 -NCYCLES 20000 > output/log 2>&1 19 # -PROCID 0 \ 20 # -MEMCID 0x1 \ 21 # -DEBUG 3000 \ 22 16 23 soclib-cleanup-terms &> /dev/null 17 24 mv term0 output/term 18 25 grep -q "success" output/term 19 26 if [ $? == 0 ]; 20 21 27 then echo $(basename $PWD) ": Success"; 28 else echo $(basename $PWD) ": Failure"; 22 29 fi; -
branches/reconfiguration/modules/dspin_router/caba/test/synthetic_test/top.cpp
r998 r1016 44 44 } 45 45 46 static inline uint32_t configRouter(int bypass_mode,47 int re allocation_dir,46 static inline uint32_t configRouter(int reallocation_dir, 47 int recovery_mode, 48 48 int blackhole_pos) 49 49 { 50 return (bypass_mode << 7) | (reallocation_dir << 4) | blackhole_pos; 50 return ((reallocation_dir & 0x7) << 5) | 51 ((recovery_mode & 0x1) << 4) | 52 (blackhole_pos & 0xF); 51 53 } 52 54 … … 295 297 296 298 /* initialize the configuration signals */ 297 sConfigNONE.write(configRouter(0, REQ_NOP, BH_NONE)); 298 sConfigN.write(configRouter(1, REQ_SOUTH, BH_N)); 299 sConfigNE.write(configRouter(1, REQ_WEST, BH_NE)); 300 sConfigE.write(configRouter(1, REQ_WEST, BH_E)); 301 sConfigSE.write(configRouter(1, REQ_WEST, BH_SE)); 302 sConfigS.write(configRouter(1, REQ_NORTH, BH_S)); 303 sConfigSW.write(configRouter(1, REQ_EAST, BH_SW)); 304 sConfigW.write(configRouter(1, REQ_EAST, BH_W)); 305 sConfigNW.write(configRouter(1, REQ_EAST, BH_NW)); 299 sConfigNONE.write(configRouter(0, 0, NORMAL)); 300 301 // requests to the deactivated segment are dropped 302 sConfigN.write(configRouter(REQ_SOUTH, 1, N_OF_X)); 303 sConfigNE.write(configRouter(REQ_WEST, 1, NE_OF_X)); 304 sConfigE.write(configRouter(REQ_WEST, 1, E_OF_X)); 305 sConfigSE.write(configRouter(REQ_WEST, 1, SE_OF_X)); 306 sConfigS.write(configRouter(REQ_NORTH, 1, S_OF_X)); 307 sConfigSW.write(configRouter(REQ_EAST, 1, SW_OF_X)); 308 sConfigW.write(configRouter(REQ_EAST, 1, W_OF_X)); 309 sConfigNW.write(configRouter(REQ_EAST, 1, NW_OF_X)); 306 310 307 311 /* initialize mesh boundary signals */
Note: See TracChangeset
for help on using the changeset viewer.