112855Sgabeblack@google.com/***************************************************************************** 212855Sgabeblack@google.com 312855Sgabeblack@google.com Licensed to Accellera Systems Initiative Inc. (Accellera) under one or 412855Sgabeblack@google.com more contributor license agreements. See the NOTICE file distributed 512855Sgabeblack@google.com with this work for additional information regarding copyright ownership. 612855Sgabeblack@google.com Accellera licenses this file to you under the Apache License, Version 2.0 712855Sgabeblack@google.com (the "License"); you may not use this file except in compliance with the 812855Sgabeblack@google.com License. You may obtain a copy of the License at 912855Sgabeblack@google.com 1012855Sgabeblack@google.com http://www.apache.org/licenses/LICENSE-2.0 1112855Sgabeblack@google.com 1212855Sgabeblack@google.com Unless required by applicable law or agreed to in writing, software 1312855Sgabeblack@google.com distributed under the License is distributed on an "AS IS" BASIS, 1412855Sgabeblack@google.com WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 1512855Sgabeblack@google.com implied. See the License for the specific language governing 1612855Sgabeblack@google.com permissions and limitations under the License. 1712855Sgabeblack@google.com 1812855Sgabeblack@google.com *****************************************************************************/ 1912855Sgabeblack@google.com 2012855Sgabeblack@google.com/***************************************************************************** 2112855Sgabeblack@google.com 2212855Sgabeblack@google.com module_name.cpp -- 2312855Sgabeblack@google.com 2412855Sgabeblack@google.com Original Author: Martin Janssen, Synopsys, Inc., 2002-02-15 2512855Sgabeblack@google.com 2612855Sgabeblack@google.com *****************************************************************************/ 2712855Sgabeblack@google.com 2812855Sgabeblack@google.com/***************************************************************************** 2912855Sgabeblack@google.com 3012855Sgabeblack@google.com MODIFICATION LOG - modifiers, enter your name, affiliation, date and 3112855Sgabeblack@google.com changes you are making here. 3212855Sgabeblack@google.com 3312855Sgabeblack@google.com Name, Affiliation, Date: 3412855Sgabeblack@google.com Description of Modification: 3512855Sgabeblack@google.com 3612855Sgabeblack@google.com *****************************************************************************/ 3712855Sgabeblack@google.com 3812855Sgabeblack@google.com#include "systemc.h" 3912855Sgabeblack@google.com 4012855Sgabeblack@google.comint numbers[] = { 49597, 41218, 20635, 40894, 16767, 17233, 36246, 28171, 60879, 49566, 10971, 24107, 30561, 49648, 50031, 12559, 23787, 35674, 43320, 37558, 840, 18689, 62466, 6308, 46271, 49801, 43433, 22683, 35494, 35259, 29020, 19555, 10941, 49656, 60450, 27709, 1353, 31160, 55880, 62232, 15190, 1315, 20803, 45751, 50963, 5298, 58311, 9215, 2378 }; 4112855Sgabeblack@google.com 4212855Sgabeblack@google.comint numbers_index = 0; 4312855Sgabeblack@google.com 4412855Sgabeblack@google.comstruct example : sc_module { 4512855Sgabeblack@google.com sc_in_clk clk; 4612855Sgabeblack@google.com sc_in<int> a; 4712855Sgabeblack@google.com sc_in<int> b; 4812855Sgabeblack@google.com sc_out<int> c; 4912855Sgabeblack@google.com 5012855Sgabeblack@google.com sc_signal<int> d; 5112855Sgabeblack@google.com sc_signal<int> e; 5212855Sgabeblack@google.com 5312855Sgabeblack@google.com void block_a(); 5412855Sgabeblack@google.com void block_b(); 5512855Sgabeblack@google.com void block_c(); 5612855Sgabeblack@google.com void block_d(); 5712855Sgabeblack@google.com void block_e(); 5812855Sgabeblack@google.com void block_f(); 5912855Sgabeblack@google.com 6012855Sgabeblack@google.com SC_CTOR(example) 6112855Sgabeblack@google.com { 6212855Sgabeblack@google.com SC_METHOD( block_a ); 6312855Sgabeblack@google.com sensitive << a; 6412855Sgabeblack@google.com sensitive << b; 6512855Sgabeblack@google.com 6612855Sgabeblack@google.com SC_METHOD( block_b ); 6712855Sgabeblack@google.com sensitive << a << b; 6812855Sgabeblack@google.com 6912855Sgabeblack@google.com SC_METHOD( block_c ); 7012855Sgabeblack@google.com sensitive << d << e; 7112855Sgabeblack@google.com 7212855Sgabeblack@google.com SC_CTHREAD( block_d, clk.neg() ); 7312855Sgabeblack@google.com 7412855Sgabeblack@google.com SC_CTHREAD( block_e, clk.pos() ); 7512855Sgabeblack@google.com 7612855Sgabeblack@google.com SC_CTHREAD( block_f, clk.pos() ); 7712855Sgabeblack@google.com } 7812855Sgabeblack@google.com}; 7912855Sgabeblack@google.com 8012855Sgabeblack@google.comvoid 8112855Sgabeblack@google.comexample::block_a() 8212855Sgabeblack@google.com{ 8312855Sgabeblack@google.com d = a + b; 8412855Sgabeblack@google.com} 8512855Sgabeblack@google.com 8612855Sgabeblack@google.comvoid 8712855Sgabeblack@google.comexample::block_b() 8812855Sgabeblack@google.com{ 8912855Sgabeblack@google.com e = a - b; 9012855Sgabeblack@google.com} 9112855Sgabeblack@google.com 9212855Sgabeblack@google.comvoid 9312855Sgabeblack@google.comexample::block_c() 9412855Sgabeblack@google.com{ 9512855Sgabeblack@google.com c = d * e; 9612855Sgabeblack@google.com} 9712855Sgabeblack@google.com 9812855Sgabeblack@google.comvoid 9912855Sgabeblack@google.comexample::block_d() 10012855Sgabeblack@google.com{ 10112855Sgabeblack@google.com int i = 0; 10212855Sgabeblack@google.com while (true) { 10312855Sgabeblack@google.com cout << "block_d " << i << endl; 10412855Sgabeblack@google.com i++; 10512855Sgabeblack@google.com wait(); 10612855Sgabeblack@google.com } 10712855Sgabeblack@google.com} 10812855Sgabeblack@google.com 10912855Sgabeblack@google.comvoid 11012855Sgabeblack@google.comexample::block_e() 11112855Sgabeblack@google.com{ 11212855Sgabeblack@google.com int i = 0; 11312855Sgabeblack@google.com while (true) { 11412855Sgabeblack@google.com cout << "block_e " << i << endl; 11512855Sgabeblack@google.com i++; 11612855Sgabeblack@google.com wait(); 11712855Sgabeblack@google.com } 11812855Sgabeblack@google.com} 11912855Sgabeblack@google.com 12012855Sgabeblack@google.comvoid 12112855Sgabeblack@google.comexample::block_f() 12212855Sgabeblack@google.com{ 12312855Sgabeblack@google.com int i = 32; 12412855Sgabeblack@google.com while (true) { 12512855Sgabeblack@google.com cout << "block_f " << i << endl; 12612855Sgabeblack@google.com i++; 12712855Sgabeblack@google.com wait(); 12812855Sgabeblack@google.com } 12912855Sgabeblack@google.com} 13012855Sgabeblack@google.com 13112855Sgabeblack@google.comstruct tb : sc_module { 13212855Sgabeblack@google.com sc_in_clk clk; 13312855Sgabeblack@google.com sc_out<int> a; 13412855Sgabeblack@google.com 13512855Sgabeblack@google.com void tb_proc(); 13612855Sgabeblack@google.com 13712855Sgabeblack@google.com SC_CTOR(tb) 13812855Sgabeblack@google.com { 13912855Sgabeblack@google.com SC_CTHREAD( tb_proc, clk.pos() ); 14012855Sgabeblack@google.com } 14112855Sgabeblack@google.com}; 14212855Sgabeblack@google.com 14312855Sgabeblack@google.comvoid 14412855Sgabeblack@google.comtb::tb_proc() 14512855Sgabeblack@google.com{ 14612855Sgabeblack@google.com while (true) { 14712855Sgabeblack@google.com a = numbers[numbers_index % (sizeof(numbers)/sizeof(numbers[0]))]; 14812855Sgabeblack@google.com numbers_index++; 14912855Sgabeblack@google.com cout << "tb_proc " << endl; 15012855Sgabeblack@google.com wait(); 15112855Sgabeblack@google.com } 15212855Sgabeblack@google.com} 15312855Sgabeblack@google.com 15412855Sgabeblack@google.comstruct tb2 : sc_module { 15512855Sgabeblack@google.com sc_in_clk clk; 15612855Sgabeblack@google.com sc_out<int> b; 15712855Sgabeblack@google.com 15812855Sgabeblack@google.com void tb2_proc(); 15912855Sgabeblack@google.com 16012855Sgabeblack@google.com SC_CTOR(tb2) 16112855Sgabeblack@google.com { 16212855Sgabeblack@google.com SC_CTHREAD( tb2_proc, clk.pos() ); 16312855Sgabeblack@google.com } 16412855Sgabeblack@google.com}; 16512855Sgabeblack@google.com 16612855Sgabeblack@google.comvoid 16712855Sgabeblack@google.comtb2::tb2_proc() 16812855Sgabeblack@google.com{ 16912855Sgabeblack@google.com while (true) { 17012855Sgabeblack@google.com b = numbers[numbers_index % (sizeof(numbers)/sizeof(numbers[0]))]; 17112855Sgabeblack@google.com numbers_index++; 17212855Sgabeblack@google.com cout << "tb2_proc " << endl; 17312855Sgabeblack@google.com wait(); 17412855Sgabeblack@google.com } 17512855Sgabeblack@google.com} 17612855Sgabeblack@google.com 17712855Sgabeblack@google.comSC_MODULE( monitor ) 17812855Sgabeblack@google.com{ 17912855Sgabeblack@google.com SC_HAS_PROCESS( monitor ); 18012855Sgabeblack@google.com 18112855Sgabeblack@google.com const sc_signal<int>& a; 18212855Sgabeblack@google.com const sc_signal<int>& b; 18312855Sgabeblack@google.com const sc_signal<int>& c; 18412855Sgabeblack@google.com 18512855Sgabeblack@google.com monitor( sc_module_name, 18612855Sgabeblack@google.com const sc_signal<int>& A, 18712855Sgabeblack@google.com const sc_signal<int>& B, 18812855Sgabeblack@google.com const sc_signal<int>& C ) : 18912855Sgabeblack@google.com a(A), b(B), c(C) 19012855Sgabeblack@google.com { 19112855Sgabeblack@google.com SC_METHOD( entry ); 19212855Sgabeblack@google.com sensitive << a; 19312855Sgabeblack@google.com sensitive << b; 19412855Sgabeblack@google.com sensitive << c; 19512855Sgabeblack@google.com } 19612855Sgabeblack@google.com void entry(); 19712855Sgabeblack@google.com}; 19812855Sgabeblack@google.com 19912855Sgabeblack@google.comvoid 20012855Sgabeblack@google.commonitor::entry() 20112855Sgabeblack@google.com{ 20212855Sgabeblack@google.com if (a.event()) cout << "a = " << a << endl; 20312855Sgabeblack@google.com if (b.event()) cout << "b = " << b << endl; 20412855Sgabeblack@google.com if (c.event()) cout << "c = " << c << endl; 20512855Sgabeblack@google.com} 20612855Sgabeblack@google.com 20712855Sgabeblack@google.comint 20812855Sgabeblack@google.comsc_main( int argc, char* argv[] ) 20912855Sgabeblack@google.com{ 21012855Sgabeblack@google.com sc_signal<int> a("a"); 21112855Sgabeblack@google.com sc_signal<int> b("b"); 21212855Sgabeblack@google.com sc_signal<int> c("c"); 21312855Sgabeblack@google.com sc_clock clk("clk", 10, SC_NS); 21412855Sgabeblack@google.com 21512855Sgabeblack@google.com example ex1("ex1"); 21612855Sgabeblack@google.com ex1(clk, a, b, c); 21712855Sgabeblack@google.com 21812855Sgabeblack@google.com tb tbb1("tbb1"); 21912855Sgabeblack@google.com tbb1(clk, a); 22012855Sgabeblack@google.com 22112855Sgabeblack@google.com tb2 tbb2("tbb2"); 22212855Sgabeblack@google.com tbb2(clk, b); 22312855Sgabeblack@google.com 22412855Sgabeblack@google.com monitor mon("mon", a, b, c); 22512855Sgabeblack@google.com 22612855Sgabeblack@google.com sc_start(200, SC_NS); 22712855Sgabeblack@google.com return 0; 22812855Sgabeblack@google.com} 229