async_reset.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// async_reset.cpp
21//
22//  Original Author: John Aynsley, Doulos, Inc.
23//
24// MODIFICATION LOG - modifiers, enter your name, affiliation, date and
25//
26// $Log: async_reset.cpp,v $
27// Revision 1.3  2011/05/08 19:18:45  acg
28//  Andy Goodrich: remove extraneous + prefixes from git diff.
29//
30
31// async_reset_signal_is
32
33#define SC_INCLUDE_DYNAMIC_PROCESSES
34
35#include <systemc>
36using namespace sc_core;
37using std::cout;
38using std::endl;
39
40struct Top: sc_module
41{
42  Top(sc_module_name _name)
43  : count(0)
44  {
45    clk_port.bind(clk);
46
47    SC_THREAD(ctrl);
48
49    SC_CTHREAD(CT, clk_port.value_changed());
50      async_reset_signal_is(areset, true);
51      ct = sc_get_current_process_handle();
52
53    sc_spawn_options opt;
54    opt.async_reset_signal_is(areset, true);
55    t = sc_spawn(sc_bind(&Top::T, this), "T", &opt);
56
57    opt.spawn_method();
58    opt.dont_initialize();
59    opt.set_sensitivity( &clk );
60    m = sc_spawn(sc_bind(&Top::M, this), "M", &opt);
61
62    SC_CTHREAD(CT2, clk_port.pos())
63      async_reset_signal_is(areset1, true);
64      async_reset_signal_is(areset2, true);
65      async_reset_signal_is(areset3, true);
66      reset_signal_is(sreset1, true);
67      reset_signal_is(sreset2, true);
68      reset_signal_is(sreset3, true);
69      ct2 = sc_get_current_process_handle();
70      ct2.disable();
71
72    SC_THREAD(T2)
73      sensitive << clk_port.pos();
74      async_reset_signal_is(areset1, true);
75      async_reset_signal_is(areset2, true);
76      async_reset_signal_is(areset3, true);
77      reset_signal_is(sreset1, true);
78      reset_signal_is(sreset2, true);
79      reset_signal_is(sreset3, true);
80      t2 = sc_get_current_process_handle();
81      t2.disable();
82
83    clk.write(false);
84    areset.write(false);
85
86    f1 = f2 = f3 = f4 = f5 = f6 = f7 = f8 = f9 = 0;
87    f10 = f11 = f12 = f13 = f14 = f15 = f16 = f17 = f18 = f19 = 0;
88    f20 = f21 = f22 = f23 = f24 = f25 = f26 = f27 = f28 = f29 = 0;
89    f30 = f31 = f32 = f33 = f34 = f35 = f36 = f37 = f38 = f39 = 0;
90    f40 = f41 = f42 = f43 = f44 = f45 = f46 = f47 = f48 = f49 = 0;
91    f50 = f51 = f52 = f53 = f54 = f55 = f56 = f57 = f58 = f59 = 0;
92    f60 = f61 = f62 = f63 = f64 = f65 = f66 = f67 = f68 = f69 = 0;
93    f70 = f71 = f72 = f73 = f74 = f75 = f76 = f77 = f78 = f79 = 0;
94    f80 = f81 = f82 = f83 = f84 = f85 = f86 = f87 = f88 = f89 = 0;
95  }
96
97  sc_signal<bool> clk;
98  sc_in<bool> clk_port;
99  sc_signal<bool> areset;
100  sc_signal<bool> areset1, areset2, areset3, sreset1, sreset2, sreset3;
101
102  sc_process_handle ct, t, m, ct2, t2;
103  int count;
104
105  int f1, f2, f3, f4, f5, f6, f7, f8, f9;
106  int f10, f11, f12, f13, f14, f15, f16, f17, f18, f19;
107  int f20, f21, f22, f23, f24, f25, f26, f27, f28, f29;
108  int f30, f31, f32, f33, f34, f35, f36, f37, f38, f39;
109  int f40, f41, f42, f43, f44, f45, f46, f47, f48, f49;
110  int f50, f51, f52, f53, f54, f55, f56, f57, f58, f59;
111  int f60, f61, f62, f63, f64, f65, f66, f67, f68, f69;
112  int f70, f71, f72, f73, f74, f75, f76, f77, f78, f79;
113  int f80, f81, f82, f83, f84, f85, f86, f87, f88, f89;
114
115  void ctrl()
116  {
117    sc_assert( sc_delta_count() == 0 );
118    clock();
119    wait(SC_ZERO_TIME);
120    wait(SC_ZERO_TIME);
121
122    count = 1;
123    clock();
124    wait(1, SC_NS);
125
126    count = 2;
127    clock();
128    wait(10, SC_NS);
129
130    count = 3;
131    clock();
132    wait(sc_time(20, SC_NS) - sc_time_stamp());
133
134    count = 4;
135    areset.write(true);
136    wait(1, SC_NS);
137
138    count = 5;
139    areset.write(false);
140    wait(1, SC_NS);
141
142    count = 6;
143    clock();
144    wait(sc_time(30, SC_NS) - sc_time_stamp());
145
146    count = 7;
147    areset.write(true);
148    wait(1, SC_NS);
149
150    count = 8;
151    clock();      // Clocked while asynch reset is active
152    wait(1, SC_NS);
153
154    count = 9;
155    clock();
156    wait(1, SC_NS);
157
158    count = 10;
159    areset.write(false);
160    wait(1, SC_NS);
161
162    count = 11;
163    areset.write(true);
164    wait(1, SC_NS);
165
166    count = 12;
167    areset.write(false);
168    wait(sc_time(40, SC_NS) - sc_time_stamp());
169
170    count = 13;
171    sync_reset_on();
172    wait(1, SC_NS);
173
174    count = 14;
175    clock();
176    wait(1, SC_NS);
177
178    count = 15;
179    sync_reset_off();
180    wait(sc_time(50, SC_NS) - sc_time_stamp());
181
182    count = 16;
183    disable();
184    wait(1, SC_NS);
185
186    count = 17;
187    clock();
188    wait(1, SC_NS);
189
190    count = 18;
191    sync_reset_on();
192    clock();
193    wait(1, SC_NS);
194
195    count = 19;
196    enable();
197    clock();
198    wait(1, SC_NS);
199
200    count = 20;
201    sync_reset_off();
202    clock();
203    wait(sc_time(60, SC_NS) - sc_time_stamp());
204
205    count = 21;
206    disable();
207    wait(1, SC_NS);
208
209    count = 22;
210    areset.write(true);
211    wait(1, SC_NS);
212
213    count = 23;
214    clock();
215    wait(1, SC_NS);
216
217    count = 24;
218    areset.write(false);
219    wait(1, SC_NS);
220
221    count = 25;
222    clock();
223    wait(1, SC_NS);
224
225    count = 26;
226    areset.write(true);
227    wait(1, SC_NS);
228
229    count = 27;
230    enable();
231    wait(1, SC_NS);
232
233    count = 28;
234    clock();
235    wait(1, SC_NS);
236
237    count = 29;
238    areset.write(false);
239    wait(sc_time(100, SC_NS) - sc_time_stamp());
240
241    count = 30;
242    ct.disable();
243    t.disable();
244    m.disable();
245
246    // Test multiple resets
247    ct2.enable();
248    t2.enable();
249    clock2();
250
251    count = 31;
252    clock2();
253
254    count = 32;
255    sreset1.write(1);
256    clock2();
257
258    count = 33;
259    sreset2.write(1);
260    sreset3.write(1);
261    clock2();
262
263    count = 34;
264    sreset1.write(0);
265    sreset2.write(0);
266    clock2();
267
268    count = 35;
269    sreset3.write(0);
270    clock2();
271
272    count = 36;
273    areset1.write(1);
274    areset2.write(1);
275    areset3.write(1);
276    wait(SC_ZERO_TIME);
277
278    count = 37;
279    clock2();
280
281    count = 38;
282    sreset1.write(1);
283    sreset2.write(1);
284    sreset3.write(1);
285    ct2.sync_reset_on();
286    t2.sync_reset_on();
287    clock2();
288
289    count = 39;
290    areset1.write(0);
291    areset2.write(0);
292    areset3.write(0);
293    sreset1.write(0);
294    sreset2.write(0);
295    sreset3.write(0);
296    clock2();
297
298    count = 40;
299    ct2.sync_reset_off();
300    t2.sync_reset_off();
301    clock2();
302
303    count = 41;
304    sreset2.write(1);
305    ct2.sync_reset_on();
306    t2.sync_reset_on();
307    clock2();
308
309    count = 42;
310    areset2.write(1);
311    wait(SC_ZERO_TIME);
312
313    count = 43;
314    clock2();
315
316    count = 44;
317    sreset2.write(0);
318    ct2.sync_reset_off();
319    t2.sync_reset_off();
320    clock2();
321
322    count = 45;
323    areset1.write(0);
324    areset2.write(0);
325    areset3.write(0);
326    sreset1.write(0);
327    sreset2.write(0);
328    sreset3.write(0);
329    clock2();
330
331    count = 46;
332    ct2.reset();
333    t2.reset();
334    wait(SC_ZERO_TIME);
335
336    count = 47;
337    clock2();
338  }
339
340  void CT()
341  {
342    //cout << "CT() called at " << sc_time_stamp() << endl;
343    switch (count)
344    {
345      case  0: sc_assert( sc_delta_count() == 1 ); f1=1; break;
346      case  4: sc_assert( sc_time_stamp() == sc_time(20, SC_NS) ); f2=1; break;
347      case  7: sc_assert( sc_time_stamp() == sc_time(30, SC_NS) ); f3=1; break;
348      case  8: sc_assert( sc_time_stamp() == sc_time(31, SC_NS) ); f4=1; break;
349      case  9: sc_assert( sc_time_stamp() == sc_time(32, SC_NS) ); f5=1; break;
350      case 11: sc_assert( sc_time_stamp() == sc_time(34, SC_NS) ); f6=1; break;
351      case 14: sc_assert( sc_time_stamp() == sc_time(41, SC_NS) ); f7=1; break;
352      case 19: sc_assert( sc_time_stamp() == sc_time(53, SC_NS) ); f8=1; break;
353      case 22: sc_assert( sc_time_stamp() == sc_time(61, SC_NS) ); f9=1; break;
354      case 26: sc_assert( sc_time_stamp() == sc_time(65, SC_NS) ); f11=1; break;
355      case 28: sc_assert( sc_time_stamp() == sc_time(67, SC_NS) ); f12=1; break;
356      default: sc_assert( false ); break;
357    }
358    while (true)
359    {
360      wait();
361      //cout << "CT() awoke at " << sc_time_stamp() << endl;
362
363    switch (count)
364    {
365      case  1: sc_assert( sc_delta_count() == 3 ); f13=1; break;
366      case  2: sc_assert( sc_time_stamp() == sc_time(1, SC_NS) ); f14=1; break;
367      case  3: sc_assert( sc_time_stamp() == sc_time(11, SC_NS) ); f15=1; break;
368      case  6: sc_assert( sc_time_stamp() == sc_time(22, SC_NS) ); f16=1; break;
369      case 20: sc_assert( sc_time_stamp() == sc_time(54, SC_NS) ); f17=1; break;
370      default: sc_assert( false ); break;
371    }
372
373    }
374  }
375
376  void T()
377  {
378    //cout << "T() called at " << sc_time_stamp() << endl;
379    switch (count)
380    {
381      case  0: sc_assert( sc_delta_count() == 0 ); f18=1; break;
382      case  4: sc_assert( sc_time_stamp() == sc_time(20, SC_NS) ); f19=1; break;
383      case  7: sc_assert( sc_time_stamp() == sc_time(30, SC_NS) ); f20=1; break;
384      case  8: sc_assert( sc_time_stamp() == sc_time(31, SC_NS) ); f21=1; break;
385      case  9: sc_assert( sc_time_stamp() == sc_time(32, SC_NS) ); f22=1; break;
386      case 11: sc_assert( sc_time_stamp() == sc_time(34, SC_NS) ); f23=1; break;
387      case 14: sc_assert( sc_time_stamp() == sc_time(41, SC_NS) ); f24=1; break;
388      case 19: sc_assert( sc_time_stamp() == sc_time(53, SC_NS) ); f25=1; break;
389      case 22: sc_assert( sc_time_stamp() == sc_time(61, SC_NS) ); f26=1; break;
390      case 26: sc_assert( sc_time_stamp() == sc_time(65, SC_NS) ); f28=1; break;
391      case 28: sc_assert( sc_time_stamp() == sc_time(67, SC_NS) ); f29=1; break;
392      default: sc_assert( false ); break;
393    }
394    while (true)
395    {
396      wait(clk.default_event());
397      //cout << "T() awoke at " << sc_time_stamp() << endl;
398
399    switch (count)
400    {
401      case  0: sc_assert( sc_delta_count() == 1 ); f30=1; break;
402      case  1: sc_assert( sc_delta_count() == 3 ); f31=1; break;
403      case  2: sc_assert( sc_time_stamp() == sc_time(1, SC_NS) ); f32=1; break;
404      case  3: sc_assert( sc_time_stamp() == sc_time(11, SC_NS) ); f33=1; break;
405      case  6: sc_assert( sc_time_stamp() == sc_time(22, SC_NS) ); f34=1; break;
406      case 20: sc_assert( sc_time_stamp() == sc_time(54, SC_NS) ); f35=1; break;
407      default: sc_assert( false ); break;
408    }
409
410    }
411  }
412
413  void M()
414  {
415    //cout << "M() called at " << sc_time_stamp() << endl;
416    switch (count)
417    {
418      case  0: sc_assert( sc_delta_count() == 1 ); f36=1; break;
419      case  1: sc_assert( sc_delta_count() == 3 ); f37=1; break;
420      case  2: sc_assert( sc_time_stamp() == sc_time(1, SC_NS) ); f38=1; break;
421      case  3: sc_assert( sc_time_stamp() == sc_time(11, SC_NS) ); f39=1; break;
422      case  4: sc_assert( sc_time_stamp() == sc_time(20, SC_NS) ); f83=1; break;
423      case  6: sc_assert( sc_time_stamp() == sc_time(22, SC_NS) ); f40=1; break;
424      case  7: sc_assert( sc_time_stamp() == sc_time(30, SC_NS) ); f84=1; break;
425      case  8: sc_assert( sc_time_stamp() == sc_time(31, SC_NS) ); f41=1; break;
426      case  9: sc_assert( sc_time_stamp() == sc_time(32, SC_NS) ); f42=1; break;
427      case 11: sc_assert( sc_time_stamp() == sc_time(34, SC_NS) ); f85=1; break;
428      case 14: sc_assert( sc_time_stamp() == sc_time(41, SC_NS) ); f43=1; break;
429      case 19: sc_assert( sc_time_stamp() == sc_time(53, SC_NS) ); f44=1; break;
430      case 20: sc_assert( sc_time_stamp() == sc_time(54, SC_NS) ); f45=1; break;
431      case 22: sc_assert( sc_time_stamp() == sc_time(61, SC_NS) ); f26=1; break;
432      case 26: sc_assert( sc_time_stamp() == sc_time(65, SC_NS) ); f86=1; break;
433      case 28: sc_assert( sc_time_stamp() == sc_time(67, SC_NS) ); f46=1; break;
434      default: sc_assert( false ); break;
435    }
436  }
437
438  void CT2()
439  {
440    //cout << "CT2() called at " << sc_time_stamp() << endl;
441    switch (count)
442    {
443        case 30: sc_assert( sc_time_stamp() == sc_time(105, SC_NS) ); f47=1; break;
444        case 32: sc_assert( sc_time_stamp() == sc_time(125, SC_NS) ); f51=1; break;
445        case 33: sc_assert( sc_time_stamp() == sc_time(135, SC_NS) ); f53=1; break;
446        case 34: sc_assert( sc_time_stamp() == sc_time(145, SC_NS) ); f55=1; break;
447        case 36: sc_assert( sc_time_stamp() == sc_time(160, SC_NS) ); f59=1; break;
448        case 37: sc_assert( sc_time_stamp() == sc_time(165, SC_NS) ); f61=1; break;
449        case 38: sc_assert( sc_time_stamp() == sc_time(175, SC_NS) ); f63=1; break;
450        case 39: sc_assert( sc_time_stamp() == sc_time(185, SC_NS) ); f65=1; break;
451        case 41: sc_assert( sc_time_stamp() == sc_time(205, SC_NS) ); f69=1; break;
452        case 42: sc_assert( sc_time_stamp() == sc_time(210, SC_NS) ); f71=1; break;
453        case 43: sc_assert( sc_time_stamp() == sc_time(215, SC_NS) ); f73=1; break;
454        case 44: sc_assert( sc_time_stamp() == sc_time(225, SC_NS) ); f75=1; break;
455        case 46: sc_assert( sc_time_stamp() == sc_time(240, SC_NS) ); f79=1; break;
456        default: sc_assert( false ); break;
457    }
458    while (true)
459    {
460      wait();
461      //cout << "CT2() awoke at " << sc_time_stamp() << endl;
462      switch (count)
463      {
464        case 31: sc_assert( sc_time_stamp() == sc_time(115, SC_NS) ); f49=1; break;
465        case 35: sc_assert( sc_time_stamp() == sc_time(155, SC_NS) ); f57=1; break;
466        case 40: sc_assert( sc_time_stamp() == sc_time(195, SC_NS) ); f67=1; break;
467        case 45: sc_assert( sc_time_stamp() == sc_time(235, SC_NS) ); f77=1; break;
468        case 47: sc_assert( sc_time_stamp() == sc_time(245, SC_NS) ); f81=1; break;
469        default: sc_assert( false ); break;
470      }
471    }
472  }
473
474  void T2()
475  {
476    //cout << "T2() called at " << sc_time_stamp() << endl;
477    switch (count)
478    {
479        case 30: sc_assert( sc_time_stamp() == sc_time(105, SC_NS) ); f48=1; break;
480        case 32: sc_assert( sc_time_stamp() == sc_time(125, SC_NS) ); f52=1; break;
481        case 33: sc_assert( sc_time_stamp() == sc_time(135, SC_NS) ); f54=1; break;
482        case 34: sc_assert( sc_time_stamp() == sc_time(145, SC_NS) ); f56=1; break;
483        case 36: sc_assert( sc_time_stamp() == sc_time(160, SC_NS) ); f60=1; break;
484        case 37: sc_assert( sc_time_stamp() == sc_time(165, SC_NS) ); f62=1; break;
485        case 38: sc_assert( sc_time_stamp() == sc_time(175, SC_NS) ); f64=1; break;
486        case 39: sc_assert( sc_time_stamp() == sc_time(185, SC_NS) ); f66=1; break;
487        case 41: sc_assert( sc_time_stamp() == sc_time(205, SC_NS) ); f70=1; break;
488        case 42: sc_assert( sc_time_stamp() == sc_time(210, SC_NS) ); f72=1; break;
489        case 43: sc_assert( sc_time_stamp() == sc_time(215, SC_NS) ); f74=1; break;
490        case 44: sc_assert( sc_time_stamp() == sc_time(225, SC_NS) ); f76=1; break;
491        case 46: sc_assert( sc_time_stamp() == sc_time(240, SC_NS) ); f80=1; break;
492        default: sc_assert( false ); break;
493    }
494    while (true)
495    {
496      wait();
497      //cout << "T2() awoke at " << sc_time_stamp() << endl;
498      switch (count)
499      {
500        case 31: sc_assert( sc_time_stamp() == sc_time(115, SC_NS) ); f50=1; break;
501        case 35: sc_assert( sc_time_stamp() == sc_time(155, SC_NS) ); f58=1; break;
502        case 40: sc_assert( sc_time_stamp() == sc_time(195, SC_NS) ); f68=1; break;
503        case 45: sc_assert( sc_time_stamp() == sc_time(235, SC_NS) ); f78=1; break;
504        case 47: sc_assert( sc_time_stamp() == sc_time(245, SC_NS) ); f82=1; break;
505        default: sc_assert( false ); break;
506      }
507    }
508  }
509
510  void clock()
511  {
512    clk.write( !clk.read() );
513  }
514
515  void clock2()
516  {
517    clk.write(0);
518    wait(5, SC_NS);
519    clk.write(1);
520    wait(5, SC_NS);
521  }
522
523  void suspend()
524  {
525    ct.suspend();
526    t.suspend();
527    m.suspend();
528  }
529
530  void resume()
531  {
532    ct.resume();
533    t.resume();
534    m.resume();
535  }
536
537  void disable()
538  {
539    ct.disable();
540    t.disable();
541    m.disable();
542  }
543
544  void enable()
545  {
546    ct.enable();
547    t.enable();
548    m.enable();
549  }
550
551  void sync_reset_on()
552  {
553    ct.sync_reset_on();
554    t.sync_reset_on();
555    m.sync_reset_on();
556  }
557
558  void sync_reset_off()
559  {
560    ct.sync_reset_off();
561    t.sync_reset_off();
562    m.sync_reset_off();
563  }
564
565  SC_HAS_PROCESS(Top);
566};
567
568int sc_main(int argc, char* argv[])
569{
570  Top top("top");
571
572  sc_start();
573
574  sc_assert(top.f1);
575  sc_assert(top.f2);
576  sc_assert(top.f3);
577  sc_assert(top.f4);
578  sc_assert(top.f5);
579  sc_assert(top.f6);
580  sc_assert(top.f7);
581  sc_assert(top.f8);
582  sc_assert(top.f9);
583  sc_assert(top.f11);
584  sc_assert(top.f12);
585  sc_assert(top.f13);
586  sc_assert(top.f14);
587  sc_assert(top.f15);
588  sc_assert(top.f16);
589  sc_assert(top.f17);
590  sc_assert(top.f18);
591  sc_assert(top.f19);
592  sc_assert(top.f20);
593  sc_assert(top.f21);
594  sc_assert(top.f22);
595  sc_assert(top.f23);
596  sc_assert(top.f24);
597  sc_assert(top.f25);
598  sc_assert(top.f26);
599  sc_assert(top.f28);
600  sc_assert(top.f29);
601  sc_assert(top.f30);
602  sc_assert(top.f31);
603  sc_assert(top.f32);
604  sc_assert(top.f33);
605  sc_assert(top.f34);
606  sc_assert(top.f35);
607  sc_assert(top.f36);
608  sc_assert(top.f37);
609  sc_assert(top.f38);
610  sc_assert(top.f39);
611  sc_assert(top.f40);
612  sc_assert(top.f41);
613  sc_assert(top.f42);
614  sc_assert(top.f43);
615  sc_assert(top.f44);
616  sc_assert(top.f45);
617  sc_assert(top.f46);
618  sc_assert(top.f47);
619  sc_assert(top.f48);
620  sc_assert(top.f49);
621  sc_assert(top.f50);
622  sc_assert(top.f51);
623  sc_assert(top.f52);
624  sc_assert(top.f53);
625  sc_assert(top.f54);
626  sc_assert(top.f55);
627  sc_assert(top.f56);
628  sc_assert(top.f57);
629  sc_assert(top.f58);
630  sc_assert(top.f59);
631  sc_assert(top.f60);
632  sc_assert(top.f61);
633  sc_assert(top.f62);
634  sc_assert(top.f63);
635  sc_assert(top.f64);
636  sc_assert(top.f65);
637  sc_assert(top.f66);
638  sc_assert(top.f67);
639  sc_assert(top.f68);
640  sc_assert(top.f69);
641  sc_assert(top.f70);
642  sc_assert(top.f71);
643  sc_assert(top.f72);
644  sc_assert(top.f73);
645  sc_assert(top.f74);
646  sc_assert(top.f75);
647  sc_assert(top.f76);
648  sc_assert(top.f77);
649  sc_assert(top.f78);
650  sc_assert(top.f79);
651  sc_assert(top.f80);
652  sc_assert(top.f81);
653  sc_assert(top.f82);
654  sc_assert(top.f83);
655  sc_assert(top.f84);
656  sc_assert(top.f85);
657  sc_assert(top.f86);
658
659  cout << endl << "Success" << endl;
660  return 0;
661}
662