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