old_event_bug.cpp revision 12855
19537Satgutier@umich.edu/*****************************************************************************
29537Satgutier@umich.edu
39537Satgutier@umich.edu  Licensed to Accellera Systems Initiative Inc. (Accellera) under one or
49537Satgutier@umich.edu  more contributor license agreements.  See the NOTICE file distributed
59537Satgutier@umich.edu  with this work for additional information regarding copyright ownership.
69537Satgutier@umich.edu  Accellera licenses this file to you under the Apache License, Version 2.0
79537Satgutier@umich.edu  (the "License"); you may not use this file except in compliance with the
89537Satgutier@umich.edu  License.  You may obtain a copy of the License at
99537Satgutier@umich.edu
109537Satgutier@umich.edu    http://www.apache.org/licenses/LICENSE-2.0
119537Satgutier@umich.edu
129537Satgutier@umich.edu  Unless required by applicable law or agreed to in writing, software
139537Satgutier@umich.edu  distributed under the License is distributed on an "AS IS" BASIS,
149537Satgutier@umich.edu  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
159537Satgutier@umich.edu  implied.  See the License for the specific language governing
169537Satgutier@umich.edu  permissions and limitations under the License.
179537Satgutier@umich.edu
189537Satgutier@umich.edu *****************************************************************************/
199537Satgutier@umich.edu
209537Satgutier@umich.edu// old_event_bug.cpp -- test for
219537Satgutier@umich.edu//
229537Satgutier@umich.edu//  Original Author: John Aynsley, Doulos, Inc.
239537Satgutier@umich.edu//
249537Satgutier@umich.edu// MODIFICATION LOG - modifiers, enter your name, affiliation, date and
259537Satgutier@umich.edu//
269537Satgutier@umich.edu// $Log: old_event_bug.cpp,v $
279537Satgutier@umich.edu// Revision 1.2  2011/05/08 19:18:46  acg
289537Satgutier@umich.edu//  Andy Goodrich: remove extraneous + prefixes from git diff.
299537Satgutier@umich.edu//
309537Satgutier@umich.edu
319537Satgutier@umich.edu// Longstanding bug when checking for events in signals
329537Satgutier@umich.edu
339537Satgutier@umich.edu#define SC_INCLUDE_DYNAMIC_PROCESSES
349537Satgutier@umich.edu
359537Satgutier@umich.edu#include <systemc>
369537Satgutier@umich.edu
379537Satgutier@umich.eduusing namespace sc_core;
389537Satgutier@umich.eduusing std::cout;
399537Satgutier@umich.eduusing std::endl;
409537Satgutier@umich.edu
419537Satgutier@umich.edustruct Top: sc_module
429537Satgutier@umich.edu{
439537Satgutier@umich.edu  Top(sc_module_name _name)
449537Satgutier@umich.edu  : counti(0)
459537Satgutier@umich.edu  , countb(0)
469537Satgutier@umich.edu  , reached_the_end(false)
479537Satgutier@umich.edu  {
489537Satgutier@umich.edu    SC_THREAD(T);
499537Satgutier@umich.edu
509537Satgutier@umich.edu    SC_METHOD(MI);
519537Satgutier@umich.edu      sensitive << sigi;
529537Satgutier@umich.edu      dont_initialize();
539537Satgutier@umich.edu
549537Satgutier@umich.edu    SC_METHOD(MB);
559537Satgutier@umich.edu      sensitive << sigb;
569537Satgutier@umich.edu      dont_initialize();
579537Satgutier@umich.edu
589537Satgutier@umich.edu    sigi.write(0);
599537Satgutier@umich.edu    sigb.write(false);
609537Satgutier@umich.edu    sigi_dummy.write(0);
619537Satgutier@umich.edu    sigb_dummy.write(false);
629537Satgutier@umich.edu  }
639537Satgutier@umich.edu
64  int counti;
65  int countb;
66  bool reached_the_end;
67
68  sc_signal<int>  sigi;
69  sc_signal<bool> sigb;
70
71  sc_signal<int>  sigi_dummy;
72  sc_signal<bool> sigb_dummy;
73
74  void T()
75  {
76    sc_assert( sigi.event() == false );
77    sc_assert( sigb.event() == false );
78    sc_assert( sigb.posedge() == false );
79    sc_assert( sigb.negedge() == false );
80
81    sigi.write(1);
82    wait(sigi.value_changed_event());
83    sc_assert( sigi.event() );
84
85    sigb.write(true);
86    wait(sigb.value_changed_event());
87    sc_assert( sigb.event() );
88    sc_assert( sigb.posedge() );
89    sc_assert( sigb.negedge() == false );
90
91    wait(1, SC_NS);
92
93    sc_assert( sigi.event() == false );
94    sc_assert( sigb.event() == false );
95
96    sigi.write(2);
97    sigb.write(false);
98
99    wait(1, SC_NS);
100
101    sc_assert( sigi.event() == false );
102    sc_assert( sigb.event() == false );
103    sc_assert( sigb.posedge() == false );
104    sc_assert( sigb.negedge() == false );
105
106    sigi_dummy.write(1);
107    sigb_dummy.write(true);
108
109    wait(1, SC_NS);
110
111    sc_assert( sigi_dummy.event() == false );
112    sc_assert( sigb_dummy.event() == false );
113    sc_assert( sigb_dummy.posedge() == false );
114    sc_assert( sigb_dummy.negedge() == false );
115
116    reached_the_end = true;
117  }
118
119  void MI()
120  {
121    sc_assert( sigi.event() );
122    ++counti;
123  }
124
125  void MB()
126  {
127    sc_assert( sigb.event() );
128    ++countb;
129  }
130
131  SC_HAS_PROCESS(Top);
132};
133
134int sc_main(int argc, char* argv[])
135{
136  Top top("top");
137
138  sc_start();
139
140  sc_assert( top.counti == 2 );
141  sc_assert( top.countb == 2 );
142  sc_assert( top.reached_the_end );
143
144  cout << endl << "Success" << endl;
145  return 0;
146}
147
148