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/***************************************************************************** 21 22 test11.cpp -- 23 24 Original Author: Martin Janssen, Synopsys, Inc., 2002-02-15 25 26 *****************************************************************************/ 27 28/***************************************************************************** 29 30 MODIFICATION LOG - modifiers, enter your name, affiliation, date and 31 changes you are making here. 32 33 Name, Affiliation, Date: 34 Description of Modification: 35 36 *****************************************************************************/ 37 38// test of next_trigger() for dynamic sensitivity 39 40#include "systemc.h" 41 42SC_MODULE( mod_a ) 43{ 44 sc_event e1; 45 sc_event e2; 46 sc_event e3; 47 sc_event e_ack; 48 49 void write( const char* msg ) 50 { 51 cout << sc_delta_count() << ":" << sc_time_stamp() 52 << " " << msg << "\n"; 53 } 54 55 bool sender_first; 56 57 void sender() 58 { 59 if( sender_first ) { 60 next_trigger( SC_ZERO_TIME ); 61 sender_first = false; 62 return; 63 } 64 65 e2.cancel(); 66 e3.cancel(); 67 e1.notify(); 68 e2.notify( SC_ZERO_TIME ); 69 e3.notify( 2, SC_NS ); 70 timed_out() ? write( "sender - timed out" ) 71 : write( "sender" ); 72 next_trigger( 3, SC_NS, e_ack ); 73 } 74 75 int receiver_state; 76 77 void receiver() 78 { 79 sc_time t1( 1, SC_NS ); 80 81 switch( receiver_state ) { 82 case 0: 83 // test next_trigger(e) 84 cout << "*** next_trigger(e)\n"; 85 86 next_trigger( e1 ); 87 break; 88 case 1: 89 write( "receiver - e1" ); 90 e_ack.notify(); 91 next_trigger( e2 ); 92 break; 93 case 2: 94 write( "receiver - e2" ); 95 e_ack.notify(); 96 next_trigger( e3 ); 97 break; 98 case 3: 99 write( "receiver - e3" ); 100 e_ack.notify(); 101 102 // test next_trigger(or_list) 103 cout << "*** next_trigger(or_list)\n"; 104 105 next_trigger( e1 | e1 | e1 ); 106 break; 107 case 4: 108 write( "receiver - e1 | e1 | e1" ); 109 e_ack.notify(); 110 next_trigger( e2 | e2 | e2 ); 111 break; 112 case 5: 113 write( "receiver - e2 | e2 | e2" ); 114 e_ack.notify(); 115 next_trigger( e3 | e3 | e3 ); 116 break; 117 case 6: 118 write( "receiver - e3 | e3 | e3" ); 119 e_ack.notify(); 120 next_trigger( e1 | e2 | e3 ); 121 break; 122 case 7: 123 write( "receiver - e1 | e2 | e3" ); 124 e_ack.notify(); 125 next_trigger( e3 | e2 | e1 ); 126 break; 127 case 8: 128 write( "receiver - e3 | e2 | e1" ); 129 e_ack.notify(); 130 131 // test next_trigger(and_list) 132 cout << "*** next_trigger(and_list)\n"; 133 134 next_trigger( e1 & e1 & e1 ); 135 break; 136 case 9: 137 write( "receiver - e1 & e1 & e1" ); 138 e_ack.notify(); 139 next_trigger( e2 & e2 & e2 ); 140 break; 141 case 10: 142 write( "receiver - e2 & e2 & e2" ); 143 e_ack.notify(); 144 next_trigger( e3 & e3 & e3 ); 145 break; 146 case 11: 147 write( "receiver - e3 & e3 & e3" ); 148 e_ack.notify(); 149 next_trigger( e1 & e2 & e3 ); 150 break; 151 case 12: 152 write( "receiver - e1 & e2 & e3" ); 153 e_ack.notify(); 154 next_trigger( e3 & e2 & e1 ); 155 break; 156 case 13: 157 write( "receiver - e3 & e2 & e1" ); 158 159 // test next_trigger(t) 160 cout << "*** next_trigger(t)\n"; 161 162 next_trigger( 0, SC_NS ); 163 break; 164 case 14: 165 write( "receiver - 0 ns" ); 166 next_trigger( 1, SC_NS ); 167 break; 168 case 15: 169 write( "receiver - 1 ns" ); 170 171 e_ack.notify(); 172 173 // test next_trigger(t,e) 174 cout << "*** next_trigger(t,e)\n"; 175 176 next_trigger( 1, SC_NS, e1 ); 177 break; 178 case 16: 179 timed_out() ? write( "receiver - 1 ns | e1 - timed out" ) 180 : write( "receiver - 1 ns | e1" ); 181 e_ack.notify(); 182 next_trigger( t1, e2 ); 183 break; 184 case 17: 185 timed_out() ? write( "receiver - 1 ns | e2 - timed out" ) 186 : write( "receiver - 1 ns | e2" ); 187 e_ack.notify(); 188 next_trigger( 1, SC_NS, e3 ); 189 break; 190 case 18: 191 timed_out() ? write( "receiver - 1 ns | e3 - timed out" ) 192 : write( "receiver - 1 ns | e3" ); 193 e_ack.notify(); 194 195 // test next_trigger(t,or_list) 196 cout << "*** next_trigger(t,or_list)\n"; 197 198 next_trigger( t1, e1 | e2 | e3 ); 199 break; 200 case 19: 201 timed_out() ? write( "receiver - 1 ns | e1 | e2 | e3 - timed out" ) 202 : write( "receiver - 1 ns | e1 | e2 | e3" ); 203 e_ack.notify(); 204 205 // test next_trigger(t,and_list) 206 cout << "*** next_trigger(t,and_list)\n"; 207 208 next_trigger( t1, e1 & e2 & e3 ); 209 break; 210 case 20: 211 timed_out() ? write( "receiver - 1 ns | e1 & e2 & e3 - timed out" ) 212 : write( "receiver - 1 ns | e1 & e2 & e3" ); 213 214 sc_stop(); 215 write( "receiver - stop" ); 216 next_trigger( SC_ZERO_TIME ); 217 break; 218 default: 219 sc_assert( false ); 220 } 221 receiver_state ++; 222 } 223 224 SC_CTOR( mod_a ) 225 { 226 SC_METHOD( sender ); 227 sender_first = true; 228 SC_METHOD( receiver ); 229 receiver_state = 0; 230 } 231}; 232 233int 234sc_main( int, char*[] ) 235{ 236 mod_a a( "a" ); 237 238 sc_start(); 239 240 return 0; 241} 242