1
|
-- written by Alban Bourge @ TIMA
|
2
|
library ieee;
|
3
|
use ieee.std_logic_1164.all;
|
4
|
use ieee.numeric_std.all;
|
5
|
library work;
|
6
|
use work.pkg_tb.all;
|
7
|
|
8
|
entity cp3_test is
|
9
|
port(
|
10
|
clock : in std_logic;
|
11
|
reset : in std_logic;
|
12
|
n_error : out std_logic;
|
13
|
stopped : out std_logic
|
14
|
);
|
15
|
end cp3_test;
|
16
|
|
17
|
architecture rtl of cp3_test is
|
18
|
|
19
|
--TOP signals
|
20
|
signal reset_top : std_logic := '0';
|
21
|
signal stdin_data : stdin_vector;
|
22
|
signal stdin_rdy : std_logic;
|
23
|
signal stdin_ack : std_logic;
|
24
|
signal stdout_data : stdout_vector;
|
25
|
signal stdout_rdy : std_logic;
|
26
|
signal stdout_ack : std_logic;
|
27
|
--ASSERT_UNIT signals
|
28
|
signal context_uut : context_t;
|
29
|
signal en_feed : std_logic;
|
30
|
signal en_check : std_logic;
|
31
|
signal n_error_s : std_logic;
|
32
|
signal vecs_found : std_logic;
|
33
|
signal vec_read : std_logic;
|
34
|
--PROG unit signals
|
35
|
signal instr_next : instruction;
|
36
|
-- FSM unit signals
|
37
|
signal step : std_logic;
|
38
|
signal start : std_logic;
|
39
|
-- FSM signals
|
40
|
signal reset_fsm : std_logic;
|
41
|
signal stopped_s : std_logic;
|
42
|
|
43
|
|
44
|
--------------------------------------
|
45
|
-- PART OF ARCHITECTURE WITH CP3 --
|
46
|
|
47
|
--TOP signals
|
48
|
signal cp_en : std_logic := '0';
|
49
|
signal cp_rest : std_logic := '0';
|
50
|
signal cp_ok : std_logic;
|
51
|
signal cp_din : cp_vector := (others => '0');
|
52
|
signal cp_dout : cp_vector;
|
53
|
--RAM signals
|
54
|
signal ram_1 : ram_instruction;
|
55
|
signal ram_2 : ram_instruction;
|
56
|
signal address1 : std_logic_vector(12 downto 0) := (others => '0');
|
57
|
signal address2 : std_logic_vector(12 downto 0) := (others => '0');
|
58
|
signal datain : cp_vector := (others => '0');
|
59
|
signal dout1 : cp_vector;
|
60
|
signal dout2 : cp_vector;
|
61
|
|
62
|
--dut component declaration
|
63
|
component top is
|
64
|
port (
|
65
|
clock : in std_logic;
|
66
|
reset : in std_logic;
|
67
|
start : in std_logic;
|
68
|
stdin_data : in stdin_vector;
|
69
|
stdin_rdy : out std_logic;
|
70
|
stdin_ack : in std_logic;
|
71
|
stdout_data : out stdout_vector;
|
72
|
stdout_rdy : out std_logic;
|
73
|
stdout_ack : in std_logic;
|
74
|
cp_en : in std_logic;
|
75
|
cp_rest : in std_logic;
|
76
|
cp_din : in cp_vector;
|
77
|
cp_dout : out cp_vector;
|
78
|
cp_ok : out std_logic
|
79
|
);
|
80
|
end component top;
|
81
|
|
82
|
begin
|
83
|
|
84
|
uut : entity work.top(augh)
|
85
|
port map(
|
86
|
clock => clock,
|
87
|
reset => reset_top,
|
88
|
start => start,
|
89
|
stdin_data => stdin_data,
|
90
|
stdin_rdy => stdin_rdy,
|
91
|
stdin_ack => stdin_ack,
|
92
|
cp_en => cp_en,
|
93
|
cp_rest => cp_rest,
|
94
|
cp_ok => cp_ok,
|
95
|
cp_din => cp_din,
|
96
|
cp_dout => cp_dout,
|
97
|
stdout_data => stdout_data,
|
98
|
stdout_rdy => stdout_rdy,
|
99
|
stdout_ack => stdout_ack
|
100
|
);
|
101
|
|
102
|
ram1 : entity work.sync_ram(rtl)
|
103
|
port map(
|
104
|
clock => clock,
|
105
|
we => ram_1.we,
|
106
|
address => address1,
|
107
|
datain => datain,
|
108
|
dataout => dout1
|
109
|
);
|
110
|
|
111
|
ram2 : entity work.sync_ram(rtl)
|
112
|
port map(
|
113
|
clock => clock,
|
114
|
we => ram_2.we,
|
115
|
address => address2,
|
116
|
datain => datain,
|
117
|
dataout => dout2
|
118
|
);
|
119
|
|
120
|
fsm_unit : entity work.fsm(rtl)
|
121
|
port map(
|
122
|
clock => clock,
|
123
|
reset => reset,
|
124
|
--prog interface
|
125
|
instr_next => instr_next,
|
126
|
step => step,
|
127
|
--uut interface
|
128
|
cp_ok => cp_ok,
|
129
|
stdin_rdy => stdin_rdy,
|
130
|
stdin_ack => stdin_ack,
|
131
|
reset_fsm => reset_fsm,
|
132
|
start => start,
|
133
|
cp_en => cp_en,
|
134
|
cp_rest => cp_rest,
|
135
|
--ram interface
|
136
|
ram_1 => ram_1,
|
137
|
ram_2 => ram_2,
|
138
|
--assert_uut interface
|
139
|
context_uut => context_uut,
|
140
|
en_feed => en_feed,
|
141
|
en_check => en_check,
|
142
|
vecs_found => vecs_found,
|
143
|
vec_read => vec_read,
|
144
|
--tb interface
|
145
|
stopped => stopped_s
|
146
|
);
|
147
|
|
148
|
--RAM ADDRESS controller 1
|
149
|
ram_ctrl1 : process(clock, reset)
|
150
|
begin
|
151
|
if (reset = '1') then
|
152
|
address1 <= (others => '0');
|
153
|
elsif rising_edge(clock) then
|
154
|
if (ram_1.addr_z = '1') then
|
155
|
address1 <= (others => '0');
|
156
|
elsif (ram_1.addr_up = '1') then
|
157
|
address1 <= std_logic_vector(unsigned(address1) + 1);
|
158
|
end if;
|
159
|
end if;
|
160
|
end process ram_ctrl1;
|
161
|
|
162
|
--RAM ADDRESS controller 2
|
163
|
ram_ctrl2 : process(clock, reset)
|
164
|
begin
|
165
|
if (reset = '1') then
|
166
|
address2 <= (others => '0');
|
167
|
elsif rising_edge(clock) then
|
168
|
if (ram_2.addr_z = '1') then
|
169
|
address2 <= (others => '0');
|
170
|
elsif (ram_2.addr_up = '1') then
|
171
|
address2 <= std_logic_vector(unsigned(address2) + 1);
|
172
|
end if;
|
173
|
end if;
|
174
|
end process ram_ctrl2;
|
175
|
|
176
|
--other comb signals
|
177
|
datain <= cp_dout;
|
178
|
cp_din <= dout2 when ram_2.sel = '1' else dout1;
|
179
|
|
180
|
-- END OF ARCHITECTURE WITH CP3 --
|
181
|
--------------------------------------
|
182
|
|
183
|
--------------------------------------
|
184
|
-- PART OF ARCHITECTURE WITHOUT CP3 --
|
185
|
--
|
186
|
-- --dut component declaration
|
187
|
-- component top is
|
188
|
-- port (
|
189
|
-- clock : in std_logic;
|
190
|
-- reset : in std_logic;
|
191
|
-- start : in std_logic;
|
192
|
-- stdin_data : in stdin_vector;
|
193
|
-- stdin_rdy : out std_logic;
|
194
|
-- stdin_ack : in std_logic;
|
195
|
-- stdout_data : out stdout_vector;
|
196
|
-- stdout_rdy : out std_logic;
|
197
|
-- stdout_ack : in std_logic
|
198
|
-- );
|
199
|
-- end component top;
|
200
|
--
|
201
|
--begin
|
202
|
--
|
203
|
-- uut : entity work.top(augh)
|
204
|
-- port map(
|
205
|
-- clock => clock,
|
206
|
-- reset => reset_top,
|
207
|
-- start => start,
|
208
|
-- stdin_data => stdin_data,
|
209
|
-- stdin_rdy => stdin_rdy,
|
210
|
-- stdin_ack => stdin_ack,
|
211
|
-- stdout_data => stdout_data,
|
212
|
-- stdout_rdy => stdout_rdy,
|
213
|
-- stdout_ack => stdout_ack
|
214
|
-- );
|
215
|
--
|
216
|
-- fsm_unit : entity work.fsm(rtl)
|
217
|
-- port map(
|
218
|
-- clock => clock,
|
219
|
-- reset => reset,
|
220
|
-- --prog interface
|
221
|
-- instr_next => instr_next,
|
222
|
-- step => step,
|
223
|
-- --uut interface
|
224
|
-- cp_ok => '0',
|
225
|
-- stdin_rdy => stdin_rdy,
|
226
|
-- stdin_ack => stdin_ack,
|
227
|
-- reset_fsm => reset_fsm,
|
228
|
-- start => start,
|
229
|
-- cp_en => open,
|
230
|
-- cp_rest => open,
|
231
|
-- --ram interface
|
232
|
-- ram_1 => open,
|
233
|
-- ram_2 => open,
|
234
|
-- --assert_uut interface
|
235
|
-- context_uut => context_uut,
|
236
|
-- en_feed => en_feed,
|
237
|
-- en_check => en_check,
|
238
|
-- vecs_found => vecs_found,
|
239
|
-- vec_read => vec_read,
|
240
|
-- --tb interface
|
241
|
-- stopped => stopped_s
|
242
|
-- );
|
243
|
--
|
244
|
-- END OF ARCHITECTURE WITHOUT CP3 --
|
245
|
--------------------------------------
|
246
|
|
247
|
assert_unit : entity work.assert_uut(rtl)
|
248
|
port map(
|
249
|
clock => clock,
|
250
|
reset => reset,
|
251
|
context_uut => context_uut,
|
252
|
en_feed => en_feed,
|
253
|
stdin_rdy => stdin_rdy,
|
254
|
stdin_ack => stdin_ack,
|
255
|
stdin_data => stdin_data,
|
256
|
en_check => en_check,
|
257
|
stdout_rdy => stdout_rdy,
|
258
|
stdout_ack => stdout_ack,
|
259
|
stdout_data => stdout_data,
|
260
|
vecs_found => vecs_found,
|
261
|
vec_read => vec_read,
|
262
|
n_error => n_error_s
|
263
|
);
|
264
|
|
265
|
prog_unit : entity work.prog(rtl)
|
266
|
port map(
|
267
|
clock => clock,
|
268
|
reset => reset,
|
269
|
step => step,
|
270
|
instr_next => instr_next
|
271
|
);
|
272
|
|
273
|
--other comb signals
|
274
|
reset_top <= reset or reset_fsm;
|
275
|
|
276
|
--outputs
|
277
|
n_error <= n_error_s;
|
278
|
stopped <= stopped_s;
|
279
|
|
280
|
end rtl;
|