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 gcd.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.comstruct gcd_cc : public sc_module { 4112855Sgabeblack@google.com sc_in_clk clk; 4212855Sgabeblack@google.com sc_in<bool> reset; 4312855Sgabeblack@google.com sc_in<unsigned> a; 4412855Sgabeblack@google.com sc_in<unsigned> b; 4512855Sgabeblack@google.com sc_out<unsigned> c; 4612855Sgabeblack@google.com sc_out<bool> ready; 4712855Sgabeblack@google.com 4812855Sgabeblack@google.com void gcd_compute(); 4912855Sgabeblack@google.com 5012855Sgabeblack@google.com SC_HAS_PROCESS( gcd_cc ); 5112855Sgabeblack@google.com 5212855Sgabeblack@google.com gcd_cc( sc_module_name name ) 5312855Sgabeblack@google.com { 5412855Sgabeblack@google.com SC_CTHREAD( gcd_compute, clk.pos() ); 5512855Sgabeblack@google.com reset_signal_is(reset,true); 5612855Sgabeblack@google.com } 5712855Sgabeblack@google.com}; 5812855Sgabeblack@google.com 5912855Sgabeblack@google.comvoid 6012855Sgabeblack@google.comgcd_cc::gcd_compute() 6112855Sgabeblack@google.com{ 6212855Sgabeblack@google.com unsigned tmp_a = 0; 6312855Sgabeblack@google.com wait(); // Note that this wait() is required, otherwise, 6412855Sgabeblack@google.com // the reset is wrong! This is a problem with BC, 6512855Sgabeblack@google.com // not our frontend. 6612855Sgabeblack@google.com 6712855Sgabeblack@google.com while (true) { 6812855Sgabeblack@google.com unsigned tmp_b; 6912855Sgabeblack@google.com 7012855Sgabeblack@google.com c = tmp_a; 7112855Sgabeblack@google.com ready = true; 7212855Sgabeblack@google.com wait(); 7312855Sgabeblack@google.com 7412855Sgabeblack@google.com tmp_a = a; 7512855Sgabeblack@google.com tmp_b = b; 7612855Sgabeblack@google.com ready = false; 7712855Sgabeblack@google.com wait(); 7812855Sgabeblack@google.com 7912855Sgabeblack@google.com while (tmp_b != 0) { 8012855Sgabeblack@google.com 8112855Sgabeblack@google.com unsigned tmp_c = tmp_a; 8212855Sgabeblack@google.com tmp_a = tmp_b; 8312855Sgabeblack@google.com wait(); 8412855Sgabeblack@google.com 8512855Sgabeblack@google.com while (tmp_c >= tmp_b) { 8612855Sgabeblack@google.com tmp_c = tmp_c - tmp_b; 8712855Sgabeblack@google.com wait(); 8812855Sgabeblack@google.com } 8912855Sgabeblack@google.com 9012855Sgabeblack@google.com tmp_b = tmp_c; 9112855Sgabeblack@google.com wait(); 9212855Sgabeblack@google.com } 9312855Sgabeblack@google.com } 9412855Sgabeblack@google.com} 9512855Sgabeblack@google.com 9612855Sgabeblack@google.comstatic int 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 }; 9712855Sgabeblack@google.comstatic unsigned numbers_index = 0; 9812855Sgabeblack@google.com 9912855Sgabeblack@google.comstruct testbench : public sc_module { 10012855Sgabeblack@google.com sc_in_clk clk; 10112855Sgabeblack@google.com sc_inout<bool> reset; 10212855Sgabeblack@google.com sc_in<bool> ready; 10312855Sgabeblack@google.com sc_inout<unsigned> a; 10412855Sgabeblack@google.com sc_inout<unsigned> b; 10512855Sgabeblack@google.com sc_in<unsigned> c; 10612855Sgabeblack@google.com 10712855Sgabeblack@google.com void reset_gen(); 10812855Sgabeblack@google.com void stimu_gen(); 10912855Sgabeblack@google.com void display(); 11012855Sgabeblack@google.com 11112855Sgabeblack@google.com SC_HAS_PROCESS( testbench ); 11212855Sgabeblack@google.com 11312855Sgabeblack@google.com testbench( sc_module_name name ) 11412855Sgabeblack@google.com { 11512855Sgabeblack@google.com SC_CTHREAD( reset_gen, clk.pos() ); 11612855Sgabeblack@google.com SC_CTHREAD( stimu_gen, clk.pos() ); 11712855Sgabeblack@google.com SC_METHOD( display ); 11812855Sgabeblack@google.com sensitive << ready; 11912855Sgabeblack@google.com } 12012855Sgabeblack@google.com}; 12112855Sgabeblack@google.com 12212855Sgabeblack@google.comvoid 12312855Sgabeblack@google.comtestbench::reset_gen() 12412855Sgabeblack@google.com{ 12512855Sgabeblack@google.com reset = 0; 12612855Sgabeblack@google.com wait(); 12712855Sgabeblack@google.com reset = 1; 12812855Sgabeblack@google.com wait(); 12912855Sgabeblack@google.com wait(); 13012855Sgabeblack@google.com reset = 0; 13112855Sgabeblack@google.com wait(); 13212855Sgabeblack@google.com /* die */ 13312855Sgabeblack@google.com} 13412855Sgabeblack@google.com 13512855Sgabeblack@google.comvoid 13612855Sgabeblack@google.comtestbench::stimu_gen() 13712855Sgabeblack@google.com{ 13812855Sgabeblack@google.com while (true) { 13912855Sgabeblack@google.com do { wait(); } while (ready == 0); 14012855Sgabeblack@google.com a = (unsigned) numbers[numbers_index++ % (sizeof(numbers)/sizeof(numbers[0]))]; 14112855Sgabeblack@google.com b = (unsigned) numbers[(numbers_index*numbers_index) % (sizeof(numbers)/sizeof(numbers[0]))]; 14212855Sgabeblack@google.com numbers_index++; 14312855Sgabeblack@google.com } 14412855Sgabeblack@google.com} 14512855Sgabeblack@google.com 14612855Sgabeblack@google.comvoid 14712855Sgabeblack@google.comtestbench::display() 14812855Sgabeblack@google.com{ 14912855Sgabeblack@google.com if (ready) { 15012855Sgabeblack@google.com cout << "reset = " << reset << " ready = " << ready 15112855Sgabeblack@google.com << " a = " << a << " b = " << b << " c = " << c << endl; 15212855Sgabeblack@google.com } 15312855Sgabeblack@google.com} 15412855Sgabeblack@google.com 15512855Sgabeblack@google.comint sc_main(int argc, char* argv[] ) 15612855Sgabeblack@google.com{ 15712855Sgabeblack@google.com sc_signal<unsigned> a("a"), b("b"), c("c"); 15812855Sgabeblack@google.com sc_clock clk("clk", 20, SC_NS); 15912855Sgabeblack@google.com sc_signal<bool> reset("reset"), ready("ready"); 16012855Sgabeblack@google.com 16112855Sgabeblack@google.com a = 0; 16212855Sgabeblack@google.com b = 0; 16312855Sgabeblack@google.com c = 0; 16412855Sgabeblack@google.com reset = false; 16512855Sgabeblack@google.com ready = false; 16612855Sgabeblack@google.com 16712855Sgabeblack@google.com gcd_cc gcd("gcd"); 16812855Sgabeblack@google.com gcd(clk, reset, a, b, c, ready); 16912855Sgabeblack@google.com 17012855Sgabeblack@google.com testbench tb("tb"); 17112855Sgabeblack@google.com tb(clk, reset, ready, a, b, c); 17212855Sgabeblack@google.com 17312855Sgabeblack@google.com sc_start(2000000, SC_NS); 17412855Sgabeblack@google.com return 0; 17512855Sgabeblack@google.com} 176