22-- License, v. 2.0. If a copy of the MPL was not distributed with this file,
33-- You can obtain one at http://mozilla.org/MPL/2.0/.
44--
5- -- Copyright (c) 2014-2019, Lars Asplund lars.anders.asplund@gmail.com
5+ -- Copyright (c) 2014-2018, Lars Asplund lars.anders.asplund@gmail.com
6+
7+ -- Stream master & slave verification components
68
79library ieee;
810use ieee.std_logic_1164.all ;
911
1012context work.vunit_context;
1113context work.com_context;
14+ use work.sync_pkg.all ;
1215
1316package body stream_pkg is
14-
1517 impure function new_stream_master return stream_master_t is
1618 begin
1719 return (p_actor => new_actor);
@@ -22,18 +24,37 @@ package body stream_pkg is
2224 return (p_actor => new_actor);
2325 end ;
2426
27+ procedure push(msg : msg_t; transaction : stream_transaction_t) is
28+ begin
29+ push_std_ulogic_vector(msg, transaction.data);
30+ push_boolean(msg, transaction.last);
31+ end ;
32+
33+ impure function pop(msg : msg_t) return stream_transaction_t is
34+ begin
35+ return (data => pop_std_ulogic_vector(msg), last => pop_boolean(msg));
36+ end ;
37+
2538 procedure push_stream(signal net : inout network_t;
2639 stream : stream_master_t;
27- data : std_logic_vector ;
28- last : boolean := false ) is
40+ transaction : stream_transaction_t) is
2941 variable msg : msg_t := new_msg(stream_push_msg);
30- constant normalized_data : std_logic_vector (data'length - 1 downto 0 ) := data;
3142 begin
32- push_std_ulogic_vector(msg, normalized_data);
33- push_boolean(msg, last);
43+ push_stream_transaction(msg, transaction);
3444 send(net, stream.p_actor, msg);
3545 end ;
3646
47+ procedure push_stream(signal net : inout network_t;
48+ stream : stream_master_t;
49+ data : std_logic_vector ;
50+ last : boolean := false ) is
51+ variable transaction : stream_transaction_t(data(data'range ));
52+ begin
53+ transaction.data := data;
54+ transaction.last := last;
55+ push_stream(net, stream, transaction);
56+ end ;
57+
3758 procedure pop_stream(signal net : inout network_t;
3859 stream : stream_slave_t;
3960 variable reference : inout stream_reference_t) is
@@ -44,26 +65,42 @@ package body stream_pkg is
4465
4566 procedure await_pop_stream_reply(signal net : inout network_t;
4667 variable reference : inout stream_reference_t;
47- variable data : out std_logic_vector ;
48- variable last : out boolean ) is
68+ variable transaction : out stream_transaction_t) is
4969 variable reply_msg : msg_t;
5070 begin
5171 receive_reply(net, reference, reply_msg);
52- data := pop_std_ulogic_vector(reply_msg);
53- last := pop_boolean(reply_msg);
72+ transaction := pop_stream_transaction(reply_msg);
5473 delete(reference);
5574 delete(reply_msg);
5675 end ;
5776
77+ procedure await_pop_stream_reply(signal net : inout network_t;
78+ variable reference : inout stream_reference_t;
79+ variable data : out std_logic_vector ;
80+ variable last : out boolean ) is
81+ variable transaction : stream_transaction_t(data(data'range ));
82+ begin
83+ await_pop_stream_reply(net, reference, transaction);
84+ data := transaction.data;
85+ last := transaction.last;
86+ end ;
87+
5888 procedure await_pop_stream_reply(signal net : inout network_t;
5989 variable reference : inout stream_reference_t;
6090 variable data : out std_logic_vector ) is
61- variable reply_msg : msg_t ;
91+ variable transaction : stream_transaction_t(data(data 'range )) ;
6292 begin
63- receive_reply(net, reference, reply_msg);
64- data := pop_std_ulogic_vector(reply_msg);
65- delete(reference);
66- delete(reply_msg);
93+ await_pop_stream_reply(net, reference, transaction);
94+ data := transaction.data;
95+ end ;
96+
97+ procedure pop_stream(signal net : inout network_t;
98+ stream : stream_slave_t;
99+ variable transaction : out stream_transaction_t) is
100+ variable reference : stream_reference_t;
101+ begin
102+ pop_stream(net, stream, reference);
103+ await_pop_stream_reply(net, reference, transaction);
67104 end ;
68105
69106 procedure pop_stream(signal net : inout network_t;
@@ -87,16 +124,153 @@ package body stream_pkg is
87124
88125 procedure check_stream(signal net : inout network_t;
89126 stream : stream_slave_t;
90- expected : std_logic_vector ;
91- last : boolean := false ;
127+ expected : stream_transaction_t;
92128 msg : string := " " ) is
93- variable got_data : std_logic_vector (expected'range );
94- variable got_last : boolean ;
129+ variable got : stream_transaction_t(data(expected.data'range ));
95130 begin
96- pop_stream(net, stream, got_data, got_last);
97- check_equal(got_data, expected, msg);
98- check_equal(got_last, last, msg);
131+ pop_stream(net, stream, got);
132+ check_equal(got.data, expected.data, msg);
133+ check_equal(got.last, expected.last, msg);
134+ end ;
135+
136+ procedure check_stream(signal net : inout network_t;
137+ stream : stream_slave_t;
138+ expected_data : std_logic_vector ;
139+ expected_last : boolean := false ;
140+ msg : string := " " ) is
141+ variable expected : stream_transaction_t(data(expected_data'range ));
142+ begin
143+ expected.data := expected_data;
144+ expected.last := expected_last;
145+ check_stream(net, stream, expected, msg);
146+ end ;
147+
148+ procedure wait_until_idle(signal net : inout network_t;
149+ stream : stream_master_t) is
150+ begin
151+ wait_until_idle(net, stream.p_actor);
99152 end procedure ;
100153
154+ procedure wait_until_idle(signal net : inout network_t;
155+ stream : stream_slave_t) is
156+ begin
157+ wait_until_idle(net, stream.p_actor);
158+ end procedure ;
159+
160+ procedure wait_for_time(signal net : inout network_t;
161+ stream : stream_master_t;
162+ delay : delay_length ) is
163+ begin
164+ wait_for_time(net, stream.p_actor, delay);
165+ end procedure ;
166+
167+ procedure wait_for_time(signal net : inout network_t;
168+ stream : stream_slave_t;
169+ delay : delay_length ) is
170+ begin
171+ wait_for_time(net, stream.p_actor, delay);
172+ end procedure ;
173+
174+ procedure receive(signal net : inout network_t;
175+ stream : stream_master_t;
176+ variable msg : out msg_t) is
177+ begin
178+ receive(net, stream.p_actor, msg);
179+ end procedure ;
180+
181+ procedure receive(signal net : inout network_t;
182+ stream : stream_slave_t;
183+ variable msg : out msg_t) is
184+ begin
185+ receive(net, stream.p_actor, msg);
186+ end procedure ;
187+
188+ procedure receive_stream(signal net : inout network_t;
189+ stream : stream_master_t;
190+ variable transaction : out stream_transaction_t) is
191+ variable msg : msg_t;
192+ variable msg_type : msg_type_t;
193+ begin
194+ loop
195+ receive(net, stream, msg);
196+ msg_type := message_type(msg);
197+ handle_sync_message(net, msg_type, msg);
198+ if msg_type = stream_push_msg then
199+ transaction := pop_stream_transaction(msg);
200+ delete(msg);
201+ exit ;
202+ else
203+ unexpected_msg_type(msg_type);
204+ end if ;
205+ end loop ;
206+ end ;
207+
208+ procedure receive_stream(signal net : inout network_t;
209+ stream : stream_master_t;
210+ variable data : out std_ulogic_vector ;
211+ variable last : out boolean ) is
212+ variable transaction : stream_transaction_t(data(data'range ));
213+ begin
214+ receive_stream(net, stream, transaction);
215+ data := transaction.data;
216+ last := transaction.last;
217+ end ;
218+
219+ procedure receive_stream(signal net : inout network_t;
220+ stream : stream_master_t;
221+ variable data : out std_ulogic_vector ) is
222+ variable transaction : stream_transaction_t(data(data'range ));
223+ begin
224+ receive_stream(net, stream, transaction);
225+ data := transaction.data;
226+ end ;
227+
228+ procedure receive_stream(signal net : inout network_t;
229+ stream : stream_slave_t;
230+ variable msg : out msg_t) is
231+ variable msg_type : msg_type_t;
232+ begin
233+ loop
234+ receive(net, stream, msg);
235+ msg_type := message_type(msg);
236+ handle_sync_message(net, msg_type, msg);
237+ if msg_type = stream_pop_msg then
238+ exit ;
239+ else
240+ unexpected_msg_type(msg_type);
241+ end if ;
242+ end loop ;
243+ end ;
244+
245+ procedure reply_stream(signal net : inout network_t;
246+ variable msg : inout msg_t;
247+ transaction : stream_transaction_t) is
248+ variable reply_msg : msg_t;
249+ begin
250+ push_stream_transaction(msg, transaction);
251+ reply(net, msg, reply_msg);
252+ delete(reply_msg);
253+ end ;
254+
255+ procedure reply_stream(signal net : inout network_t;
256+ variable msg : inout msg_t;
257+ data : std_ulogic_vector ;
258+ last : boolean ) is
259+ variable transaction : stream_transaction_t(data(data'range ));
260+ begin
261+ transaction.data := data;
262+ transaction.last := last;
263+ reply_stream(net, msg, transaction);
264+ end ;
265+
266+ procedure reply_stream(signal net : inout network_t;
267+ variable msg : inout msg_t;
268+ data : std_ulogic_vector ) is
269+ variable transaction : stream_transaction_t(data(data'range ));
270+ begin
271+ transaction.data := data;
272+ reply_stream(net, msg, transaction);
273+ end ;
274+
101275end package body ;
102276
0 commit comments