proc_ctrl_elab.cpp revision 12855:588919e0e4aa
1/***************************************************************************** 2 3 Licensed to Accellera Systems Initiative Inc. (Accellera) under one or 4 more contributor license agreements. See the NOTICE file distributed 5 with this work for additional information regarding copyright ownership. 6 Accellera licenses this file to you under the Apache License, Version 2.0 7 (the "License"); you may not use this file except in compliance with the 8 License. You may obtain a copy of the License at 9 10 http://www.apache.org/licenses/LICENSE-2.0 11 12 Unless required by applicable law or agreed to in writing, software 13 distributed under the License is distributed on an "AS IS" BASIS, 14 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 15 implied. See the License for the specific language governing 16 permissions and limitations under the License. 17 18 *****************************************************************************/ 19 20// proc_ctrl_elab.cpp -- test for 21// 22// Original Author: John Aynsley, Doulos, Inc. 23// 24// MODIFICATION LOG - modifiers, enter your name, affiliation, date and 25// 26// $Log: proc_ctrl_elab.cpp,v $ 27// Revision 1.2 2011/05/08 19:18:46 acg 28// Andy Goodrich: remove extraneous + prefixes from git diff. 29// 30 31// Calling process control methods during elaboration 32 33#define SC_INCLUDE_DYNAMIC_PROCESSES 34 35#include "systemc.h" 36 37SC_MODULE(Top) 38{ 39 SC_CTOR(Top) 40 : caught_throw_it(0) 41 , caught_reset(0) 42 , caught_kill(0) 43 44 , target_suspend_1_called(false) 45 , target_suspend_2_called(false) 46 , target_suspend_3_called(false) 47 , target_suspend_4_called(false) 48 , target_suspend_5_called(false) 49 50 , target_disable_1_called(false) 51 , target_disable_2_called(false) 52 , target_disable_2_called_again(false) 53 , target_disable_3_called(false) 54 , target_disable_4_called(false) 55 , target_disable_5_called(false) 56 57 , target_sync_reset_1_called(false) 58 , target_sync_reset_2_called(false) 59 , target_sync_reset_3_called(false) 60 , target_sync_reset_4_called(false) 61 62 , reset_1_count(0) 63 , reset_2_count(0) 64 , reset_3_count(0) 65 , reset_4_count(0) 66 { 67 SC_THREAD(ctrl); 68 69 SC_THREAD(target_suspend_1); 70 sensitive << ev; 71 ts1 = sc_get_current_process_handle(); 72 73 SC_THREAD(target_suspend_2); 74 dont_initialize(); 75 sensitive << ev; 76 ts2 = sc_get_current_process_handle(); 77 78 SC_THREAD(target_suspend_3); 79 dont_initialize(); 80 sensitive << ev; 81 ts3 = sc_get_current_process_handle(); 82 83 SC_THREAD(target_suspend_4); 84 dont_initialize(); 85 sensitive << ev; 86 ts4 = sc_get_current_process_handle(); 87 ts4.suspend(); 88 89 SC_THREAD(target_suspend_5); 90 dont_initialize(); 91 sensitive << ev; 92 ts5 = sc_get_current_process_handle(); 93 ts5.suspend(); 94 ts5.resume(); 95 96 SC_THREAD(target_disable_1); 97 sensitive << dummy_ev; 98 td1 = sc_get_current_process_handle(); 99 100 SC_THREAD(target_disable_2); 101 sensitive << ev; 102 td2 = sc_get_current_process_handle(); 103 104 SC_THREAD(target_disable_3); 105 td3 = sc_get_current_process_handle(); 106 107 SC_THREAD(target_disable_4); 108 dont_initialize(); 109 sensitive << ev; 110 td4 = sc_get_current_process_handle(); 111 td4.disable(); 112 113 SC_THREAD(target_disable_5); 114 dont_initialize(); 115 sensitive << ev; 116 td5 = sc_get_current_process_handle(); 117 td5.disable(); 118 td5.enable(); 119 td5.sync_reset_on(); 120 td5.sync_reset_off(); 121 122 SC_THREAD(target_sync_reset_1); 123 sensitive << ev; 124 tr1 = sc_get_current_process_handle(); 125 126 SC_THREAD(target_sync_reset_2); 127 sensitive << ev; 128 tr2 = sc_get_current_process_handle(); 129 130 SC_THREAD(target_sync_reset_3); 131 dont_initialize(); 132 sensitive << ev; 133 tr3 = sc_get_current_process_handle(); 134 135 SC_THREAD(target_sync_reset_4); 136 dont_initialize(); 137 sensitive << ev; 138 tr4 = sc_get_current_process_handle(); 139 tr4.sync_reset_on(); 140 141 try { 142 ts2.throw_it(ex); 143 sc_assert( false ); 144 } 145 catch (std::exception e) { 146 ++caught_throw_it; 147 } 148 149 try { 150 ts2.reset(); 151 sc_assert( false ); 152 } 153 catch (std::exception e) { 154 ++caught_reset; 155 } 156 157 try { 158 ts2.kill(); 159 sc_assert( false ); 160 } 161 catch (std::exception e) { 162 ++caught_kill; 163 } 164 } 165 166 void before_end_of_elaboration() 167 { 168 ts1.suspend(); 169 ts2.suspend(); 170 ts3.suspend(); 171 172 td1.disable(); 173 td2.disable(); 174 td3.disable(); 175 176 tr1.sync_reset_on(); 177 tr2.sync_reset_on(); 178 tr3.sync_reset_on(); 179 180 try { 181 ts2.throw_it(ex); 182 sc_assert( false ); 183 } 184 catch (std::exception e) { 185 ++caught_throw_it; 186 } 187 188 try { 189 ts2.reset(); 190 sc_assert( false ); 191 } 192 catch (std::exception e) { 193 ++caught_reset; 194 } 195 196 try { 197 ts2.kill(); 198 sc_assert( false ); 199 } 200 catch (std::exception e) { 201 ++caught_kill; 202 } 203 } 204 205 void start_of_simulation() 206 { 207 td3.enable(); 208 tr3.sync_reset_off(); 209 210 try { 211 ts2.throw_it(ex); 212 sc_assert( false ); 213 } 214 catch (std::exception e) { 215 ++caught_throw_it; 216 } 217 218 try { 219 ts2.reset(); 220 sc_assert( false ); 221 } 222 catch (std::exception e) { 223 ++caught_reset; 224 } 225 226 try { 227 ts2.kill(); 228 sc_assert( false ); 229 } 230 catch (std::exception e) { 231 ++caught_kill; 232 } 233 } 234 235 sc_event ev, dummy_ev; 236 237 std::exception ex; 238 239 sc_process_handle ts1; 240 sc_process_handle ts2; 241 sc_process_handle ts3; 242 sc_process_handle ts4; 243 sc_process_handle ts5; 244 245 sc_process_handle td1; 246 sc_process_handle td2; 247 sc_process_handle td3; 248 sc_process_handle td4; 249 sc_process_handle td5; 250 251 sc_process_handle tr1; 252 sc_process_handle tr2; 253 sc_process_handle tr3; 254 sc_process_handle tr4; 255 256 int caught_throw_it; 257 int caught_reset; 258 int caught_kill; 259 260 bool target_suspend_1_called; 261 bool target_suspend_2_called; 262 bool target_suspend_3_called; 263 bool target_suspend_4_called; 264 bool target_suspend_5_called; 265 266 bool target_disable_1_called; 267 bool target_disable_2_called; 268 bool target_disable_2_called_again; 269 bool target_disable_3_called; 270 bool target_disable_4_called; 271 bool target_disable_5_called; 272 273 bool target_sync_reset_1_called; 274 bool target_sync_reset_2_called; 275 bool target_sync_reset_3_called; 276 bool target_sync_reset_4_called; 277 278 int reset_1_count; 279 int reset_2_count; 280 int reset_3_count; 281 int reset_4_count; 282 283 void ctrl() 284 { 285 ts3.resume(); 286 287 wait(10, SC_NS); 288 ts1.resume(); 289 ev.notify(); 290 291 wait(10, SC_NS); 292 ts2.resume(); 293 tr2.sync_reset_off(); 294 tr4.sync_reset_off(); 295 296 wait(10, SC_NS); 297 td2.enable(); 298 299 wait(10, SC_NS); 300 ev.notify(); 301 302 wait(10, SC_NS); 303 ev.notify(); 304 td2.disable(); 305 306 wait(10, SC_NS); 307 td4.enable(); 308 ts4.resume(); 309 ev.notify(); 310 } 311 312 void target_suspend_1() 313 { 314 sc_assert( sc_time_stamp() == sc_time(10, SC_NS) ); 315 target_suspend_1_called = true; 316 } 317 318 void target_suspend_2() 319 { 320 sc_assert( sc_time_stamp() == sc_time(20, SC_NS) ); 321 target_suspend_2_called = true; 322 } 323 324 void target_suspend_3() 325 { 326 sc_assert( sc_time_stamp() == sc_time(10, SC_NS) ); 327 target_suspend_3_called = true; 328 } 329 330 void target_suspend_4() 331 { 332 sc_assert( sc_time_stamp() == sc_time(60, SC_NS) ); 333 target_suspend_4_called = true; 334 } 335 336 void target_suspend_5() 337 { 338 sc_assert( sc_time_stamp() == sc_time(10, SC_NS) ); 339 target_suspend_5_called = true; 340 ts5.suspend(); 341 } 342 343 void target_disable_1() 344 { 345 sc_assert( false ); 346 target_disable_1_called = true; 347 } 348 349 void target_disable_2() 350 { 351 sc_assert( sc_time_stamp() == sc_time(40, SC_NS) ); 352 target_disable_2_called = true; 353 wait(); // on ev 354 355 sc_assert( sc_time_stamp() == sc_time(50, SC_NS) ); 356 target_disable_2_called_again = true; 357 } 358 359 void target_disable_3() 360 { 361 sc_assert( sc_time_stamp() == sc_time(0, SC_NS) ); 362 sc_assert( sc_delta_count() == 0 ); 363 target_disable_3_called = true; 364 } 365 366 void target_disable_4() 367 { 368 sc_assert( sc_time_stamp() == sc_time(60, SC_NS) ); 369 target_disable_4_called = true; 370 } 371 372 void target_disable_5() 373 { 374 sc_assert( sc_time_stamp() == sc_time(10, SC_NS) ); 375 target_disable_5_called = true; 376 td5.disable(); 377 } 378 379 void target_sync_reset_1() 380 { 381 switch (reset_1_count) 382 { 383 case 0: sc_assert( sc_time_stamp() == sc_time(0, SC_NS) ); 384 sc_assert( sc_delta_count() == 0 ); 385 break; 386 case 1: sc_assert( sc_time_stamp() == sc_time(10, SC_NS) ); 387 break; 388 case 2: sc_assert( sc_time_stamp() == sc_time(40, SC_NS) ); 389 break; 390 case 3: sc_assert( sc_time_stamp() == sc_time(50, SC_NS) ); 391 target_sync_reset_1_called = true; 392 break; 393 } 394 ++reset_1_count; 395 396 while (true) 397 { 398 wait(); 399 sc_assert( false ); 400 } 401 } 402 403 void target_sync_reset_2() 404 { 405 switch (reset_2_count) 406 { 407 case 0: sc_assert( sc_time_stamp() == sc_time(0, SC_NS) ); 408 sc_assert( sc_delta_count() == 0 ); 409 break; 410 case 1: sc_assert( sc_time_stamp() == sc_time(10, SC_NS) ); 411 break; 412 case 2: sc_assert( false ); 413 break; 414 case 3: sc_assert( false ); 415 break; 416 } 417 ++reset_2_count; 418 419 while (true) 420 { 421 wait(); 422 423 switch (reset_2_count) 424 { 425 case 0: sc_assert( false ); 426 break; 427 case 1: sc_assert( false ); 428 break; 429 case 2: sc_assert( sc_time_stamp() == sc_time(40, SC_NS) ); 430 break; 431 case 3: sc_assert( sc_time_stamp() == sc_time(50, SC_NS) ); 432 target_sync_reset_2_called = true; 433 break; 434 } 435 ++reset_2_count; 436 437 } 438 } 439 440 void target_sync_reset_3() 441 { 442 switch (reset_3_count) 443 { 444 case 0: sc_assert( sc_time_stamp() == sc_time(10, SC_NS) ); 445 break; 446 case 1: sc_assert( false ); 447 break; 448 case 2: sc_assert( false ); 449 break; 450 } 451 ++reset_3_count; 452 453 while (true) 454 { 455 wait(); 456 457 switch (reset_3_count) 458 { 459 case 0: sc_assert( false ); 460 break; 461 case 1: sc_assert( sc_time_stamp() == sc_time(40, SC_NS) ); 462 break; 463 case 2: sc_assert( sc_time_stamp() == sc_time(50, SC_NS) ); 464 target_sync_reset_3_called = true; 465 break; 466 } 467 ++reset_3_count; 468 469 } 470 } 471 472 void target_sync_reset_4() 473 { 474 switch (reset_4_count) 475 { 476 case 0: sc_assert( sc_time_stamp() == sc_time(10, SC_NS) ); 477 break; 478 case 1: sc_assert( false ); 479 break; 480 case 2: sc_assert( false ); 481 break; 482 } 483 ++reset_4_count; 484 485 while (true) 486 { 487 wait(); 488 489 switch (reset_4_count) 490 { 491 case 0: sc_assert( false ); 492 break; 493 case 1: sc_assert( sc_time_stamp() == sc_time(40, SC_NS) ); 494 break; 495 case 2: sc_assert( sc_time_stamp() == sc_time(50, SC_NS) ); 496 target_sync_reset_4_called = true; 497 break; 498 } 499 ++reset_4_count; 500 501 } 502 } 503}; 504 505int sc_main(int argc, char* argv[]) 506{ 507 Top top("top"); 508 sc_start(); 509 510 sc_assert( top.caught_throw_it == 3 ); 511 sc_assert( top.caught_reset == 3 ); 512 sc_assert( top.caught_kill == 3 ); 513 514 sc_assert( top.target_suspend_1_called ); 515 sc_assert( top.target_suspend_2_called ); 516 sc_assert( top.target_suspend_3_called ); 517 sc_assert( top.target_suspend_4_called ); 518 sc_assert( top.target_suspend_5_called ); 519 520 sc_assert( !top.target_disable_1_called ); 521 sc_assert( top.target_disable_2_called ); 522 sc_assert( top.target_disable_2_called_again ); 523 sc_assert( top.target_disable_3_called ); 524 sc_assert( top.target_disable_4_called ); 525 sc_assert( top.target_disable_5_called ); 526 527 sc_assert( top.target_sync_reset_1_called ); 528 sc_assert( top.target_sync_reset_2_called ); 529 sc_assert( top.target_sync_reset_3_called ); 530 sc_assert( top.target_sync_reset_4_called ); 531 532 cout << endl << "Success" << endl; 533 return 0; 534} 535