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 test02.cpp 23 24 Original Author: Andy Goodrich, Forte Design Systems, 7 Apr 2005 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#include "systemc.h" 39 40#define GET_UNSIGNED(VALUE,OFFSET,EXPECTED) \ 41{ \ 42 right_sc_biguint32 = 1 << OFFSET; \ 43 VALUE.concat_get_data( right_sc_biguint32.get_raw(), OFFSET); \ 44 if ( right_sc_biguint32 != ((EXPECTED)<<OFFSET) ) \ 45 cout << __FILE__ << "(" << __LINE__ << ") : " << \ 46 #VALUE << ".concat_get_data(ulong*, " << #OFFSET << ") expected " \ 47 << ((EXPECTED)<<OFFSET) << " got " << right_sc_biguint32 << endl; \ 48} 49 50#define GET_UNSIGNEDS(OFFSET,EXPECTED) \ 51{ \ 52 GET_UNSIGNED(left_sc_bigint12,OFFSET,EXPECTED); \ 53 GET_UNSIGNED(left_sc_biguint12,OFFSET,EXPECTED); \ 54 GET_UNSIGNED(left_sc_int12,OFFSET,EXPECTED); \ 55 GET_UNSIGNED(left_sc_uint12,OFFSET,EXPECTED); \ 56 GET_UNSIGNED(left_sc_int12[1],OFFSET,((EXPECTED>>1)&1)); \ 57 GET_UNSIGNED(left_sc_uint12[1],OFFSET,((EXPECTED>>1)&1)); \ 58 GET_UNSIGNED(left_sc_int12(7,2),OFFSET,((EXPECTED>>2)&0x3f)); \ 59 GET_UNSIGNED(left_sc_uint12(7,2),OFFSET,((EXPECTED>>2)&0x3f)); \ 60} 61 62#define GET_UINT64(VALUE,EXPECTED) \ 63{ \ 64 uint64 actual = VALUE.concat_get_uint64(); \ 65 if ( actual != (EXPECTED) ) \ 66 cout << __FILE__ << "(" << __LINE__ << ") : " << \ 67 #VALUE << ".const_get_uint64() expected " << (EXPECTED) << " got " \ 68 << actual << endl; \ 69} 70 71#define GET_UINT64S(EXPECTED) \ 72{ \ 73 GET_UINT64(left_sc_bigint12,EXPECTED) \ 74 GET_UINT64(left_sc_biguint12,EXPECTED) \ 75 GET_UINT64(left_sc_int12,EXPECTED) \ 76 GET_UINT64(left_sc_uint12,EXPECTED) \ 77 GET_UINT64(left_sc_int12[1], ((EXPECTED>>1)&1)) \ 78 GET_UINT64(left_sc_uint12[1], ((EXPECTED>>1)&1)) \ 79 GET_UINT64(left_sc_int12(7,2), ((EXPECTED>>2)&0x3f)) \ 80 GET_UINT64(left_sc_uint12(7,2),((EXPECTED>>2)&0x3f)) \ 81} 82 83#define LENGTH(LEFT,WIDTH) \ 84{ \ 85 int width = LEFT.concat_length(0); \ 86 if ( width != (WIDTH) ) \ 87 cout << __FILE__ << "(" << __LINE__ << ") : " \ 88 << #LEFT << ".concat_length() expected " << (WIDTH) \ 89 << " got " << width << endl; \ 90} 91 92#define LENGTHS(WIDTH) \ 93{ \ 94 LENGTH(left_sc_bigint12,WIDTH) \ 95 LENGTH(left_sc_biguint12,WIDTH) \ 96 LENGTH(left_sc_int12,WIDTH) \ 97 LENGTH(left_sc_uint12,WIDTH) \ 98} 99 100#define SET(LEFT,RIGHT,VALUE,OFFSET,EXPECTED) \ 101{ \ 102 LEFT.concat_set(RIGHT,OFFSET); \ 103 wait(); \ 104 uint64 actual = LEFT.concat_get_uint64(); \ 105 if ( actual != (EXPECTED) ) \ 106 cout << #LEFT << ".const_set_uint64(" << #RIGHT <<", " << VALUE << ") \ 107 << expected " << (EXPECTED) << " got " << actual << endl; \ 108} 109 110#define SET_SIGNED(VALUE,OFFSET,EXPECTED) \ 111{ \ 112 right_sc_bigint32 = VALUE; \ 113 SET(left_sc_bigint12,right_sc_bigint32,VALUE,OFFSET,EXPECTED); \ 114 SET(left_sc_biguint12,right_sc_bigint32,VALUE,OFFSET,EXPECTED); \ 115 SET(left_sc_int12,right_sc_bigint32,VALUE,OFFSET,EXPECTED); \ 116 SET(left_sc_uint12,right_sc_bigint32,VALUE,OFFSET,EXPECTED); \ 117} 118 119#define SET_S64(VALUE,OFFSET,EXPECTED) \ 120{ \ 121 right_s64 = VALUE; \ 122 SET(left_sc_bigint12,right_s64,VALUE,OFFSET,EXPECTED); \ 123 SET(left_sc_biguint12,right_s64,VALUE,OFFSET,EXPECTED); \ 124 SET(left_sc_int12,right_s64,VALUE,OFFSET,EXPECTED); \ 125 SET(left_sc_uint12,right_s64,VALUE,OFFSET,EXPECTED); \ 126} 127 128#define SET_UNSIGNED(VALUE,OFFSET,EXPECTED) \ 129{ \ 130 right_sc_biguint32 = VALUE; \ 131 SET(left_sc_bigint12,right_sc_biguint32,VALUE,OFFSET,EXPECTED); \ 132 SET(left_sc_biguint12,right_sc_biguint32,VALUE,OFFSET,EXPECTED); \ 133 SET(left_sc_int12,right_sc_biguint32,VALUE,OFFSET,EXPECTED); \ 134 SET(left_sc_uint12,right_sc_biguint32,VALUE,OFFSET,EXPECTED); \ 135} 136 137#define SET_U64(VALUE,OFFSET,EXPECTED) \ 138{ \ 139 right_u64 = VALUE; \ 140 SET(left_sc_bigint12,right_u64,VALUE,OFFSET,EXPECTED); \ 141 SET(left_sc_biguint12,right_u64,VALUE,OFFSET,EXPECTED); \ 142 SET(left_sc_int12,right_u64,VALUE,OFFSET,EXPECTED); \ 143 SET(left_sc_uint12,right_u64,VALUE,OFFSET,EXPECTED); \ 144} 145 146#define SETS(VALUE,OFFSET,EXPECTED) \ 147 SET_S64(VALUE,OFFSET,EXPECTED) \ 148 SET_SIGNED(VALUE,OFFSET,EXPECTED) \ 149 SET_UNSIGNED(VALUE,OFFSET,EXPECTED) \ 150 SET_U64(VALUE,OFFSET,EXPECTED) 151 152SC_MODULE(X) 153{ 154 SC_CTOR(X) 155 { 156 SC_CTHREAD(sync, clk.pos()); 157 } 158 void sync() 159 { 160 // for (;; ) 161 { 162 LENGTHS(12); 163 SETS(0x87654321,0,0x321); 164 SETS(0x87654321,4,0x432); 165 GET_UINT64S(0x432); 166 GET_UNSIGNEDS(0,0x432); 167 GET_UNSIGNEDS(4,0x432); 168 } 169 } 170 171 sc_in_clk clk; 172 sc_int<12> left_sc_int12; 173 sc_bigint<12> left_sc_bigint12; 174 sc_biguint<12> left_sc_biguint12; 175 sc_uint<12> left_sc_uint12; 176 177 sc_int<32> right_sc_int32; 178 sc_bigint<32> right_sc_bigint32; 179 sc_biguint<32> right_sc_biguint32; 180 sc_uint<32> right_sc_uint32; 181 int right_si; 182 long right_sl; 183 int64 right_s64; 184 unsigned int right_ui; 185 unsigned long right_ul; 186 uint64 right_u64; 187}; 188 189int sc_main( int argc, char* argv[] ) 190{ 191 sc_clock clock; 192 X x("x"); 193 x.clk(clock); 194 sc_start(1000, SC_NS); 195 196 cout << "Program completed\n"; 197 return 0; 198} 199