test02.cpp revision 12855:588919e0e4aa
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	cerr << "Program completed\n";
197	return 0;
198}
199