gem5  v20.1.0.0
tb.h
Go to the documentation of this file.
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  tb.h --
23 
24  Original Author: Martin Janssen, Synopsys, Inc., 2002-02-15
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 "common.h"
39 
41 {
43 
44  sc_in_clk clk;
45 
46  sc_out<bool> reset;
47  sc_out<bool> x_ok;
48  sc_out<bool> y_ok;
49  sc_in<bool> data_ready;
50  sc_in<bool> select_xy;
51  sc_in<bool_vector> coord_xy;
52 
53  void entry();
54 
55  testbench( sc_module_name name_,
56  const sc_clock& clk_,
57  sc_signal<bool>& reset_,
58  sc_signal<bool>& x_ok_,
59  sc_signal<bool>& y_ok_,
60  const sc_signal<bool>& data_ready_,
61  const sc_signal<bool>& select_xy_,
62  const signal_bool_vector& coord_xy_ )
63  : sc_module( name_ )
64  {
65  clk( clk_ );
66  reset( reset_ );
67  x_ok( x_ok_ );
68  y_ok( y_ok_ );
69  data_ready( data_ready_ );
70  select_xy( select_xy_ );
71  coord_xy( coord_xy_ );
72  SC_CTHREAD( entry, clk.neg() );
73  }
74 };
75 
76 sc_bv<16> mem[17];
77 
78 void
79 testbench::entry()
80 {
81  bool_vector x_coord;
82  bool_vector y_coord;
83  int x_flag = 0;
84  int y_flag = 0;
85  int i; // Counter variable
86  int x = 0; // Memory location of x_coord
87  int y = 1; // Memory location of y_coord
88 
89  // reset initialization
90 
91  reset.write(1);
92  x_ok.write(0);
93  y_ok.write(0);
94  wait();
95  reset.write(0);
96  wait();
97 
98  // fill display memory with zeros
99 
100  for (i = 1; i < 17; i++)
101  mem[i] = 0;
102 
103  // capture of (x,y) coordinates
104 
105  while(true) {
106 
107  // wait for new x or y coordinate to be calculated
108 
109  do { wait(); } while (data_ready == 0);
110 
111  // capture x coordinate
112 
113  if(select_xy.read() == 0) {
114  x_coord = coord_xy.read();
115  x_flag = x_flag + 1;
116  x_ok.write(1);
117  }
118 
119  // capture y coordinate
120 
121  if(select_xy.read() == 1) {
122  y_coord = coord_xy.read();
123  y_flag = y_flag + 1;
124  y_ok.write(1);
125  }
126 
127  wait();
128  x_ok.write(0);
129  y_ok.write(0);
130 
131  // debug display of coordinate sets
132  /*
133  if (x_flag == y_flag) {
134  cout << " Coordinate Set #" << x_flag
135  << " X = " << x_coord.to_int()
136  << " Y = " << y_coord.to_int()
137  << endl;
138  }
139  */
140 
141  // conversion of x coordinate values to memory column locations
142 
143  if (x_coord.to_int() == -8) x = 15;
144  if (x_coord.to_int() == -7) x = 14;
145  if (x_coord.to_int() == -6) x = 13;
146  if (x_coord.to_int() == -5) x = 12;
147  if (x_coord.to_int() == -4) x = 11;
148  if (x_coord.to_int() == -3) x = 10;
149  if (x_coord.to_int() == -2) x = 9;
150  if (x_coord.to_int() == -1) x = 8;
151  if (x_coord.to_int() == 0) x = 7;
152  if (x_coord.to_int() == 1) x = 6;
153  if (x_coord.to_int() == 2) x = 5;
154  if (x_coord.to_int() == 3) x = 4;
155  if (x_coord.to_int() == 4) x = 3;
156  if (x_coord.to_int() == 5) x = 2;
157  if (x_coord.to_int() == 6) x = 1;
158  if (x_coord.to_int() == 7) x = 0;
159 
160  // conversion of y coordinate values to memory row locations
161 
162  if (y_coord.to_int() == -8) y = 16;
163  if (y_coord.to_int() == -7) y = 15;
164  if (y_coord.to_int() == -6) y = 14;
165  if (y_coord.to_int() == -5) y = 13;
166  if (y_coord.to_int() == -4) y = 12;
167  if (y_coord.to_int() == -3) y = 11;
168  if (y_coord.to_int() == -2) y = 10;
169  if (y_coord.to_int() == -1) y = 9;
170  if (y_coord.to_int() == 0) y = 8;
171  if (y_coord.to_int() == 1) y = 7;
172  if (y_coord.to_int() == 2) y = 6;
173  if (y_coord.to_int() == 3) y = 5;
174  if (y_coord.to_int() == 4) y = 4;
175  if (y_coord.to_int() == 5) y = 3;
176  if (y_coord.to_int() == 6) y = 2;
177  if (y_coord.to_int() == 7) y = 1;
178 
179  // turn bit high in memory for calculated coordinate
180 
181  mem[y][x] = 1;
182 
183  // stop simulation after 100 coordinates
184 
185  if (y_flag == 100) break;
186 
187  } // End of while loop
188 
189  cout << "\n\t FINAL MEMORY VALUES" << endl;
190 
191  for (i = 1; i < 17; i++)
192  cout << "Memory Location " << i
193  << " : \t" << mem[i] << endl;
194 
195  sc_stop();
196 }
testbench::reset
sc_signal< bool > reset
Definition: tb.h:83
ArmISA::i
Bitfield< 7 > i
Definition: miscregs_types.hh:63
testbench
Definition: tb.h:50
Stats::reset
void reset()
Definition: statistics.cc:569
sc_core::sc_stop
void sc_stop()
Definition: sc_main.cc:104
mem
sc_bv< 16 > mem[17]
Definition: tb.h:74
bool_vector
sc_bv< 16 > bool_vector
Definition: common.h:43
RiscvISA::x
Bitfield< 3 > x
Definition: pagetable.hh:69
sc_core::sc_in_clk
sc_in< bool > sc_in_clk
Definition: sc_clock.hh:116
signal_bool_vector
sc_signal< bool_vector > signal_bool_vector
Definition: common.h:44
SC_MODULE
SC_MODULE(tb)
Definition: tb.h:44
sc_core::wait
void wait()
Definition: sc_module.cc:653
SC_HAS_PROCESS
#define SC_HAS_PROCESS(name)
Definition: sc_module.hh:297
sc_gem5::ScSignalBaseT::write
virtual void write(const T &t)
Definition: sc_signal.hh:189
SC_CTHREAD
#define SC_CTHREAD(name, clk)
Definition: sc_module.hh:319
common.h

Generated on Wed Sep 30 2020 14:02:17 for gem5 by doxygen 1.8.17