OpenCores
URL https://opencores.org/ocsvn/rio/rio/trunk

Subversion Repositories rio

[/] [rio/] [branches/] [2.0.0-development/] [bench/] [vhdl/] [TestRioSerial.vhd] - Blame information for rev 51

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 4 magro732
-------------------------------------------------------------------------------
2
-- 
3
-- RapidIO IP Library Core
4
-- 
5
-- This file is part of the RapidIO IP library project
6
-- http://www.opencores.org/cores/rio/
7
-- 
8
-- Description
9
-- Contains automatic simulation test code to verify a RioSerial implementation.
10
-- 
11
-- To Do:
12 48 magro732
-- - Replace TestSwitchPort with generic TestPortPacketBuffer from common library.
13
-- - Move TestSymbolPort to generic library.
14 4 magro732
-- 
15
-- Author(s): 
16
-- - Magnus Rosenius, magro732@opencores.org 
17
-- 
18
-------------------------------------------------------------------------------
19
-- 
20
-- Copyright (C) 2013 Authors and OPENCORES.ORG 
21
-- 
22
-- This source file may be used and distributed without 
23
-- restriction provided that this copyright statement is not 
24
-- removed from the file and that any derivative work contains 
25
-- the original copyright notice and the associated disclaimer. 
26
-- 
27
-- This source file is free software; you can redistribute it 
28
-- and/or modify it under the terms of the GNU Lesser General 
29
-- Public License as published by the Free Software Foundation; 
30
-- either version 2.1 of the License, or (at your option) any 
31
-- later version. 
32
-- 
33
-- This source is distributed in the hope that it will be 
34
-- useful, but WITHOUT ANY WARRANTY; without even the implied 
35
-- warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
36
-- PURPOSE. See the GNU Lesser General Public License for more 
37
-- details. 
38
-- 
39
-- You should have received a copy of the GNU Lesser General 
40
-- Public License along with this source; if not, download it 
41
-- from http://www.opencores.org/lgpl.shtml 
42
-- 
43
-------------------------------------------------------------------------------
44 40 magro732
-- REMARK: Add testcase to check that no packets are sent when the linkpartner
45
-- has no buffers left.
46 4 magro732
 
47
 
48
-------------------------------------------------------------------------------
49 40 magro732
-- 
50
-------------------------------------------------------------------------------
51
library ieee;
52
use ieee.std_logic_1164.all;
53
use work.rio_common.all;
54 51 magro732
use work.TestPortPackage.all;
55 40 magro732
 
56
package TestRioSerialPackage is
57
  type MessageSymbol is record
58
    symbolType : std_logic_vector(1 downto 0);
59
    symbolContent : std_logic_vector(31 downto 0);
60
    ignoreIdle : boolean;
61
  end record;
62
  type MessageFrame is record
63
    frame : RioFrame;
64
    willAbort : boolean;
65
  end record;
66
end package;
67
 
68
package body TestRioSerialPackage is
69
 
70
end package body;
71
 
72
 
73
 
74
-------------------------------------------------------------------------------
75 4 magro732
-- TestRioSerial.
76
-------------------------------------------------------------------------------
77
 
78
library ieee;
79
use ieee.std_logic_1164.all;
80
use ieee.numeric_std.all;
81
library std;
82
use std.textio.all;
83
use work.rio_common.all;
84 40 magro732
use work.TestRioSerialPackage.all;
85 48 magro732
use work.TestPortPackage.all;
86 4 magro732
 
87
 
88
-------------------------------------------------------------------------------
89
-- Entity for TestRioSerial.
90
-------------------------------------------------------------------------------
91
entity TestRioSerial is
92
end entity;
93
 
94
 
95
-------------------------------------------------------------------------------
96
-- Architecture for TestUart.
97
-------------------------------------------------------------------------------
98
architecture TestRioSerialImpl of TestRioSerial is
99
 
100
  component TestSwitchPort is
101
    port(
102
      clk : in std_logic;
103
      areset_n : in std_logic;
104
 
105 40 magro732
      outboundWriteEmpty_o : out std_logic;
106
      outboundWrite_i : in std_logic;
107
      outboundWriteMessage_i : in MessageFrame;
108
      outboundWriteAck_o : out std_logic;
109 4 magro732
 
110 40 magro732
      inboundWriteEmpty_o : out std_logic;
111
      inboundWrite_i : in std_logic;
112
      inboundWriteMessage_i : in MessageFrame;
113
      inboundWriteAck_o : out std_logic;
114
 
115 4 magro732
      readFrameEmpty_o : out std_logic;
116
      readFrame_i : in std_logic;
117
      readFrameRestart_i : in std_logic;
118
      readFrameAborted_o : out std_logic;
119
 
120
      readWindowEmpty_o : out std_logic;
121
      readWindowReset_i : in std_logic;
122
      readWindowNext_i : in std_logic;
123
 
124
      readContentEmpty_o : out std_logic;
125
      readContent_i : in std_logic;
126
      readContentEnd_o : out std_logic;
127 18 magro732
      readContentData_o : out std_logic_vector(31 downto 0);
128 4 magro732
 
129
      writeFrame_i : in std_logic;
130
      writeFrameAbort_i : in std_logic;
131
      writeContent_i : in std_logic;
132 18 magro732
      writeContentData_i : in std_logic_vector(31 downto 0));
133 4 magro732
  end component;
134
 
135
  component RioSerial is
136
    generic(
137 37 magro732
      TIMEOUT_WIDTH : natural;
138
      SYMBOL_COUNTER_WIDTH : natural := 8;
139
      TICKS_SEND_STATUS_STARTUP : natural := 15;
140
      TICKS_SEND_STATUS_OPERATIONAL : natural := 255);
141 4 magro732
    port(
142
      clk : in std_logic;
143
      areset_n : in std_logic;
144 37 magro732
      enable : in std_logic;
145 4 magro732
 
146
      portLinkTimeout_i : in std_logic_vector(TIMEOUT_WIDTH-1 downto 0);
147
      linkInitialized_o : out std_logic;
148
      inputPortEnable_i : in std_logic;
149
      outputPortEnable_i : in std_logic;
150 40 magro732
 
151 4 magro732
      localAckIdWrite_i : in std_logic;
152
      clrOutstandingAckId_i : in std_logic;
153
      inboundAckId_i : in std_logic_vector(4 downto 0);
154
      outstandingAckId_i : in std_logic_vector(4 downto 0);
155
      outboundAckId_i : in std_logic_vector(4 downto 0);
156
      inboundAckId_o : out std_logic_vector(4 downto 0);
157
      outstandingAckId_o : out std_logic_vector(4 downto 0);
158
      outboundAckId_o : out std_logic_vector(4 downto 0);
159 40 magro732
 
160 4 magro732
      readFrameEmpty_i : in std_logic;
161
      readFrame_o : out std_logic;
162
      readFrameRestart_o : out std_logic;
163
      readFrameAborted_i : in std_logic;
164
      readWindowEmpty_i : in std_logic;
165
      readWindowReset_o : out std_logic;
166
      readWindowNext_o : out std_logic;
167
      readContentEmpty_i : in std_logic;
168
      readContent_o : out std_logic;
169
      readContentEnd_i : in std_logic;
170 18 magro732
      readContentData_i : in std_logic_vector(31 downto 0);
171 4 magro732
 
172
      writeFrameFull_i : in std_logic;
173
      writeFrame_o : out std_logic;
174
      writeFrameAbort_o : out std_logic;
175
      writeContent_o : out std_logic;
176 18 magro732
      writeContentData_o : out std_logic_vector(31 downto 0);
177 4 magro732
 
178
      portInitialized_i : in std_logic;
179 37 magro732
      outboundControlValid_o : out std_logic;
180
      outboundControlSymbol_o : out std_logic_vector(23 downto 0);
181
      outboundDataValid_o : out std_logic;
182
      outboundDataSymbol_o : out std_logic_vector(31 downto 0);
183
      inboundControlValid_i : in std_logic;
184
      inboundControlSymbol_i : in std_logic_vector(23 downto 0);
185
      inboundDataValid_i : in std_logic;
186
      inboundDataSymbol_i : in std_logic_vector(31 downto 0));
187 4 magro732
  end component;
188
 
189 40 magro732
  component TestSymbolPort is
190
    port(
191
      clk : in std_logic;
192
      areset_n : in std_logic;
193
 
194
      portInitialized_i : in std_logic;
195
      outboundControlValid_i : in std_logic;
196
      outboundControlSymbol_i : in std_logic_vector(23 downto 0);
197
      outboundDataValid_i : in std_logic;
198
      outboundDataSymbol_i : in std_logic_vector(31 downto 0);
199
      inboundControlValid_o : out std_logic;
200
      inboundControlSymbol_o : out std_logic_vector(23 downto 0);
201
      inboundDataValid_o : out std_logic;
202
      inboundDataSymbol_o : out std_logic_vector(31 downto 0);
203
 
204
      outboundWriteEmpty_o : out std_logic;
205
      outboundWrite_i : in std_logic;
206
      outboundWriteMessage_i : in MessageSymbol;
207
      outboundWriteAck_o : out std_logic;
208
      inboundWriteEmpty_o : out std_logic;
209
      inboundWrite_i : in std_logic;
210
      inboundWriteMessage_i : in MessageSymbol;
211
      inboundWriteAck_o : out std_logic);
212
  end component;
213
 
214 4 magro732
  signal clk : std_logic;
215
  signal areset_n : std_logic;
216 37 magro732
  signal enable : std_logic;
217 4 magro732
 
218
  signal portLinkTimeout : std_logic_vector(10 downto 0);
219 40 magro732
  signal linkInitialized, linkInitializedExpected : std_logic;
220 4 magro732
  signal inputPortEnable : std_logic;
221
  signal outputPortEnable : std_logic;
222
 
223
  signal localAckIdWrite : std_logic;
224
  signal clrOutstandingAckId : std_logic;
225
  signal inboundAckIdWrite : std_logic_vector(4 downto 0);
226
  signal outstandingAckIdWrite : std_logic_vector(4 downto 0);
227
  signal outboundAckIdWrite : std_logic_vector(4 downto 0);
228
  signal inboundAckIdRead : std_logic_vector(4 downto 0);
229
  signal outstandingAckIdRead : std_logic_vector(4 downto 0);
230
  signal outboundAckIdRead : std_logic_vector(4 downto 0);
231
 
232
  signal readFrameEmpty : std_logic;
233
  signal readFrame : std_logic;
234
  signal readFrameRestart : std_logic;
235
  signal readFrameAborted : std_logic;
236
  signal readWindowEmpty : std_logic;
237
  signal readWindowReset : std_logic;
238
  signal readWindowNext : std_logic;
239
  signal readContentEmpty : std_logic;
240
  signal readContent : std_logic;
241
  signal readContentEnd : std_logic;
242 18 magro732
  signal readContentData : std_logic_vector(31 downto 0);
243 4 magro732
 
244
  signal writeFrame : std_logic;
245
  signal writeFrameAbort : std_logic;
246
  signal writeContent : std_logic;
247 18 magro732
  signal writeContentData : std_logic_vector(31 downto 0);
248 4 magro732
 
249 37 magro732
  signal portInitialized : std_logic;
250
  signal outboundControlValid : std_logic;
251
  signal outboundControlSymbol : std_logic_vector(23 downto 0);
252
  signal outboundDataValid : std_logic;
253
  signal outboundDataSymbol : std_logic_vector(31 downto 0);
254
  signal inboundControlValid : std_logic;
255
  signal inboundControlSymbol : std_logic_vector(23 downto 0);
256
  signal inboundDataValid : std_logic;
257
  signal inboundDataSymbol : std_logic_vector(31 downto 0);
258
 
259 40 magro732
  signal outboundFrameWriteEmpty : std_logic;
260
  signal outboundFrameWrite : std_logic;
261
  signal outboundFrameWriteMessage : MessageFrame;
262
  signal outboundFrameWriteAck : std_logic;
263
  signal inboundFrameWriteEmpty : std_logic;
264
  signal inboundFrameWrite : std_logic;
265
  signal inboundFrameWriteMessage : MessageFrame;
266
  signal inboundFrameWriteAck : std_logic;
267
  signal inboundFrameFull : std_logic;
268 37 magro732
 
269 40 magro732
  signal outboundSymbolWriteEmpty : std_logic;
270
  signal outboundSymbolWrite : std_logic;
271
  signal outboundSymbolWriteMessage : MessageSymbol;
272
  signal outboundSymbolWriteAck : std_logic;
273
  signal inboundSymbolWriteEmpty : std_logic;
274
  signal inboundSymbolWrite : std_logic;
275
  signal inboundSymbolWriteMessage : MessageSymbol;
276
  signal inboundSymbolWriteAck : std_logic;
277 37 magro732
 
278 4 magro732
begin
279
 
280
  -----------------------------------------------------------------------------
281
  -- Clock generation.
282
  -----------------------------------------------------------------------------
283
  ClockGenerator: process
284
  begin
285
    clk <= '0';
286
    wait for 20 ns;
287
    clk <= '1';
288
    wait for 20 ns;
289
  end process;
290
 
291
 
292
  -----------------------------------------------------------------------------
293
  -- Serial protocol test driver.
294
  -----------------------------------------------------------------------------
295
  TestDriver: process
296
 
297
    ---------------------------------------------------------------------------
298 40 magro732
    -- Procedures to receive symbols.
299 4 magro732
    ---------------------------------------------------------------------------
300 40 magro732
    procedure OutboundSymbolIdle is
301 4 magro732
    begin
302 40 magro732
      outboundSymbolWrite <= '1';
303
      outboundSymbolWriteMessage.symbolType <= "00";
304
      outboundSymbolWriteMessage.symbolContent <= (others=>'U');
305
      outboundSymbolWriteMessage.ignoreIdle <= false;
306
      wait until outboundSymbolWriteAck = '1';
307
      outboundSymbolWrite <= '0';
308
      wait until outboundSymbolWriteAck = '0';
309 37 magro732
    end procedure;
310 4 magro732
 
311 40 magro732
    procedure OutboundSymbolControl(constant symbolContent : in std_logic_vector(23 downto 0);
312
                                    constant ignoreIdle : in boolean := false) is
313 37 magro732
    begin
314 40 magro732
      outboundSymbolWrite <= '1';
315
      outboundSymbolWriteMessage.symbolType <= "01";
316
      outboundSymbolWriteMessage.symbolContent <= x"00" & symbolContent;
317
      outboundSymbolWriteMessage.ignoreIdle <= ignoreIdle;
318
      wait until outboundSymbolWriteAck = '1';
319
      outboundSymbolWrite <= '0';
320
      wait until outboundSymbolWriteAck = '0';
321 37 magro732
    end procedure;
322 4 magro732
 
323 40 magro732
    procedure OutboundSymbolData(constant symbolContent : in std_logic_vector(31 downto 0);
324
                                 constant ignoreIdle : in boolean := false) is
325 37 magro732
    begin
326 40 magro732
      outboundSymbolWrite <= '1';
327
      outboundSymbolWriteMessage.symbolType <= "10";
328
      outboundSymbolWriteMessage.symbolContent <= symbolContent;
329
      outboundSymbolWriteMessage.ignoreIdle <= ignoreIdle;
330
      wait until outboundSymbolWriteAck = '1';
331
      outboundSymbolWrite <= '0';
332
      wait until outboundSymbolWriteAck = '0';
333 4 magro732
    end procedure;
334
 
335
    ---------------------------------------------------------------------------
336 40 magro732
    -- Procedures to send symbols.
337 4 magro732
    ---------------------------------------------------------------------------
338 40 magro732
    procedure InboundSymbolIdle is
339 4 magro732
    begin
340 40 magro732
      inboundSymbolWrite <= '1';
341
      inboundSymbolWriteMessage.symbolType <= "00";
342
      inboundSymbolWriteMessage.symbolContent <= (others=>'U');
343
      inboundSymbolWriteMessage.ignoreIdle <= false;
344
      wait until inboundSymbolWriteAck = '1';
345
      inboundSymbolWrite <= '0';
346
      wait until inboundSymbolWriteAck = '0';
347 37 magro732
    end procedure;
348 4 magro732
 
349 40 magro732
    procedure InboundSymbolControl(constant symbolContent : in std_logic_vector(23 downto 0);
350
                                   constant ignoreIdle : in boolean := false) is
351 37 magro732
    begin
352 40 magro732
      inboundSymbolWrite <= '1';
353
      inboundSymbolWriteMessage.symbolType <= "01";
354
      inboundSymbolWriteMessage.symbolContent <= x"00" & symbolContent;
355
      inboundSymbolWriteMessage.ignoreIdle <= ignoreIdle;
356
      wait until inboundSymbolWriteAck = '1';
357
      inboundSymbolWrite <= '0';
358
      wait until inboundSymbolWriteAck = '0';
359 4 magro732
    end procedure;
360
 
361 40 magro732
    procedure InboundSymbolData(constant symbolContent : in std_logic_vector(31 downto 0);
362
                                constant ignoreIdle : in boolean := false) is
363 37 magro732
    begin
364 40 magro732
      inboundSymbolWrite <= '1';
365
      inboundSymbolWriteMessage.symbolType <= "10";
366
      inboundSymbolWriteMessage.symbolContent <= symbolContent;
367
      inboundSymbolWriteMessage.ignoreIdle <= ignoreIdle;
368
      wait until inboundSymbolWriteAck = '1';
369
      inboundSymbolWrite <= '0';
370
      wait until inboundSymbolWriteAck = '0';
371 37 magro732
    end procedure;
372
 
373 4 magro732
    ---------------------------------------------------------------------------
374 40 magro732
    -- 
375
    ---------------------------------------------------------------------------
376
 
377
    procedure OutboundFrame(constant frame : in RioFrame;
378
                            constant willAbort : boolean := false) is
379
    begin
380
      outboundFrameWrite <= '1';
381
      outboundFrameWriteMessage.frame <= frame;
382
      outboundFrameWriteMessage.willAbort <= willAbort;
383
      wait until outboundFrameWriteAck = '1';
384
      outboundFrameWrite <= '0';
385
      wait until outboundFrameWriteAck = '0';
386
    end procedure;
387
 
388
    procedure InboundFrame(constant frame : in RioFrame;
389
                           constant willAbort : boolean := false) is
390
    begin
391
      inboundFrameWrite <= '1';
392
      inboundFrameWriteMessage.frame <= frame;
393
      inboundFrameWriteMessage.willAbort <= willAbort;
394
      wait until inboundFrameWriteAck = '1';
395
      inboundFrameWrite <= '0';
396
      wait until inboundFrameWriteAck = '0';
397
    end procedure;
398
 
399
    ---------------------------------------------------------------------------
400 4 magro732
    -- Process variables.
401
    ---------------------------------------------------------------------------
402
    variable seed1 : positive := 1;
403
    variable seed2 : positive := 1;
404
    variable payload : RioPayload;
405
 
406
    variable frame : RioFrame;
407 40 magro732
    variable frameOutbound : RioFrame;
408
    variable frameInbound : RioFrame;
409 4 magro732
 
410
  begin
411
    ---------------------------------------------------------------------------
412
    -- Test case initialization.
413
    ---------------------------------------------------------------------------
414
 
415
    portLinkTimeout <= (others=>'1');
416
    inputPortEnable <= '1';
417
    outputPortEnable <= '1';
418
 
419
    portInitialized <= '0';
420
 
421
    localAckIdWrite <= '0';
422
    clrOutstandingAckId <= '0';
423
    inboundAckIdWrite <= (others=>'0');
424
    outstandingAckIdWrite <= (others=>'0');
425
    outboundAckIdWrite <= (others=>'0');
426 37 magro732
 
427
    enable <= '1';
428 40 magro732
 
429
    linkInitializedExpected <= '0';
430 4 magro732
 
431 40 magro732
    outboundSymbolWrite <= '0';
432
    inboundSymbolWrite <= '0';
433
 
434
    outboundFrameWrite <= '0';
435
    inboundFrameWrite <= '0';
436
    inboundFrameFull <= '0';
437
 
438 4 magro732
    -- Generate a startup reset pulse.
439
    areset_n <= '0';
440
    wait until clk'event and clk = '1';
441
    wait until clk'event and clk = '1';
442
    areset_n <= '1';
443 40 magro732
    TestWait(outboundSymbolWriteEmpty, '1', "Outbound symbol empty.");
444 4 magro732
 
445
    ---------------------------------------------------------------------------
446 51 magro732
    TestSpec("-----------------------------------------------------------------");
447
    TestSpec("TG_RioSerial");
448
    TestSpec("-----------------------------------------------------------------");
449
    TestSpec("TG_RioSerial-TC1");
450
    TestSpec("Description: Test idle-sequence transmission at startup.");
451
    TestSpec("Requirement: XXXXX");
452
    TestSpec("-----------------------------------------------------------------");
453
    TestSpec("Step 1:");
454
    TestSpec("Action: Read transmission port.");
455
    TestSpec("Result: Idle sequence symbols should be read.");
456 4 magro732
    ---------------------------------------------------------------------------
457 51 magro732
    TestCaseStart("TG_RioSerial-TC1-Step1");
458 4 magro732
    ---------------------------------------------------------------------------
459 40 magro732
 
460 4 magro732
    -- Make sure only idle-sequences are transmitted at startup.
461 40 magro732
    for i in 0 to 512 loop
462
      OutboundSymbolIdle;
463
      InboundSymbolIdle;
464 4 magro732
    end loop;
465 40 magro732
    TestWait(outboundSymbolWriteEmpty, '1', "Outbound symbol empty.");
466
 
467
    for i in 0 to 512 loop
468
      OutboundSymbolIdle;
469
      InboundSymbolIdle;
470
    end loop;
471
    TestWait(outboundSymbolWriteEmpty, '1', "Outbound symbol empty.");
472 4 magro732
 
473
    ---------------------------------------------------------------------------
474 51 magro732
    TestSpec("-----------------------------------------------------------------");
475
    TestSpec("TG_RioSerial-TC2");
476
    TestSpec("Description: Test idle-sequence and status symbol transmission");
477
    TestSpec("             when the port has been initialized.");
478
    TestSpec("Requirement: XXXXX");
479
    TestSpec("-----------------------------------------------------------------");
480
    TestSpec("Step 1:");
481
    TestSpec("Action: Set port initialized and read transmission port.");
482
    TestSpec("Result: Idle sequence and status symbols should be read.");
483 4 magro732
    ---------------------------------------------------------------------------
484 51 magro732
    TestCaseStart("TG_RioSerial-TC2-Step1");
485 4 magro732
    ---------------------------------------------------------------------------
486
 
487
    -- Initialize the port to trigger a change of state.
488
    portInitialized <= '1';
489
 
490
    -- The transmitter should send idle sequences at startup and a status once
491
    -- in a while.
492 37 magro732
    for i in 0 to 17 loop
493 40 magro732
      OutboundSymbolIdle;
494
      InboundSymbolIdle;
495 18 magro732
    end loop;
496 40 magro732
    OutboundSymbolControl(RioControlSymbolCreate(STYPE0_STATUS, "00000", "11111",
497
                                                 STYPE1_NOP, "000"));
498
    InboundSymbolIdle;
499 37 magro732
 
500
    for i in 0 to 16 loop
501 40 magro732
      OutboundSymbolIdle;
502
      InboundSymbolIdle;
503 4 magro732
    end loop;
504 40 magro732
    OutboundSymbolControl(RioControlSymbolCreate(STYPE0_STATUS, "00000", "11111",
505
                                                 STYPE1_NOP, "000"));
506
    InboundSymbolIdle;
507 37 magro732
 
508
    for i in 0 to 16 loop
509 40 magro732
      OutboundSymbolIdle;
510
      InboundSymbolIdle;
511 4 magro732
    end loop;
512 40 magro732
    OutboundSymbolControl(RioControlSymbolCreate(STYPE0_STATUS, "00000", "11111",
513
                                                 STYPE1_NOP, "000"));
514
    InboundSymbolIdle;
515
    TestWait(outboundSymbolWriteEmpty, '1', "Outbound symbol empty.");
516 4 magro732
 
517
    ---------------------------------------------------------------------------
518 51 magro732
    TestSpec("-----------------------------------------------------------------");
519
    TestSpec("Step 2:");
520
    TestSpec("Action: Toggle port initialized pin and check that no status ");
521
    TestSpec("        symbols are transmitted when uninitialized.");
522
    TestSpec("Result: Only idle sequences should be read when uninitialized.");
523 4 magro732
    ---------------------------------------------------------------------------
524 51 magro732
    TestCaseStart("TG_RioSerial-TC2-Step2");
525 4 magro732
    ---------------------------------------------------------------------------
526
 
527
    -- Deassert the port initialized flag.
528
    portInitialized <= '0';
529
 
530
    -- Make sure only idle-sequences are transmitted at startup.
531 40 magro732
    for i in 0 to 512 loop
532
      OutboundSymbolIdle;
533
      InboundSymbolIdle;
534 4 magro732
    end loop;
535 40 magro732
    wait until outboundSymbolWriteEmpty = '1';
536
    for i in 0 to 512 loop
537
      OutboundSymbolIdle;
538
      InboundSymbolIdle;
539
    end loop;
540
    TestWait(outboundSymbolWriteEmpty, '1', "Outbound symbol empty.");
541 4 magro732
 
542
    -- Initialize the port to trigger a change of state.
543
    portInitialized <= '1';
544
 
545
    -- The transmitter should send idle sequences at startup and a status once
546
    -- in a while.
547 37 magro732
    for i in 0 to 17 loop
548 40 magro732
      OutboundSymbolIdle;
549
      InboundSymbolIdle;
550 18 magro732
    end loop;
551 40 magro732
    OutboundSymbolControl(RioControlSymbolCreate(STYPE0_STATUS, "00000", "11111",
552
                                                 STYPE1_NOP, "000"));
553
    InboundSymbolIdle;
554 37 magro732
 
555
    for i in 0 to 16 loop
556 40 magro732
      OutboundSymbolIdle;
557
      InboundSymbolIdle;
558 4 magro732
    end loop;
559 40 magro732
    OutboundSymbolControl(RioControlSymbolCreate(STYPE0_STATUS, "00000", "11111",
560
                                                 STYPE1_NOP, "000"));
561
    InboundSymbolIdle;
562 37 magro732
 
563
    for i in 0 to 16 loop
564 40 magro732
      OutboundSymbolIdle;
565
      InboundSymbolIdle;
566 4 magro732
    end loop;
567 40 magro732
    OutboundSymbolControl(RioControlSymbolCreate(STYPE0_STATUS, "00000", "11111",
568
                                                 STYPE1_NOP, "000"));
569
    InboundSymbolIdle;
570
    TestWait(outboundSymbolWriteEmpty, '1', "Outbound symbol empty.");
571 4 magro732
 
572
    ---------------------------------------------------------------------------
573 51 magro732
    TestSpec("-----------------------------------------------------------------");
574
    TestSpec("Step 3:");
575
    TestSpec("Action: Send one error free status symbol to trigger the ");
576
    TestSpec("        transmission of status symbols with a higher frequency.");
577
    TestSpec("Result: Idle sequence and status symbols should be read but ");
578
    TestSpec("        status symbols should be recived more often.");
579 4 magro732
    ---------------------------------------------------------------------------
580 51 magro732
    TestCaseStart("TG_RioSerial-TC2-Step3");
581 4 magro732
    ---------------------------------------------------------------------------
582
 
583
    -- A received error-free status triggers transmission of status symbols in
584
    -- a more rapid past.
585 40 magro732
    OutboundSymbolIdle;
586
    InboundSymbolControl(RioControlSymbolCreate(STYPE0_STATUS, "00000", "11111",
587
                                                STYPE1_NOP, "000"));
588 37 magro732
    for i in 0 to 15 loop
589 40 magro732
      OutboundSymbolIdle;
590
      InboundSymbolIdle;
591 37 magro732
    end loop;
592 4 magro732
 
593
    -- The transmitter should send at least 15 additional statuses after
594
    -- receiving an error free status.
595 37 magro732
    for j in 0 to 14 loop
596 40 magro732
      OutboundSymbolControl(RioControlSymbolCreate(STYPE0_STATUS, "00000", "11111",
597
                                                   STYPE1_NOP, "000"));
598
      InboundSymbolIdle;
599 37 magro732
 
600
      for i in 0 to 16 loop
601 40 magro732
        OutboundSymbolIdle;
602
        InboundSymbolIdle;
603 4 magro732
      end loop;
604
    end loop;
605
 
606 40 magro732
    OutboundSymbolControl(RioControlSymbolCreate(STYPE0_STATUS, "00000", "11111",
607
                                                 STYPE1_NOP, "000"));
608
    InboundSymbolIdle;
609 37 magro732
 
610 40 magro732
    OutboundSymbolIdle;
611
    InboundSymbolIdle;
612
    TestWait(outboundSymbolWriteEmpty, '1', "Outbound symbol empty.");
613
 
614 4 magro732
    ---------------------------------------------------------------------------
615 51 magro732
    TestSpec("-----------------------------------------------------------------");
616
    TestSpec("Step 4:");
617
    TestSpec("Action: Send one errornous status symbol to restart the status ");
618
    TestSpec("        counting.");
619
    TestSpec("Result: Idle sequence and status symbols should be read but ");
620
    TestSpec("        status symbols should still be received more often.");
621 4 magro732
    ---------------------------------------------------------------------------
622 51 magro732
    TestCaseStart("TG_RioSerial-TC2-Step4");
623 4 magro732
    ---------------------------------------------------------------------------
624
 
625
    -- REMARK: Add this...
626 51 magro732
    TestCaseStart("Not implemented.");
627 4 magro732
 
628
    ---------------------------------------------------------------------------
629 51 magro732
    TestSpec("-----------------------------------------------------------------");
630
    TestSpec("Step 5:");
631
    TestSpec("Action: Send seven additional status symbols.");
632
    TestSpec("Result: The link should become fully initialized.");
633 4 magro732
    ---------------------------------------------------------------------------
634 51 magro732
    TestCaseStart("TG_RioSerial-TC2-Step5");
635 4 magro732
    ---------------------------------------------------------------------------
636 37 magro732
 
637 4 magro732
    -- Make the link fully initialized by sending 7 additional statuses.
638
    for i in 0 to 6 loop
639 40 magro732
      OutboundSymbolIdle;
640
      InboundSymbolControl(RioControlSymbolCreate(STYPE0_STATUS, "00000", "11111",
641
                                                  STYPE1_NOP, "000"));
642 4 magro732
    end loop;
643 40 magro732
 
644
    -- Compensate for some ticks before the link becomes initialized.
645
    for i in 0 to 3 loop
646
      OutboundSymbolIdle;
647
      InboundSymbolIdle;
648 37 magro732
    end loop;
649 40 magro732
    TestWait(outboundSymbolWriteEmpty, '1', "Outbound symbol empty.");
650 4 magro732
 
651 40 magro732
    linkInitializedExpected <= '1';
652
 
653
    -- Receive a status-control-symbol.
654
    for i in 0 to 4 loop
655
      OutboundSymbolIdle;
656
      InboundSymbolIdle;
657
    end loop;
658
    OutboundSymbolControl(RioControlSymbolCreate(STYPE0_STATUS, "00000", "11111",
659
                                                 STYPE1_NOP, "000"));
660
    InboundSymbolIdle;
661
    TestWait(outboundSymbolWriteEmpty, '1', "Outbound symbol empty.");
662 4 magro732
 
663
    ---------------------------------------------------------------------------
664 51 magro732
    TestSpec("-----------------------------------------------------------------");
665
    TestSpec("TG_RioSerial-TC3");
666
    TestSpec("Description: Test port reception.");
667
    TestSpec("Requirement: XXXXX");
668
    TestSpec("-----------------------------------------------------------------");
669
    TestSpec("Step 1:");
670
    TestSpec("Action: Send an inbound frame with pad after the CRC.");
671
    TestSpec("Result: The frame should end up in a frame buffer.");
672 4 magro732
    ---------------------------------------------------------------------------
673 51 magro732
    TestCaseStart("TG_RioSerial-TC3-Step1");
674 4 magro732
    ---------------------------------------------------------------------------
675
 
676
    -- Create the frame.
677
    CreateRandomPayload(payload.data, seed1, seed2);
678
    payload.length := 1;
679
    frame := RioFrameCreate(ackId=>"00000", vc=>'0', crf=>'0', prio=>"00",
680
                            tt=>"01", ftype=>"0000",
681
                            sourceId=>x"0000", destId=>x"0000",
682
                            payload=>payload);
683 40 magro732
    InboundFrame(frame);
684 4 magro732
 
685 40 magro732
    -- Fill in the symbols that the packet will be fragmented into.
686
    InboundSymbolControl(RioControlSymbolCreate(STYPE0_STATUS, "00000", "11111",
687
                                                STYPE1_START_OF_PACKET, "000"));
688 4 magro732
    for i in 0 to frame.length-1 loop
689 40 magro732
      InboundSymbolData(frame.payload(i));
690 4 magro732
    end loop;
691 40 magro732
    InboundSymbolControl(RioControlSymbolCreate(STYPE0_STATUS, "00000", "11111",
692
                                                STYPE1_END_OF_PACKET, "000"));
693
    for i in 0 to 6 loop
694
      InboundSymbolIdle;
695
    end loop;
696
    OutboundSymbolControl(RioControlSymbolCreate(STYPE0_PACKET_ACCEPTED, "00000", "11111",
697
                                                 STYPE1_NOP, "000"), true);
698
    TestWait(outboundSymbolWriteEmpty, '1', "Outbound symbol empty.");
699
    TestCompare(inboundFrameWriteEmpty, '1', "Packet was received.");
700 4 magro732
 
701
    ---------------------------------------------------------------------------
702 51 magro732
    TestSpec("-----------------------------------------------------------------");
703
    TestSpec("Step 2:");
704
    TestSpec("Action: Send an inbound frame without a pad after the CRC.");
705
    TestSpec("Result: The frame should end up in a frame buffer.");
706 4 magro732
    ---------------------------------------------------------------------------
707 51 magro732
    TestCaseStart("TG_RioSerial-TC3-Step2");
708 4 magro732
    ---------------------------------------------------------------------------
709
 
710
    -- Create the frame.
711
    CreateRandomPayload(payload.data, seed1, seed2);
712
    payload.length := 2;
713
    frame := RioFrameCreate(ackId=>"00001", vc=>'0', crf=>'0', prio=>"00",
714
                            tt=>"01", ftype=>"0000",
715
                            sourceId=>x"0000", destId=>x"0000",
716
                            payload=>payload);
717 40 magro732
    InboundFrame(frame);
718 4 magro732
 
719 40 magro732
    -- Fill in the symbols that the packet will be fragmented into.
720
    InboundSymbolControl(RioControlSymbolCreate(STYPE0_STATUS, "00000", "11111",
721
                                                STYPE1_START_OF_PACKET, "000"));
722 4 magro732
    for i in 0 to frame.length-1 loop
723 40 magro732
      InboundSymbolData(frame.payload(i));
724 4 magro732
    end loop;
725 40 magro732
    InboundSymbolControl(RioControlSymbolCreate(STYPE0_STATUS, "00000", "11111",
726
                                                STYPE1_END_OF_PACKET, "000"));
727
    for i in 0 to 6 loop
728
      InboundSymbolIdle;
729
    end loop;
730
    OutboundSymbolControl(RioControlSymbolCreate(STYPE0_PACKET_ACCEPTED, "00001", "11111",
731
                                                 STYPE1_NOP, "000"), true);
732 4 magro732
 
733 40 magro732
    TestWait(outboundSymbolWriteEmpty, '1', "Outbound symbol empty.");
734
    TestCompare(inboundFrameWriteEmpty, '1', "Packet was received.");
735 4 magro732
 
736
    ---------------------------------------------------------------------------
737 51 magro732
    TestSpec("-----------------------------------------------------------------");
738
    TestSpec("Step 3:");
739
    TestSpec("Action: Send an inbound frame with maximum size.");
740
    TestSpec("Result: The frame should end up in a frame buffer.");
741 4 magro732
    ---------------------------------------------------------------------------
742 51 magro732
    TestCaseStart("TG_RioSerial-TC3-Step3");
743 4 magro732
    ---------------------------------------------------------------------------
744
 
745
    -- Create the frame.
746
    CreateRandomPayload(payload.data, seed1, seed2);
747
    payload.length := 133;
748
    frame := RioFrameCreate(ackId=>"00010", vc=>'0', crf=>'0', prio=>"00",
749
                            tt=>"01", ftype=>"0000",
750
                            sourceId=>x"0000", destId=>x"0000",
751
                            payload=>payload);
752 40 magro732
    InboundFrame(frame);
753 4 magro732
 
754 40 magro732
    -- Fill in the symbols that the packet will be fragmented into.
755
    InboundSymbolControl(RioControlSymbolCreate(STYPE0_STATUS, "00000", "11111",
756
                                                STYPE1_START_OF_PACKET, "000"));
757 4 magro732
    for i in 0 to frame.length-1 loop
758 40 magro732
      InboundSymbolData(frame.payload(i));
759 4 magro732
    end loop;
760 40 magro732
    InboundSymbolControl(RioControlSymbolCreate(STYPE0_STATUS, "00000", "11111",
761
                                                STYPE1_END_OF_PACKET, "000"));
762
    for i in 0 to 6 loop
763
      InboundSymbolIdle;
764
    end loop;
765
    OutboundSymbolControl(RioControlSymbolCreate(STYPE0_PACKET_ACCEPTED, "00010", "11111",
766
                                                 STYPE1_NOP, "000"), true);
767
    TestWait(outboundSymbolWriteEmpty, '1', "Outbound symbol empty.");
768
    TestCompare(inboundFrameWriteEmpty, '1', "Packet was received.");
769 4 magro732
 
770
    ---------------------------------------------------------------------------
771 51 magro732
    TestSpec("-----------------------------------------------------------------");
772
    TestSpec("Step 4:");
773
    TestSpec("Action: Send two packets without end-of-packet in between.");
774
    TestSpec("Result: Both packets should be accepted.");
775 4 magro732
    ---------------------------------------------------------------------------
776 51 magro732
    TestCaseStart("TG_RioSerial-TC3-Step4");
777 4 magro732
    ---------------------------------------------------------------------------
778
 
779
    -- Create the first frame.
780
    CreateRandomPayload(payload.data, seed1, seed2);
781
    payload.length := 10;
782
    frame := RioFrameCreate(ackId=>"00011", vc=>'0', crf=>'0', prio=>"00",
783
                            tt=>"01", ftype=>"0000",
784
                            sourceId=>x"0000", destId=>x"0000",
785
                            payload=>payload);
786 40 magro732
    InboundFrame(frame);
787
    InboundSymbolControl(RioControlSymbolCreate(STYPE0_STATUS, "00000", "11111",
788
                                                STYPE1_START_OF_PACKET, "000"));
789 4 magro732
    for i in 0 to frame.length-1 loop
790 40 magro732
      InboundSymbolData(frame.payload(i));
791 4 magro732
    end loop;
792 40 magro732
    InboundSymbolControl(RioControlSymbolCreate(STYPE0_STATUS, "00000", "11111",
793
                                                STYPE1_START_OF_PACKET, "000"));
794 4 magro732
 
795
    -- Create the second frame.
796
    CreateRandomPayload(payload.data, seed1, seed2);
797
    payload.length := 13;
798
    frame := RioFrameCreate(ackId=>"00100", vc=>'0', crf=>'0', prio=>"00",
799
                            tt=>"01", ftype=>"0000",
800
                            sourceId=>x"0000", destId=>x"0000",
801
                            payload=>payload);
802 40 magro732
    InboundFrame(frame);
803 4 magro732
    for i in 0 to frame.length-1 loop
804 40 magro732
      InboundSymbolData(frame.payload(i));
805 4 magro732
    end loop;
806 40 magro732
    InboundSymbolControl(RioControlSymbolCreate(STYPE0_STATUS, "00000", "11111",
807
                                                STYPE1_END_OF_PACKET, "000"));
808
    for i in 0 to 6 loop
809
      InboundSymbolIdle;
810
    end loop;
811 4 magro732
 
812 40 magro732
    -- Add expected packet-accepted symbols.
813
    OutboundSymbolControl(RioControlSymbolCreate(STYPE0_PACKET_ACCEPTED, "00011", "11111",
814
                                                 STYPE1_NOP, "000"), true);
815
    OutboundSymbolControl(RioControlSymbolCreate(STYPE0_PACKET_ACCEPTED, "00100", "11111",
816
                                                 STYPE1_NOP, "000"), true);
817 4 magro732
 
818 40 magro732
    -- Wait for all symbols to be transfered and check that the packet was received.
819
    TestWait(outboundSymbolWriteEmpty, '1', "Outbound symbol empty.");
820
    TestCompare(inboundFrameWriteEmpty, '1', "Packet was received.");
821 4 magro732
 
822
    ---------------------------------------------------------------------------
823 51 magro732
    TestSpec("-----------------------------------------------------------------");
824
    TestSpec("Step 5:");
825
    TestSpec("Action: Start to send a packet. Abort it with stomp. Then send ");
826
    TestSpec("        another packet.");
827
    TestSpec("Result: The first packet should be discarded and the second should");
828
    TestSpec("        be accepted. The retried packet should be acknowledged.");
829 4 magro732
    ---------------------------------------------------------------------------
830 51 magro732
    TestCaseStart("TG_RioSerial-TC3-Step5");
831 4 magro732
    ---------------------------------------------------------------------------
832
 
833 40 magro732
    -- Create a frame, send it and abort it with STOMP.
834 4 magro732
    CreateRandomPayload(payload.data, seed1, seed2);
835
    payload.length := 7;
836
    frame := RioFrameCreate(ackId=>"00101", vc=>'0', crf=>'0', prio=>"00",
837
                            tt=>"01", ftype=>"0000",
838
                            sourceId=>x"0000", destId=>x"0000",
839
                            payload=>payload);
840 40 magro732
    InboundFrame(frame, true);
841
    InboundSymbolControl(RioControlSymbolCreate(STYPE0_STATUS, "00000", "11111",
842
                                                STYPE1_START_OF_PACKET, "000"));
843 4 magro732
    for i in 0 to frame.length-1 loop
844 40 magro732
      InboundSymbolData(frame.payload(i));
845 4 magro732
    end loop;
846 40 magro732
    InboundSymbolControl(RioControlSymbolCreate(STYPE0_STATUS, "00000", "11111",
847
                                                STYPE1_STOMP, "000"));
848
    for i in 0 to 6 loop
849
      InboundSymbolIdle;
850
    end loop;
851
    InboundSymbolControl(RioControlSymbolCreate(STYPE0_STATUS, "00000", "11111",
852
                                                STYPE1_RESTART_FROM_RETRY, "000"));
853 4 magro732
 
854
    -- Create a new frame.
855
    CreateRandomPayload(payload.data, seed1, seed2);
856
    payload.length := 8;
857
    frame := RioFrameCreate(ackId=>"00101", vc=>'0', crf=>'0', prio=>"00",
858
                            tt=>"01", ftype=>"0000",
859
                            sourceId=>x"0000", destId=>x"0000",
860
                            payload=>payload);
861 40 magro732
    InboundFrame(frame);
862
    InboundSymbolControl(RioControlSymbolCreate(STYPE0_STATUS, "00000", "11111",
863
                                                STYPE1_START_OF_PACKET, "000"));
864 4 magro732
    for i in 0 to frame.length-1 loop
865 40 magro732
      InboundSymbolData(frame.payload(i));
866 4 magro732
    end loop;
867 40 magro732
    InboundSymbolControl(RioControlSymbolCreate(STYPE0_STATUS, "00000", "11111",
868
                                                STYPE1_END_OF_PACKET, "000"));
869
    for i in 0 to 6 loop
870
      InboundSymbolIdle;
871
    end loop;
872
 
873
    -- Receive acknowledge of the stomped packet.
874
    OutboundSymbolControl(RioControlSymbolCreate(STYPE0_PACKET_RETRY, "00101", "11111",
875
                                                 STYPE1_NOP, "000"), true);
876 4 magro732
 
877 40 magro732
    -- Receive acknowledge for the transmitted frame.
878
    OutboundSymbolControl(RioControlSymbolCreate(STYPE0_PACKET_ACCEPTED, "00101", "11111",
879
                                                 STYPE1_NOP, "000"), true);
880
    TestWait(outboundSymbolWriteEmpty, '1', "Outbound symbol empty.");
881
    TestCompare(inboundFrameWriteEmpty, '1', "Packet was received.");
882 4 magro732
 
883
    ---------------------------------------------------------------------------
884 51 magro732
    TestSpec("-----------------------------------------------------------------");
885
    TestSpec("Step 6:");
886
    TestSpec("Action: Start to send a packet but dont send any payload. Abort it");
887
    TestSpec("        with stomp. Then send another packet.");
888
    TestSpec("Result: The first packet should be discarded and the second should");
889
    TestSpec("        be accepted. The retried packet should be acknowledged.");
890 4 magro732
    ---------------------------------------------------------------------------
891 51 magro732
    TestCaseStart("TG_RioSerial-TC3-Step6");
892 4 magro732
    ---------------------------------------------------------------------------
893
 
894 40 magro732
    -- Start the reception of a frame and abort it.
895
    frame.length := 0;
896
    InboundFrame(frame, true);
897
    InboundSymbolControl(RioControlSymbolCreate(STYPE0_STATUS, "00000", "11111",
898
                                                STYPE1_START_OF_PACKET, "000"));
899
    InboundSymbolControl(RioControlSymbolCreate(STYPE0_STATUS, "00000", "11111",
900
                                                STYPE1_STOMP, "000"));
901
    for i in 0 to 6 loop
902
      InboundSymbolIdle;
903
    end loop;
904 4 magro732
 
905
    -- Receive acknowledge for the transmitted frame.
906 40 magro732
    OutboundSymbolControl(RioControlSymbolCreate(STYPE0_PACKET_RETRY, "00110", "11111",
907
                                                 STYPE1_NOP, "000"), true);
908 4 magro732
 
909 40 magro732
    TestWait(outboundSymbolWriteEmpty, '1', "Outbound symbol empty.");
910
 
911 4 magro732
    -- Acknowledge the canceled packet.
912 40 magro732
    InboundSymbolControl(RioControlSymbolCreate(STYPE0_STATUS, "00000", "11111",
913
                                                STYPE1_RESTART_FROM_RETRY, "000"));
914 4 magro732
 
915
    -- Create a new frame.
916
    CreateRandomPayload(payload.data, seed1, seed2);
917
    payload.length := 8;
918
    frame := RioFrameCreate(ackId=>"00110", vc=>'0', crf=>'0', prio=>"00",
919
                            tt=>"01", ftype=>"0000",
920
                            sourceId=>x"0000", destId=>x"0000",
921
                            payload=>payload);
922 40 magro732
    InboundFrame(frame);
923
    InboundSymbolControl(RioControlSymbolCreate(STYPE0_STATUS, "00000", "11111",
924
                                                STYPE1_START_OF_PACKET, "000"));
925 4 magro732
    for i in 0 to frame.length-1 loop
926 40 magro732
      InboundSymbolData(frame.payload(i));
927 4 magro732
    end loop;
928 40 magro732
    InboundSymbolControl(RioControlSymbolCreate(STYPE0_STATUS, "00000", "11111",
929
                                                STYPE1_END_OF_PACKET, "000"));
930
    for i in 0 to 6 loop
931
      InboundSymbolIdle;
932
    end loop;
933 4 magro732
 
934
    -- Receive acknowledge for the transmitted frame.
935 40 magro732
    OutboundSymbolControl(RioControlSymbolCreate(STYPE0_PACKET_ACCEPTED, "00110", "11111",
936
                                                 STYPE1_NOP, "000"), true);
937 4 magro732
 
938 40 magro732
    TestWait(outboundSymbolWriteEmpty, '1', "Outbound symbol empty.");
939
    TestCompare(inboundFrameWriteEmpty, '1', "Packet was received.");
940
 
941 4 magro732
    ---------------------------------------------------------------------------
942 51 magro732
    TestSpec("-----------------------------------------------------------------");
943
    TestSpec("Step 7:");
944
    TestSpec("Action: Start to send a packet with payload, then send a ");
945
    TestSpec("        link-request. Then send another packet.");
946
    TestSpec("Result: The first packet should be canceled without any ");
947
    TestSpec("        confirmation and a link-response should be returned. The");
948
    TestSpec("        second packet should be accepted.");
949 4 magro732
    ---------------------------------------------------------------------------
950 51 magro732
    TestCaseStart("TG_RioSerial-TC3-Step7");
951 4 magro732
    ---------------------------------------------------------------------------
952
 
953 40 magro732
    -- Create a new frame and abort it with a link-request/input-status to
954
    -- abort the current packet.
955 4 magro732
    CreateRandomPayload(payload.data, seed1, seed2);
956
    payload.length := 9;
957
    frame := RioFrameCreate(ackId=>"00111", vc=>'0', crf=>'0', prio=>"00",
958
                            tt=>"01", ftype=>"0000",
959
                            sourceId=>x"0000", destId=>x"0000",
960
                            payload=>payload);
961 40 magro732
    InboundFrame(frame, true);
962
    InboundSymbolControl(RioControlSymbolCreate(STYPE0_STATUS, "00000", "11111",
963
                                                STYPE1_START_OF_PACKET, "000"));
964 4 magro732
    for i in 0 to frame.length-1 loop
965 40 magro732
      InboundSymbolData(frame.payload(i));
966 4 magro732
    end loop;
967 40 magro732
    InboundSymbolControl(RioControlSymbolCreate(STYPE0_STATUS, "00000", "11111",
968
                                                STYPE1_LINK_REQUEST, "100"));
969
    for i in 0 to 6 loop
970
      InboundSymbolIdle;
971
    end loop;
972 4 magro732
 
973
    -- Receive link-response indicating normal operation and expected ackId.
974 40 magro732
    OutboundSymbolControl(RioControlSymbolCreate(STYPE0_LINK_RESPONSE, "00111", "10000",
975
                                                 STYPE1_NOP, "000"), true);
976 4 magro732
 
977 40 magro732
    TestWait(outboundSymbolWriteEmpty, '1', "Outbound symbol empty.");
978
    TestCompare(inboundFrameWriteEmpty, '1', "Packet was received.");
979
 
980 4 magro732
    -- Create a new frame.
981
    CreateRandomPayload(payload.data, seed1, seed2);
982
    payload.length := 10;
983
    frame := RioFrameCreate(ackId=>"00111", vc=>'0', crf=>'0', prio=>"00",
984
                            tt=>"01", ftype=>"0000",
985
                            sourceId=>x"0000", destId=>x"0000",
986
                            payload=>payload);
987 40 magro732
    InboundFrame(frame);
988
    InboundSymbolControl(RioControlSymbolCreate(STYPE0_STATUS, "00000", "11111",
989
                                                STYPE1_START_OF_PACKET, "000"));
990 4 magro732
    for i in 0 to frame.length-1 loop
991 40 magro732
      InboundSymbolData(frame.payload(i));
992 4 magro732
    end loop;
993 40 magro732
    InboundSymbolControl(RioControlSymbolCreate(STYPE0_STATUS, "00000", "11111",
994
                                                STYPE1_END_OF_PACKET, "000"));
995
    for i in 0 to 6 loop
996
      InboundSymbolIdle;
997
    end loop;
998 4 magro732
 
999 40 magro732
    -- Receive acknowledge for the transmitted frame.
1000
    OutboundSymbolControl(RioControlSymbolCreate(STYPE0_PACKET_ACCEPTED, "00111", "11111",
1001
                                                 STYPE1_NOP, "000"), true);
1002 4 magro732
 
1003 40 magro732
    TestWait(outboundSymbolWriteEmpty, '1', "Outbound symbol empty.");
1004
    TestCompare(inboundFrameWriteEmpty, '1', "Packet was received.");
1005
 
1006 4 magro732
    ---------------------------------------------------------------------------
1007 51 magro732
    TestSpec("-----------------------------------------------------------------");
1008
    TestSpec("Step 8:");
1009
    TestSpec("Action: Start to send a packet, no payload, then send a ");
1010
    TestSpec("        link-request. Then send another packet.");
1011
    TestSpec("Result: The first packet should be canceled without any ");
1012
    TestSpec("        confirmation and a link-response should be returned. The");
1013
    TestSpec("        second packet should be accepted.");
1014 4 magro732
    ---------------------------------------------------------------------------
1015 51 magro732
    TestCaseStart("TG_RioSerial-TC3-Step8");
1016 4 magro732
    ---------------------------------------------------------------------------
1017
 
1018 40 magro732
    -- Start a frame then send link-request/input-status to abort it.
1019
    frame.length := 0;
1020
    InboundFrame(frame, true);
1021
    InboundSymbolControl(RioControlSymbolCreate(STYPE0_STATUS, "00000", "11111",
1022
                                                STYPE1_START_OF_PACKET, "000"));
1023
    InboundSymbolControl(RioControlSymbolCreate(STYPE0_STATUS, "00000", "11111",
1024
                                                STYPE1_LINK_REQUEST, "100"));
1025
    for i in 0 to 6 loop
1026
      InboundSymbolIdle;
1027
    end loop;
1028 4 magro732
 
1029
    -- Receive link-response indicating normal operation and expected ackId.
1030 40 magro732
    OutboundSymbolControl(RioControlSymbolCreate(STYPE0_LINK_RESPONSE, "01000", "10000",
1031
                                                 STYPE1_NOP, "000"), true);
1032 4 magro732
 
1033
    -- Create a new frame.
1034
    CreateRandomPayload(payload.data, seed1, seed2);
1035
    payload.length := 11;
1036
    frame := RioFrameCreate(ackId=>"01000", vc=>'0', crf=>'0', prio=>"00",
1037
                            tt=>"01", ftype=>"0000",
1038
                            sourceId=>x"0000", destId=>x"0000",
1039
                            payload=>payload);
1040 40 magro732
    InboundFrame(frame);
1041
    InboundSymbolControl(RioControlSymbolCreate(STYPE0_STATUS, "00000", "11111",
1042
                                                STYPE1_START_OF_PACKET, "000"));
1043 4 magro732
    for i in 0 to frame.length-1 loop
1044 40 magro732
      InboundSymbolData(frame.payload(i));
1045 4 magro732
    end loop;
1046 40 magro732
    InboundSymbolControl(RioControlSymbolCreate(STYPE0_STATUS, "00000", "11111",
1047
                                                STYPE1_END_OF_PACKET, "000"));
1048
    for i in 0 to 6 loop
1049
      InboundSymbolIdle;
1050
    end loop;
1051 4 magro732
 
1052
    -- Receive acknowledge for the transmitted frame.
1053 40 magro732
    OutboundSymbolControl(RioControlSymbolCreate(STYPE0_PACKET_ACCEPTED, "01000", "11111",
1054
                                                 STYPE1_NOP, "000"), true);
1055 4 magro732
 
1056 40 magro732
    TestWait(outboundSymbolWriteEmpty, '1', "Outbound symbol empty.");
1057
    TestCompare(inboundFrameWriteEmpty, '1', "Packet was received.");
1058
 
1059 4 magro732
    ---------------------------------------------------------------------------
1060 51 magro732
    TestSpec("-----------------------------------------------------------------");
1061
    TestSpec("Step 9:");
1062
    TestSpec("Action: Send a packet when no buffers are available. Reset receiver");
1063
    TestSpec("        with link-request.");
1064
    TestSpec("Result: A packet-retry should be transmitted and receiver should");
1065
    TestSpec("        enter input-retry-stopped.");
1066 4 magro732
    ---------------------------------------------------------------------------
1067 51 magro732
    TestCaseStart("TG_RioSerial-TC3-Step9");
1068 4 magro732
    ---------------------------------------------------------------------------
1069
 
1070 40 magro732
    -- Indicate the inbound frame queue is full.
1071
    inboundFrameFull <= '1';
1072
 
1073
    -- Create a new frame and start sending it.
1074 4 magro732
    CreateRandomPayload(payload.data, seed1, seed2);
1075
    payload.length := 11;
1076
    frame := RioFrameCreate(ackId=>"01001", vc=>'0', crf=>'0', prio=>"00",
1077
                            tt=>"01", ftype=>"0000",
1078
                            sourceId=>x"0000", destId=>x"0000",
1079
                            payload=>payload);
1080 40 magro732
    InboundSymbolControl(RioControlSymbolCreate(STYPE0_STATUS, "00000", "11111",
1081
                                                STYPE1_START_OF_PACKET, "000"));
1082
    InboundSymbolData(frame.payload(0));
1083
    for i in 0 to 6 loop
1084
      InboundSymbolIdle;
1085
    end loop;
1086 4 magro732
 
1087
    -- Receive notification about that the packet needs to be retried.
1088 40 magro732
    OutboundSymbolControl(RioControlSymbolCreate(STYPE0_PACKET_RETRY, "01001", "11111",
1089
                                                 STYPE1_NOP, "000"), true);
1090 4 magro732
 
1091
    -- Check the status of the input port and verify the input-retry-stopped state.
1092
    -- This should also set the receiver into normal operation.
1093 40 magro732
    InboundSymbolControl(RioControlSymbolCreate(STYPE0_STATUS, "00000", "11111",
1094
                                                STYPE1_LINK_REQUEST, "100"));
1095
    for i in 0 to 6 loop
1096
      InboundSymbolIdle;
1097
    end loop;
1098
    OutboundSymbolControl(RioControlSymbolCreate(STYPE0_LINK_RESPONSE, "01001", "00100",
1099
                                                 STYPE1_NOP, "000"), true);
1100 4 magro732
 
1101
    -- Check the status of the input port and verify the input-retry-stopped state.
1102 40 magro732
    InboundSymbolControl(RioControlSymbolCreate(STYPE0_STATUS, "00000", "11111",
1103
                                                STYPE1_LINK_REQUEST, "100"));
1104
    for i in 0 to 6 loop
1105
      InboundSymbolIdle;
1106
    end loop;
1107
    OutboundSymbolControl(RioControlSymbolCreate(STYPE0_LINK_RESPONSE, "01001", "10000",
1108
                                                 STYPE1_NOP, "000"), true);
1109 4 magro732
 
1110 40 magro732
    TestWait(outboundSymbolWriteEmpty, '1', "Outbound symbol empty.");
1111
    TestCompare(inboundFrameWriteEmpty, '1', "Packet was received.");
1112
 
1113
    -- Indicate the inbound frame queue is ready to accept new packets again.
1114
    inboundFrameFull <= '0';
1115
 
1116 4 magro732
    ---------------------------------------------------------------------------
1117 51 magro732
    TestSpec("-----------------------------------------------------------------");
1118
    TestSpec("Step 10:");
1119
    TestSpec("Action: Send a packet when no buffers is available. Reset receiver");
1120
    TestSpec("        with restart-from-retry.");
1121
    TestSpec("Result: A packet-retry should be transmitted and receiver should");
1122
    TestSpec("        enter input-retry-stopped.");
1123 4 magro732
    ---------------------------------------------------------------------------
1124 51 magro732
    TestCaseStart("TG_RioSerial-TC3-Step10");
1125 4 magro732
    ---------------------------------------------------------------------------
1126
 
1127 40 magro732
    -- Indicate the inbound frame queue is full.
1128
    inboundFrameFull <= '1';
1129
 
1130 4 magro732
    -- Create a new frame.
1131
    CreateRandomPayload(payload.data, seed1, seed2);
1132
    payload.length := 11;
1133
    frame := RioFrameCreate(ackId=>"01001", vc=>'0', crf=>'0', prio=>"00",
1134
                            tt=>"01", ftype=>"0000",
1135
                            sourceId=>x"0000", destId=>x"0000",
1136
                            payload=>payload);
1137 40 magro732
    InboundSymbolControl(RioControlSymbolCreate(STYPE0_STATUS, "00000", "11111",
1138
                                                STYPE1_START_OF_PACKET, "000"));
1139
    InboundSymbolData(frame.payload(0));
1140
    for i in 0 to 6 loop
1141
      InboundSymbolIdle;
1142
    end loop;
1143 4 magro732
 
1144
    -- Receive notification about that the packet needs to be retried.
1145 40 magro732
    OutboundSymbolControl(RioControlSymbolCreate(STYPE0_PACKET_RETRY, "01001", "11111",
1146
                                                 STYPE1_NOP, "000"), true);
1147 4 magro732
 
1148
    -- Acknowledge the retried packet.
1149 40 magro732
    InboundSymbolControl(RioControlSymbolCreate(STYPE0_STATUS, "00000", "11111",
1150
                                                STYPE1_RESTART_FROM_RETRY, "000"));
1151 4 magro732
 
1152 40 magro732
    -- Request the status of the input port.
1153
    InboundSymbolControl(RioControlSymbolCreate(STYPE0_STATUS, "00000", "11111",
1154
                                                STYPE1_LINK_REQUEST, "100"));
1155
    for i in 0 to 6 loop
1156
      InboundSymbolIdle;
1157
    end loop;
1158 4 magro732
 
1159 40 magro732
    -- Verify the input-retry-stopped state.
1160
    OutboundSymbolControl(RioControlSymbolCreate(STYPE0_LINK_RESPONSE, "01001", "10000",
1161
                                                 STYPE1_NOP, "000"), true);
1162
 
1163 4 magro732
    -- Always receive a status after a link response when leaving input-error-stopped.
1164 40 magro732
--    OutboundSymbol(SYMBOL_CONTROL,
1165 4 magro732
--                  RioControlSymbolCreate(STYPE0_STATUS, "01001", "11111",
1166
--                                         STYPE1_NOP, "000"));    
1167 40 magro732
    TestWait(outboundSymbolWriteEmpty, '1', "Outbound symbol empty.");
1168
    TestCompare(inboundFrameWriteEmpty, '1', "Packet was received.");
1169
 
1170
    -- Indicate the inbound frame queue is ready to accept new packets again.
1171
    inboundFrameFull <= '0';
1172 4 magro732
 
1173
    ---------------------------------------------------------------------------
1174 51 magro732
    TestSpec("-----------------------------------------------------------------");
1175
    TestSpec("Step 11:");
1176
    TestSpec("Action: Start a new packet when in input-retry-stopped state.");
1177
    TestSpec("Result: The packet should be discarded.");
1178 4 magro732
    ---------------------------------------------------------------------------
1179 51 magro732
    TestCaseStart("TG_RioSerial-TC3-Step11");
1180 4 magro732
    ---------------------------------------------------------------------------
1181
 
1182 40 magro732
    -- Indicate the inbound frame queue is full.
1183
    inboundFrameFull <= '1';
1184
 
1185 4 magro732
    -- Create a new frame.
1186
    CreateRandomPayload(payload.data, seed1, seed2);
1187
    payload.length := 11;
1188
    frame := RioFrameCreate(ackId=>"01001", vc=>'0', crf=>'0', prio=>"00",
1189
                            tt=>"01", ftype=>"0000",
1190
                            sourceId=>x"0000", destId=>x"0000",
1191
                            payload=>payload);
1192
 
1193
    -- Start the reception of a frame.
1194 40 magro732
    InboundSymbolControl(RioControlSymbolCreate(STYPE0_STATUS, "00000", "11111",
1195
                                                STYPE1_START_OF_PACKET, "000"));
1196
    InboundSymbolData(frame.payload(0));
1197
    for i in 0 to 6 loop
1198
      InboundSymbolIdle;
1199
    end loop;
1200 4 magro732
 
1201
    -- Receive notification about that the packet needs to be retried.
1202 40 magro732
    OutboundSymbolControl(RioControlSymbolCreate(STYPE0_PACKET_RETRY, "01001", "11111",
1203
                                                 STYPE1_NOP, "000"), true);
1204
    TestWait(outboundSymbolWriteEmpty, '1', "Outbound symbol empty.");
1205 4 magro732
 
1206 40 magro732
    -- Create a packet and send it. It should be silently discarded.
1207 4 magro732
    CreateRandomPayload(payload.data, seed1, seed2);
1208
    payload.length := 12;
1209
    frame := RioFrameCreate(ackId=>"01001", vc=>'0', crf=>'0', prio=>"00",
1210
                            tt=>"01", ftype=>"0000",
1211
                            sourceId=>x"0000", destId=>x"0000",
1212
                            payload=>payload);
1213 40 magro732
    OutboundSymbolIdle;
1214
    InboundSymbolControl(RioControlSymbolCreate(STYPE0_STATUS, "00000", "11111",
1215
                                                STYPE1_START_OF_PACKET, "000"));
1216 4 magro732
    for i in 0 to frame.length-1 loop
1217 40 magro732
      OutboundSymbolIdle;
1218
      InboundSymbolData(frame.payload(i));
1219 4 magro732
    end loop;
1220 40 magro732
    OutboundSymbolIdle;
1221
    InboundSymbolControl(RioControlSymbolCreate(STYPE0_STATUS, "00000", "11111",
1222
                                                STYPE1_END_OF_PACKET, "000"));
1223 4 magro732
 
1224
    -- Acknowledge the retried packet.
1225 40 magro732
    OutboundSymbolIdle;
1226
    InboundSymbolControl(RioControlSymbolCreate(STYPE0_STATUS, "00000", "11111",
1227
                                                STYPE1_RESTART_FROM_RETRY, "000"));
1228
    for i in 0 to 6 loop
1229
      OutboundSymbolIdle;
1230
      InboundSymbolIdle;
1231
    end loop;
1232
    TestWait(outboundSymbolWriteEmpty, '1', "Outbound symbol empty.");
1233 4 magro732
 
1234 40 magro732
    -- Indicate the inbound frame queue is ready to accept new packets again.
1235
    inboundFrameFull <= '0';
1236
 
1237 4 magro732
    -- Create a packet and send it.
1238
    CreateRandomPayload(payload.data, seed1, seed2);
1239
    payload.length := 13;
1240
    frame := RioFrameCreate(ackId=>"01001", vc=>'0', crf=>'0', prio=>"00",
1241
                            tt=>"01", ftype=>"0000",
1242
                            sourceId=>x"0000", destId=>x"0000",
1243
                            payload=>payload);
1244 40 magro732
    InboundFrame(frame);
1245
    InboundSymbolControl(RioControlSymbolCreate(STYPE0_STATUS, "00000", "11111",
1246
                                                STYPE1_START_OF_PACKET, "000"));
1247 4 magro732
    for i in 0 to frame.length-1 loop
1248 40 magro732
      InboundSymbolData(frame.payload(i));
1249 4 magro732
    end loop;
1250 40 magro732
    InboundSymbolControl(RioControlSymbolCreate(STYPE0_STATUS, "00000", "11111",
1251
                                                STYPE1_END_OF_PACKET, "000"));
1252
    for i in 0 to 6 loop
1253
      InboundSymbolIdle;
1254
    end loop;
1255 4 magro732
 
1256
    -- Receive acknowledge for the transmitted frame.
1257 40 magro732
    OutboundSymbolControl(RioControlSymbolCreate(STYPE0_PACKET_ACCEPTED, "01001", "11111",
1258
                                                 STYPE1_NOP, "000"), true);
1259 4 magro732
 
1260 40 magro732
    TestWait(outboundSymbolWriteEmpty, '1', "Outbound symbol empty.");
1261
    TestCompare(inboundFrameWriteEmpty, '1', "Packet was received.");
1262
 
1263 4 magro732
    ---------------------------------------------------------------------------
1264 51 magro732
    TestSpec("-----------------------------------------------------------------");
1265
    TestSpec("Step 12:");
1266
    TestSpec("Action: Send an erronous control-symbol. Then restore with");
1267
    TestSpec("        link-request.");
1268
    TestSpec("Result: Receiver should enter input-error-stopped and return to");
1269
    TestSpec("        normal operation after the link-request was receiver.");
1270 4 magro732
    ---------------------------------------------------------------------------
1271 51 magro732
    TestCaseStart("TG_RioSerial-TC3-Step12");
1272 4 magro732
    ---------------------------------------------------------------------------
1273
 
1274
    -- Create, corrupt and send a control symbol.
1275 40 magro732
    InboundSymbolControl(RioControlSymbolCreate(STYPE0_STATUS, "00000", "11111",
1276
                                                STYPE1_START_OF_PACKET, "000") xor x"100000");
1277
    for i in 0 to 6 loop
1278
      InboundSymbolIdle;
1279
    end loop;
1280 4 magro732
 
1281
    -- Receive a packet-not-accepted indicating error in control-symbol crc.
1282 40 magro732
    OutboundSymbolControl(RioControlSymbolCreate(STYPE0_PACKET_NOT_ACCEPTED, "00000", "00010",
1283
                                                 STYPE1_NOP, "000"), true);
1284 4 magro732
 
1285
    -- Create a packet and send it. It should be discarded.
1286
    CreateRandomPayload(payload.data, seed1, seed2);
1287
    payload.length := 14;
1288
    frame := RioFrameCreate(ackId=>"01010", vc=>'0', crf=>'0', prio=>"00",
1289
                            tt=>"01", ftype=>"0000",
1290
                            sourceId=>x"0000", destId=>x"0000",
1291
                            payload=>payload);
1292 40 magro732
    OutboundSymbolIdle;
1293
    InboundSymbolControl(RioControlSymbolCreate(STYPE0_STATUS, "00000", "11111",
1294
                                                STYPE1_START_OF_PACKET, "000"));
1295 4 magro732
    for i in 0 to frame.length-1 loop
1296 40 magro732
      OutboundSymbolIdle;
1297
      InboundSymbolData(frame.payload(i));
1298 4 magro732
    end loop;
1299 40 magro732
    OutboundSymbolIdle;
1300
    InboundSymbolControl(RioControlSymbolCreate(STYPE0_STATUS, "00000", "11111",
1301
                                                STYPE1_END_OF_PACKET, "000"));
1302 4 magro732
 
1303
    -- Make the receiver go back to normal operation by sending a link-request.
1304 40 magro732
    OutboundSymbolIdle;
1305
    InboundSymbolControl(RioControlSymbolCreate(STYPE0_STATUS, "00000", "11111",
1306
                                                STYPE1_LINK_REQUEST, "100"));
1307
    for i in 0 to 6 loop
1308
      InboundSymbolIdle;
1309
    end loop;
1310
    OutboundSymbolControl(RioControlSymbolCreate(STYPE0_LINK_RESPONSE, "01010", "00101",
1311
                                                 STYPE1_NOP, "000"), true);
1312
    TestWait(outboundSymbolWriteEmpty, '1', "Outbound symbol empty.");
1313 4 magro732
 
1314
    -- Always receive a status after a link response when leaving input-error-stopped.
1315 40 magro732
--    OutboundSymbol(SYMBOL_CONTROL,
1316 4 magro732
--                  RioControlSymbolCreate(STYPE0_STATUS, "01010", "11111",
1317
--                                         STYPE1_NOP, "000"));
1318
 
1319
    -- Create a packet and send it.
1320
    CreateRandomPayload(payload.data, seed1, seed2);
1321
    payload.length := 15;
1322
    frame := RioFrameCreate(ackId=>"01010", vc=>'0', crf=>'0', prio=>"00",
1323
                            tt=>"01", ftype=>"0000",
1324
                            sourceId=>x"0000", destId=>x"0000",
1325
                            payload=>payload);
1326 40 magro732
    InboundFrame(frame);
1327
    InboundSymbolControl(RioControlSymbolCreate(STYPE0_STATUS, "00000", "11111",
1328
                                                STYPE1_START_OF_PACKET, "000"));
1329 4 magro732
    for i in 0 to frame.length-1 loop
1330 40 magro732
      InboundSymbolData(frame.payload(i));
1331 4 magro732
    end loop;
1332 40 magro732
    InboundSymbolControl(RioControlSymbolCreate(STYPE0_STATUS, "00000", "11111",
1333
                                                STYPE1_END_OF_PACKET, "000"));
1334
    for i in 0 to 6 loop
1335
      InboundSymbolIdle;
1336
    end loop;
1337 4 magro732
 
1338
    -- Receive acknowledge for the transmitted frame.
1339 40 magro732
    OutboundSymbolControl(RioControlSymbolCreate(STYPE0_PACKET_ACCEPTED, "01010", "11111",
1340
                                                 STYPE1_NOP, "000"), true);
1341 4 magro732
 
1342 40 magro732
    TestWait(outboundSymbolWriteEmpty, '1', "Outbound symbol empty.");
1343
    TestCompare(inboundFrameWriteEmpty, '1', "Packet was received.");
1344
 
1345 4 magro732
    ---------------------------------------------------------------------------
1346 51 magro732
    TestSpec("-----------------------------------------------------------------");
1347
    TestSpec("Step 13:");
1348
    TestSpec("Action: Send an erronous packet. Then restore with link-request.");
1349
    TestSpec("Result: Receiver should enter input-error-stopped and return to");
1350
    TestSpec("        normal operation after the link-request was receiver.");
1351 4 magro732
    ---------------------------------------------------------------------------
1352 51 magro732
    TestCaseStart("TG_RioSerial-TC3-Step13");
1353 4 magro732
    ---------------------------------------------------------------------------
1354
 
1355
    -- Create a packet and send it with a bit error. It should be discarded.
1356
    CreateRandomPayload(payload.data, seed1, seed2);
1357
    payload.length := 15;
1358
    frame := RioFrameCreate(ackId=>"01011", vc=>'0', crf=>'0', prio=>"00",
1359
                            tt=>"01", ftype=>"0000",
1360
                            sourceId=>x"0000", destId=>x"0000",
1361
                            payload=>payload);
1362
    frame.payload(0) := frame.payload(0) xor x"00000010";
1363 40 magro732
    InboundFrame(frame, true);
1364
    InboundSymbolControl(RioControlSymbolCreate(STYPE0_STATUS, "00000", "11111",
1365
                                                STYPE1_START_OF_PACKET, "000"));
1366 4 magro732
    for i in 0 to frame.length-1 loop
1367 40 magro732
      InboundSymbolData(frame.payload(i));
1368 4 magro732
    end loop;
1369 40 magro732
    InboundSymbolControl(RioControlSymbolCreate(STYPE0_STATUS, "00000", "11111",
1370
                                                STYPE1_END_OF_PACKET, "000"));
1371
    for i in 0 to 6 loop
1372
      InboundSymbolIdle;
1373
    end loop;
1374 4 magro732
 
1375
    -- Receive a packet-not-accepted indicating error in control-symbol crc.
1376 40 magro732
    OutboundSymbolControl(RioControlSymbolCreate(STYPE0_PACKET_NOT_ACCEPTED, "00000", "00100",
1377
                                                 STYPE1_NOP, "000"), true);
1378 4 magro732
 
1379
    -- Make the receiver go back to normal operation by sending a link-request.
1380 40 magro732
    InboundSymbolControl(RioControlSymbolCreate(STYPE0_STATUS, "00000", "11111",
1381
                                                STYPE1_LINK_REQUEST, "100"));
1382
    for i in 0 to 6 loop
1383
      InboundSymbolIdle;
1384
    end loop;
1385
    OutboundSymbolControl(RioControlSymbolCreate(STYPE0_LINK_RESPONSE, "01011", "00101",
1386
                                                 STYPE1_NOP, "000"), true);
1387 4 magro732
 
1388
    -- Send a new frame without error.
1389
    CreateRandomPayload(payload.data, seed1, seed2);
1390
    payload.length := 16;
1391
    frame := RioFrameCreate(ackId=>"01011", vc=>'0', crf=>'0', prio=>"00",
1392
                            tt=>"01", ftype=>"0000",
1393
                            sourceId=>x"0000", destId=>x"0000",
1394
                            payload=>payload);
1395 40 magro732
    InboundFrame(frame);
1396
    InboundSymbolControl(RioControlSymbolCreate(STYPE0_STATUS, "00000", "11111",
1397
                                                STYPE1_START_OF_PACKET, "000"));
1398 4 magro732
    for i in 0 to frame.length-1 loop
1399 40 magro732
      InboundSymbolData(frame.payload(i));
1400 4 magro732
    end loop;
1401 40 magro732
    InboundSymbolControl(RioControlSymbolCreate(STYPE0_STATUS, "00000", "11111",
1402
                                                STYPE1_END_OF_PACKET, "000"));
1403
    for i in 0 to 6 loop
1404
      InboundSymbolIdle;
1405
    end loop;
1406 4 magro732
 
1407
    -- Receive acknowledge for the transmitted frame.
1408 40 magro732
    OutboundSymbolControl(RioControlSymbolCreate(STYPE0_PACKET_ACCEPTED, "01011", "11111",
1409
                                                 STYPE1_NOP, "000"), true);
1410 4 magro732
 
1411 40 magro732
    TestWait(outboundSymbolWriteEmpty, '1', "Outbound symbol empty.");
1412
    TestCompare(inboundFrameWriteEmpty, '1', "Packet was received.");
1413
 
1414 4 magro732
    -- REMARK: Complete with some more error situations: invalid ackId, too
1415
    -- short packet, too long packet, etc...
1416
    ---------------------------------------------------------------------------
1417 51 magro732
    TestSpec("-----------------------------------------------------------------");
1418
    TestSpec("TG_RioSerial-TC4");
1419
    TestSpec("Description: Test port transmission.");
1420
    TestSpec("Requirement: XXXXX");
1421
    TestSpec("-----------------------------------------------------------------");
1422
    TestSpec("Step 1:");
1423
    TestSpec("Action: Send an outbound frame.");
1424
    TestSpec("Result: The frame should be read from the frame buffer and ");
1425
    TestSpec("        received as symbols.");
1426 4 magro732
    ---------------------------------------------------------------------------
1427 51 magro732
    TestCaseStart("TG_RioSerial-TC4-Step1");
1428 4 magro732
    ---------------------------------------------------------------------------
1429
 
1430
    -- Create the frame.
1431 40 magro732
    -- Make sure the transmitter fills in the correct ackId and dont use the
1432
    -- one in the input packet.
1433 4 magro732
    CreateRandomPayload(payload.data, seed1, seed2);
1434
    payload.length := 3;
1435 40 magro732
    frame := RioFrameCreate(ackId=>"UUUUU", vc=>'0', crf=>'0', prio=>"00",
1436 4 magro732
                            tt=>"01", ftype=>"0000",
1437
                            sourceId=>x"0000", destId=>x"0000",
1438
                            payload=>payload);
1439 40 magro732
    OutboundFrame(frame);
1440
    frame.payload(0)(31 downto 27) := "00000";
1441 4 magro732
 
1442 40 magro732
    -- Receive the frame.
1443
    for i in 0 to 4 loop
1444
      OutboundSymbolIdle;
1445
      InboundSymbolIdle;
1446
    end loop;
1447
    OutboundSymbolControl(RioControlSymbolCreate(STYPE0_STATUS, "01100", "11111",
1448
                                                 STYPE1_START_OF_PACKET, "000"));
1449
    InboundSymbolIdle;
1450
    for i in 0 to frame.length-1 loop
1451
      OutboundSymbolData(frame.payload(i));
1452
      InboundSymbolIdle;
1453
    end loop;
1454
    OutboundSymbolControl(RioControlSymbolCreate(STYPE0_STATUS, "01100", "11111",
1455
                                                 STYPE1_END_OF_PACKET, "000"));
1456
    InboundSymbolIdle;
1457 4 magro732
 
1458 40 magro732
    -- Send acknowledge that the frame was received.
1459
    OutboundSymbolIdle;
1460
    InboundSymbolControl(RioControlSymbolCreate(STYPE0_PACKET_ACCEPTED, "00000", "11111",
1461
                                                STYPE1_NOP, "000"));
1462
    for i in 0 to 4 loop
1463
      OutboundSymbolIdle;
1464
      InboundSymbolIdle;
1465
    end loop;
1466
 
1467
    TestWait(outboundSymbolWriteEmpty, '1', "Outbound symbol empty");
1468
    TestCompare(outboundFrameWriteEmpty, '1', "packet transmitted");
1469 4 magro732
 
1470 40 magro732
    ---------------------------------------------------------------------------
1471 51 magro732
    TestSpec("-----------------------------------------------------------------");
1472
    TestSpec("Step 2:");
1473
    TestSpec("Action: Send one more outbound packets than there are ackIds.");
1474
    TestSpec("Result: The packets should be fragmented and received in symbols.");
1475
    TestSpec("        The last packet should be delayed and sent once the first");
1476
    TestSpec("        packet has been accepted.");
1477 40 magro732
    ---------------------------------------------------------------------------
1478 51 magro732
    TestCaseStart("TG_RioSerial-TC4-Step2");
1479 40 magro732
    ---------------------------------------------------------------------------
1480
    -- REMARK: 32 packet should ideally be supported, not just 31...fix.
1481
    for i in 0 to 4 loop
1482
      OutboundSymbolIdle;
1483
      InboundSymbolIdle;
1484
    end loop;
1485
 
1486
    for i in 1 to 31 loop
1487
      -- Create a frame.
1488
      CreateRandomPayload(payload.data, seed1, seed2);
1489
      payload.length := 3+i;
1490
      frame := RioFrameCreate(ackId=>"UUUUU", vc=>'0', crf=>'0', prio=>"00",
1491
                              tt=>"01", ftype=>"0000",
1492
                              sourceId=>x"0000", destId=>x"0000",
1493
                              payload=>payload);
1494
      OutboundFrame(frame);
1495
      frame.payload(0)(31 downto 27) := std_logic_vector(to_unsigned(i mod 32, 5));
1496 4 magro732
 
1497 40 magro732
      -- Receive the frame.
1498
      OutboundSymbolControl(RioControlSymbolCreate(STYPE0_STATUS, "01100", "11111",
1499
                                                   STYPE1_START_OF_PACKET, "000"));
1500
      InboundSymbolIdle;
1501
      for i in 0 to frame.length-1 loop
1502
        OutboundSymbolData(frame.payload(i));
1503
        InboundSymbolIdle;
1504
      end loop;
1505
    end loop;
1506
    OutboundSymbolControl(RioControlSymbolCreate(STYPE0_STATUS, "01100", "11111",
1507
                                                 STYPE1_END_OF_PACKET, "000"));
1508
    InboundSymbolIdle;
1509
 
1510
    -- Create a frame that cannot be sent since there are no available ackids left.
1511
    CreateRandomPayload(payload.data, seed1, seed2);
1512
    payload.length := 3+32;
1513
    frame := RioFrameCreate(ackId=>"UUUUU", vc=>'0', crf=>'0', prio=>"00",
1514
                            tt=>"01", ftype=>"0000",
1515
                            sourceId=>x"0000", destId=>x"0000",
1516
                            payload=>payload);
1517
    OutboundFrame(frame);
1518
    frame.payload(0)(31 downto 27) := std_logic_vector(to_unsigned(0, 5));
1519
 
1520
    -- Send acknowledge that the frames was received.
1521
    OutboundSymbolIdle;
1522
    InboundSymbolControl(
1523
      RioControlSymbolCreate(STYPE0_PACKET_ACCEPTED, std_logic_vector(to_unsigned(1, 5)), "11111",
1524
                             STYPE1_NOP, "000"));
1525
    for i in 0 to 7 loop
1526
      OutboundSymbolIdle;
1527
      InboundSymbolIdle;
1528
    end loop;
1529
 
1530
    OutboundSymbolControl(RioControlSymbolCreate(STYPE0_STATUS, "01100", "11111",
1531
                                                 STYPE1_START_OF_PACKET, "000"));
1532
    InboundSymbolIdle;
1533 4 magro732
    for i in 0 to frame.length-1 loop
1534 40 magro732
      OutboundSymbolData(frame.payload(i));
1535
      InboundSymbolIdle;
1536 4 magro732
    end loop;
1537 40 magro732
    OutboundSymbolControl(RioControlSymbolCreate(STYPE0_STATUS, "01100", "11111",
1538
                                                 STYPE1_END_OF_PACKET, "000"));
1539
    InboundSymbolIdle;
1540 4 magro732
 
1541
 
1542 40 magro732
    for i in 2 to 32 loop
1543
      OutboundSymbolIdle;
1544
      InboundSymbolControl(
1545
        RioControlSymbolCreate(STYPE0_PACKET_ACCEPTED, std_logic_vector(to_unsigned(i mod 32, 5)), "11111",
1546
                               STYPE1_NOP, "000"));
1547
    end loop;
1548
    for i in 0 to 4 loop
1549
      OutboundSymbolIdle;
1550
      InboundSymbolIdle;
1551
    end loop;
1552
 
1553
    TestWait(outboundSymbolWriteEmpty, '1', "symbols pending");
1554
    TestCompare(outboundFrameWriteEmpty, '1', "packet pending");
1555
 
1556 4 magro732
    ---------------------------------------------------------------------------
1557 51 magro732
    TestSpec("-----------------------------------------------------------------");
1558
    TestSpec("Step 3:");
1559
    TestSpec("Action: Send an outbound packet with maximum length.");
1560
    TestSpec("Result: The packet should be fragmented and received in symbols.");
1561 4 magro732
    ---------------------------------------------------------------------------
1562 51 magro732
    TestCaseStart("TG_RioSerial-TC4-Step3");
1563 4 magro732
    ---------------------------------------------------------------------------
1564
 
1565
    -- Create the frame.
1566
    CreateRandomPayload(payload.data, seed1, seed2);
1567
    payload.length := 133;
1568
    frame := RioFrameCreate(ackId=>"00001", vc=>'0', crf=>'0', prio=>"00",
1569
                            tt=>"01", ftype=>"0000",
1570
                            sourceId=>x"0000", destId=>x"0000",
1571
                            payload=>payload);
1572 40 magro732
    OutboundFrame(frame);
1573 4 magro732
 
1574 40 magro732
    for i in 0 to 4 loop
1575
      OutboundSymbolIdle;
1576
      InboundSymbolIdle;
1577
    end loop;
1578 4 magro732
 
1579 40 magro732
    -- Receive the frame.
1580
    OutboundSymbolControl(RioControlSymbolCreate(STYPE0_STATUS, "01100", "11111",
1581
                                                 STYPE1_START_OF_PACKET, "000"));
1582
    InboundSymbolIdle;
1583 4 magro732
    for i in 0 to frame.length-1 loop
1584 40 magro732
      OutboundSymbolData(frame.payload(i));
1585
      InboundSymbolIdle;
1586 4 magro732
    end loop;
1587 40 magro732
    OutboundSymbolControl(RioControlSymbolCreate(STYPE0_STATUS, "01100", "11111",
1588
                                                 STYPE1_END_OF_PACKET, "000"));
1589
    InboundSymbolIdle;
1590 4 magro732
 
1591
    -- Send acknowledge that the frame was received.
1592 40 magro732
    OutboundSymbolIdle;
1593
    InboundSymbolControl(RioControlSymbolCreate(STYPE0_PACKET_ACCEPTED, "00001", "11111",
1594
                                                STYPE1_NOP, "000"));
1595
    for i in 0 to 4 loop
1596
      OutboundSymbolIdle;
1597
      InboundSymbolIdle;
1598
    end loop;
1599 4 magro732
 
1600 40 magro732
    TestWait(outboundSymbolWriteEmpty, '1', "symbols pending");
1601
    TestCompare(outboundFrameWriteEmpty, '1', "packet pending");
1602
 
1603
    ---------------------------------------------------------------------------
1604 51 magro732
    TestSpec("-----------------------------------------------------------------");
1605
    TestSpec("Step 4:");
1606
    TestSpec("Action: Send a packet and confirm it with packet-retry.");
1607
    TestSpec("Result: A restart-from-retry should be transmitted and the packet");
1608
    TestSpec("        should be retransmitted.");
1609 4 magro732
    ---------------------------------------------------------------------------
1610 51 magro732
    TestCaseStart("TG_RioSerial-TC4-Step4");
1611 4 magro732
    ---------------------------------------------------------------------------
1612
 
1613
    -- Create the frame.
1614
    CreateRandomPayload(payload.data, seed1, seed2);
1615
    payload.length := 4;
1616
    frame := RioFrameCreate(ackId=>"00010", vc=>'0', crf=>'0', prio=>"00",
1617
                            tt=>"01", ftype=>"0000",
1618
                            sourceId=>x"0000", destId=>x"0000",
1619
                            payload=>payload);
1620 40 magro732
    OutboundFrame(frame);
1621 4 magro732
 
1622 40 magro732
    for i in 0 to 4 loop
1623
      OutboundSymbolIdle;
1624
      InboundSymbolIdle;
1625
    end loop;
1626
 
1627
    -- Send the frame and acknowledge it with packet-retry.
1628
    OutboundSymbolControl(RioControlSymbolCreate(STYPE0_STATUS, "01100", "11111",
1629
                                                 STYPE1_START_OF_PACKET, "000"));
1630
    InboundSymbolIdle;
1631 4 magro732
    for i in 0 to frame.length-1 loop
1632 40 magro732
      OutboundSymbolData(frame.payload(i));
1633
      InboundSymbolIdle;
1634 4 magro732
    end loop;
1635 40 magro732
    OutboundSymbolControl(RioControlSymbolCreate(STYPE0_STATUS, "01100", "11111",
1636
                                                 STYPE1_END_OF_PACKET, "000"));
1637
    InboundSymbolControl(RioControlSymbolCreate(STYPE0_PACKET_RETRY, "00010", "11111",
1638
                                                STYPE1_NOP, "000"));
1639
    for i in 0 to 6 loop
1640
      OutboundSymbolIdle;
1641
      InboundSymbolIdle;
1642
    end loop;
1643 4 magro732
 
1644
    -- Receive the acknowledgement for the retransmission.
1645 40 magro732
    OutboundSymbolControl(RioControlSymbolCreate(STYPE0_STATUS, "01100", "11111",
1646
                                                 STYPE1_RESTART_FROM_RETRY, "000"));
1647
    InboundSymbolIdle;
1648 4 magro732
 
1649 40 magro732
    OutboundSymbolIdle;
1650
    InboundSymbolIdle;
1651
 
1652
    -- Receive the retransmitted frame.
1653
    OutboundSymbolControl(RioControlSymbolCreate(STYPE0_STATUS, "01100", "11111",
1654
                                                 STYPE1_START_OF_PACKET, "000"));
1655
    InboundSymbolIdle;
1656 4 magro732
    for i in 0 to frame.length-1 loop
1657 40 magro732
      OutboundSymbolData(frame.payload(i));
1658
      InboundSymbolIdle;
1659 4 magro732
    end loop;
1660 40 magro732
    OutboundSymbolControl(RioControlSymbolCreate(STYPE0_STATUS, "01100", "11111",
1661
                                                 STYPE1_END_OF_PACKET, "000"));
1662
    InboundSymbolIdle;
1663 4 magro732
 
1664 40 magro732
    -- Send acknowledge that the frame was received.
1665
    InboundSymbolControl(RioControlSymbolCreate(STYPE0_PACKET_ACCEPTED, "00010", "11111",
1666
                                                STYPE1_NOP, "000"));
1667
    OutboundSymbolIdle;
1668 4 magro732
 
1669 40 magro732
    for i in 0 to 4 loop
1670
      OutboundSymbolIdle;
1671
      InboundSymbolIdle;
1672
    end loop;
1673
 
1674
    TestWait(outboundSymbolWriteEmpty, '1', "symbols pending");
1675
    TestCompare(outboundFrameWriteEmpty, '1', "packet pending");
1676 4 magro732
 
1677
    ---------------------------------------------------------------------------
1678 51 magro732
    TestSpec("-----------------------------------------------------------------");
1679
    TestSpec("Step 5:");
1680
    TestSpec("Action: Send a packet and confirm it with packet-not-accepted. ");
1681
    TestSpec("Result: A link-request should be transmitted and the packet should");
1682
    TestSpec("        be retransmitted.");
1683 4 magro732
    ---------------------------------------------------------------------------
1684 51 magro732
    TestCaseStart("TG_RioSerial-TC4-Step5");
1685 4 magro732
    ---------------------------------------------------------------------------
1686
 
1687
    -- Create the frame.
1688
    CreateRandomPayload(payload.data, seed1, seed2);
1689
    payload.length := 5;
1690
    frame := RioFrameCreate(ackId=>"00011", vc=>'0', crf=>'0', prio=>"00",
1691
                            tt=>"01", ftype=>"0000",
1692
                            sourceId=>x"0000", destId=>x"0000",
1693
                            payload=>payload);
1694 40 magro732
    OutboundFrame(frame);
1695 4 magro732
 
1696 40 magro732
    -- Receive the frame.
1697
    for i in 0 to 4 loop
1698
      OutboundSymbolIdle;
1699
      InboundSymbolIdle;
1700
    end loop;
1701
    OutboundSymbolControl(RioControlSymbolCreate(STYPE0_STATUS, "01100", "11111",
1702
                                                 STYPE1_START_OF_PACKET, "000"));
1703
    InboundSymbolIdle;
1704 4 magro732
    for i in 0 to frame.length-1 loop
1705 40 magro732
      OutboundSymbolData(frame.payload(i));
1706
      InboundSymbolIdle;
1707 4 magro732
    end loop;
1708 40 magro732
    OutboundSymbolControl(RioControlSymbolCreate(STYPE0_STATUS, "01100", "11111",
1709
                                                 STYPE1_END_OF_PACKET, "000"));
1710
    InboundSymbolControl(RioControlSymbolCreate(STYPE0_PACKET_NOT_ACCEPTED, "00000", "11111",
1711
                                                STYPE1_NOP, "000"));
1712 4 magro732
 
1713 40 magro732
    -- Receive the link-request and answer back with a link-response.
1714
    for i in 0 to 6 loop
1715
      OutboundSymbolIdle;
1716
      InboundSymbolIdle;
1717
    end loop;
1718
    OutboundSymbolControl(RioControlSymbolCreate(STYPE0_STATUS, "01100", "11111",
1719
                                                 STYPE1_LINK_REQUEST, "100"));
1720
    InboundSymbolControl(RioControlSymbolCreate(STYPE0_LINK_RESPONSE, "00011", "11111",
1721
                                                STYPE1_NOP, "000"));
1722 4 magro732
 
1723 40 magro732
    -- Receive the retransmitted frame.
1724
    -- Allow some ticks to pass to let the transmitter recover the error.
1725
    for i in 0 to 8 loop
1726
      OutboundSymbolIdle;
1727
      InboundSymbolIdle;
1728
    end loop;
1729
    OutboundSymbolControl(RioControlSymbolCreate(STYPE0_STATUS, "01100", "11111",
1730
                                                 STYPE1_START_OF_PACKET, "000"));
1731
    InboundSymbolIdle;
1732 4 magro732
    for i in 0 to frame.length-1 loop
1733 40 magro732
      OutboundSymbolData(frame.payload(i));
1734
      InboundSymbolIdle;
1735 4 magro732
    end loop;
1736 40 magro732
    OutboundSymbolControl(RioControlSymbolCreate(STYPE0_STATUS, "01100", "11111",
1737
                                                 STYPE1_END_OF_PACKET, "000"));
1738
    InboundSymbolIdle;
1739 4 magro732
 
1740 40 magro732
    -- Send acknowledge that the frame was received.
1741
    OutboundSymbolIdle;
1742
    InboundSymbolControl(RioControlSymbolCreate(STYPE0_PACKET_ACCEPTED, "00011", "11111",
1743
                                                STYPE1_NOP, "000"));
1744
    for i in 0 to 4 loop
1745
      OutboundSymbolIdle;
1746
      InboundSymbolIdle;
1747
    end loop;
1748 4 magro732
 
1749 40 magro732
    TestWait(outboundSymbolWriteEmpty, '1', "symbols pending");
1750
    TestCompare(outboundFrameWriteEmpty, '1', "packet pending");
1751 4 magro732
 
1752
    ---------------------------------------------------------------------------
1753 51 magro732
    TestSpec("-----------------------------------------------------------------");
1754
    TestSpec("Step 6:");
1755
    TestSpec("Action: Let a packet timeout expire. Then answer with link-response.");
1756
    TestSpec("Result: A link-request should be transmitted and the packet should");
1757
    TestSpec("        be retransmitted.");
1758 4 magro732
    ---------------------------------------------------------------------------
1759 51 magro732
    TestCaseStart("TG_RioSerial-TC4-Step6");
1760 4 magro732
    ---------------------------------------------------------------------------
1761
 
1762
    -- Create the frame.
1763
    CreateRandomPayload(payload.data, seed1, seed2);
1764
    payload.length := 5;
1765
    frame := RioFrameCreate(ackId=>"00100", vc=>'0', crf=>'0', prio=>"00",
1766
                            tt=>"01", ftype=>"0000",
1767
                            sourceId=>x"0000", destId=>x"0000",
1768
                            payload=>payload);
1769 40 magro732
    OutboundFrame(frame);
1770 4 magro732
 
1771
    -- Receive the frame.
1772 40 magro732
    for i in 0 to 4 loop
1773
      OutboundSymbolIdle;
1774
      InboundSymbolIdle;
1775
    end loop;
1776
    OutboundSymbolControl(RioControlSymbolCreate(STYPE0_STATUS, "01100", "11111",
1777
                                                 STYPE1_START_OF_PACKET, "000"));
1778
    InboundSymbolIdle;
1779 4 magro732
    for i in 0 to frame.length-1 loop
1780 40 magro732
      OutboundSymbolData(frame.payload(i));
1781
      InboundSymbolIdle;
1782 4 magro732
    end loop;
1783 40 magro732
    OutboundSymbolControl(RioControlSymbolCreate(STYPE0_STATUS, "01100", "11111",
1784
                                                 STYPE1_END_OF_PACKET, "000"));
1785
    InboundSymbolIdle;
1786 4 magro732
 
1787
    -- Wait a while to let the timer expire and receive the link-request.
1788 40 magro732
    for j in 1 to 7 loop
1789
      for i in 0 to 256 loop
1790
        OutboundSymbolIdle;
1791
        InboundSymbolIdle;
1792
      end loop;
1793
      OutboundSymbolControl(RioControlSymbolCreate(STYPE0_STATUS, "01100", "11111",
1794
                                                   STYPE1_NOP, "000"));
1795
      InboundSymbolIdle;
1796
      TestWait(outboundSymbolWriteEmpty, '1', "symbols pending");
1797 4 magro732
    end loop;
1798 40 magro732
    for i in 0 to 242 loop
1799
      OutboundSymbolIdle;
1800
      InboundSymbolIdle;
1801
    end loop;
1802 4 magro732
 
1803 40 magro732
    -- Receive the link-request and answer back with a link-response.
1804
    OutboundSymbolControl(RioControlSymbolCreate(STYPE0_STATUS, "01100", "11111",
1805
                                                 STYPE1_LINK_REQUEST, "100"));
1806
    InboundSymbolControl(RioControlSymbolCreate(STYPE0_LINK_RESPONSE, "00100", "11111",
1807
                                                STYPE1_NOP, "000"));
1808
 
1809 4 magro732
    -- Receive the retransmitted frame.
1810 40 magro732
    -- Allow some ticks to pass to let the transmitter recover the error.
1811
    for i in 0 to 8 loop
1812
      OutboundSymbolIdle;
1813
      InboundSymbolIdle;
1814
    end loop;
1815
    OutboundSymbolControl(RioControlSymbolCreate(STYPE0_STATUS, "01100", "11111",
1816
                                                 STYPE1_START_OF_PACKET, "000"));
1817
    InboundSymbolIdle;
1818 4 magro732
    for i in 0 to frame.length-1 loop
1819 40 magro732
      OutboundSymbolData(frame.payload(i));
1820
      InboundSymbolIdle;
1821 4 magro732
    end loop;
1822 40 magro732
    OutboundSymbolControl(RioControlSymbolCreate(STYPE0_STATUS, "01100", "11111",
1823
                                                 STYPE1_END_OF_PACKET, "000"));
1824
    InboundSymbolIdle;
1825 4 magro732
 
1826 40 magro732
    -- Send acknowledge that the frame was received.
1827
    OutboundSymbolIdle;
1828
    InboundSymbolControl(RioControlSymbolCreate(STYPE0_PACKET_ACCEPTED, "00100", "11111",
1829
                                                STYPE1_NOP, "000"));
1830
    for i in 0 to 4 loop
1831
      OutboundSymbolIdle;
1832
      InboundSymbolIdle;
1833
    end loop;
1834 4 magro732
 
1835 40 magro732
    TestWait(outboundSymbolWriteEmpty, '1', "symbols pending");
1836
    TestCompare(outboundFrameWriteEmpty, '1', "packet pending");
1837 4 magro732
 
1838
    ---------------------------------------------------------------------------
1839 51 magro732
    TestSpec("-----------------------------------------------------------------");
1840
    TestSpec("Step 7:");
1841
    TestSpec("Action: Let a packet timeout expire. Then answer with link-response");
1842
    TestSpec("        that indicates that the packet was received.");
1843
    TestSpec("Result: A link-request should be transmitted and the packet should");
1844
    TestSpec("        not be retransmitted.");
1845 4 magro732
    ---------------------------------------------------------------------------
1846 51 magro732
    TestCaseStart("TG_RioSerial-TC4-Step7");
1847 4 magro732
    ---------------------------------------------------------------------------
1848
 
1849
    -- Create the frame.
1850
    CreateRandomPayload(payload.data, seed1, seed2);
1851
    payload.length := 6;
1852
    frame := RioFrameCreate(ackId=>"00101", vc=>'0', crf=>'0', prio=>"00",
1853
                            tt=>"01", ftype=>"0000",
1854
                            sourceId=>x"0000", destId=>x"0000",
1855
                            payload=>payload);
1856 40 magro732
    OutboundFrame(frame);
1857 4 magro732
 
1858
    -- Receive the frame.
1859 40 magro732
    for i in 0 to 4 loop
1860
      OutboundSymbolIdle;
1861
      InboundSymbolIdle;
1862
    end loop;
1863
    OutboundSymbolControl(RioControlSymbolCreate(STYPE0_STATUS, "01100", "11111",
1864
                                                 STYPE1_START_OF_PACKET, "000"));
1865
    InboundSymbolIdle;
1866 4 magro732
    for i in 0 to frame.length-1 loop
1867 40 magro732
      OutboundSymbolData(frame.payload(i));
1868
      InboundSymbolIdle;
1869 4 magro732
    end loop;
1870 40 magro732
    OutboundSymbolControl(RioControlSymbolCreate(STYPE0_STATUS, "01100", "11111",
1871
                                                 STYPE1_END_OF_PACKET, "000"));
1872
    InboundSymbolIdle;
1873 4 magro732
 
1874
    -- Wait a while to let the timer expire and receive the link-request.
1875 40 magro732
    for j in 1 to 7 loop
1876
      for i in 0 to 256 loop
1877
        OutboundSymbolIdle;
1878
        InboundSymbolIdle;
1879
      end loop;
1880
      OutboundSymbolControl(RioControlSymbolCreate(STYPE0_STATUS, "01100", "11111",
1881
                                                   STYPE1_NOP, "000"));
1882
      InboundSymbolIdle;
1883
      TestWait(outboundSymbolWriteEmpty, '1', "symbols pending");
1884 4 magro732
    end loop;
1885 40 magro732
    for i in 0 to 242 loop
1886
      OutboundSymbolIdle;
1887
      InboundSymbolIdle;
1888
    end loop;
1889 4 magro732
 
1890 40 magro732
    -- Receive the link-request and answer back with a link-response.
1891 4 magro732
    -- Send a link-response that indicates that the frame was received to make
1892 40 magro732
    -- the transmitter go back to normal mode.
1893
    OutboundSymbolControl(RioControlSymbolCreate(STYPE0_STATUS, "01100", "11111",
1894
                                                 STYPE1_LINK_REQUEST, "100"));
1895
    InboundSymbolControl(RioControlSymbolCreate(STYPE0_LINK_RESPONSE, "00110", "11111",
1896
                                                STYPE1_NOP, "000"));
1897
    for i in 0 to 8 loop
1898
      OutboundSymbolIdle;
1899
      InboundSymbolIdle;
1900
    end loop;
1901 4 magro732
 
1902 40 magro732
    TestWait(outboundSymbolWriteEmpty, '1', "symbols pending");
1903
    TestCompare(outboundFrameWriteEmpty, '1', "packet pending");
1904
 
1905 4 magro732
    ---------------------------------------------------------------------------
1906 51 magro732
    TestSpec("-----------------------------------------------------------------");
1907
    TestSpec("Step 8:");
1908
    TestSpec("Action: Let a packet timeout expire. No more replies.");
1909
    TestSpec("Result: Three link-requests should be transmitted. When the third");
1910
    TestSpec("        times out the link will be restarted.");
1911 4 magro732
    ---------------------------------------------------------------------------
1912 51 magro732
    TestCaseStart("TG_RioSerial-TC4-Step8");
1913 4 magro732
    ---------------------------------------------------------------------------
1914
 
1915
    -- Create the frame.
1916
    CreateRandomPayload(payload.data, seed1, seed2);
1917
    payload.length := 7;
1918
    frame := RioFrameCreate(ackId=>"00110", vc=>'0', crf=>'0', prio=>"00",
1919
                            tt=>"01", ftype=>"0000",
1920
                            sourceId=>x"0000", destId=>x"0000",
1921
                            payload=>payload);
1922 40 magro732
    OutboundFrame(frame);
1923 4 magro732
 
1924
    -- Receive the frame.
1925 40 magro732
    for i in 0 to 4 loop
1926
      OutboundSymbolIdle;
1927
      InboundSymbolIdle;
1928
    end loop;
1929
    OutboundSymbolControl(RioControlSymbolCreate(STYPE0_STATUS, "01100", "11111",
1930
                                                 STYPE1_START_OF_PACKET, "000"));
1931
    InboundSymbolIdle;
1932 4 magro732
    for i in 0 to frame.length-1 loop
1933 40 magro732
      OutboundSymbolData(frame.payload(i));
1934
      InboundSymbolIdle;
1935 4 magro732
    end loop;
1936 40 magro732
    OutboundSymbolControl(RioControlSymbolCreate(STYPE0_STATUS, "01100", "11111",
1937
                                                 STYPE1_END_OF_PACKET, "000"));
1938
    InboundSymbolIdle;
1939 4 magro732
 
1940 40 magro732
    -- Let 3 link-requests timeout.
1941
    for k in 1 to 3 loop
1942
      -- Wait a while to let the timer expire and receive the link-request.
1943
      for j in 1 to 7 loop
1944
        for i in 0 to 256 loop
1945
          OutboundSymbolIdle;
1946
          InboundSymbolIdle;
1947
        end loop;
1948
        OutboundSymbolControl(RioControlSymbolCreate(STYPE0_STATUS, "01100", "11111",
1949
                                                     STYPE1_NOP, "000"));
1950
        InboundSymbolIdle;
1951
        TestWait(outboundSymbolWriteEmpty, '1', "symbols pending");
1952
      end loop;
1953
      for i in 0 to 242 loop
1954
        OutboundSymbolIdle;
1955
        InboundSymbolIdle;
1956
      end loop;
1957
      OutboundSymbolControl(RioControlSymbolCreate(STYPE0_STATUS, "01100", "11111",
1958
                                                   STYPE1_LINK_REQUEST, "100"));
1959
      InboundSymbolIdle;
1960
      TestWait(outboundSymbolWriteEmpty, '1', "symbols pending");
1961 4 magro732
    end loop;
1962 40 magro732
    -- Wait for the third link-request to timeout.
1963
    for j in 1 to 7 loop
1964
      for i in 0 to 256 loop
1965
        OutboundSymbolIdle;
1966
        InboundSymbolIdle;
1967
      end loop;
1968
      OutboundSymbolControl(RioControlSymbolCreate(STYPE0_STATUS, "01100", "11111",
1969
                                                   STYPE1_NOP, "000"));
1970
      InboundSymbolIdle;
1971
      TestWait(outboundSymbolWriteEmpty, '1', "symbols pending");
1972 4 magro732
    end loop;
1973 40 magro732
    for i in 0 to 240 loop
1974
      OutboundSymbolIdle;
1975
      InboundSymbolIdle;
1976 4 magro732
    end loop;
1977 40 magro732
    TestWait(outboundSymbolWriteEmpty, '1', "symbols pending");
1978
    linkInitializedExpected <= '0';
1979 4 magro732
 
1980
    -- Reinitialize the transmitter.
1981 40 magro732
    OutboundSymbolIdle;
1982
    InboundSymbolControl(RioControlSymbolCreate(STYPE0_STATUS, "00110", "11111",
1983
                                                STYPE1_NOP, "000"));
1984
    for i in 0 to 14 loop
1985
      OutboundSymbolIdle;
1986
      InboundSymbolIdle;
1987 4 magro732
    end loop;
1988 40 magro732
    for j in 0 to 13 loop
1989
      OutboundSymbolControl(RioControlSymbolCreate(STYPE0_STATUS, "01100", "11111",
1990
                                                   STYPE1_NOP, "000"));
1991
      InboundSymbolIdle;
1992
      for i in 0 to 16 loop
1993
        OutboundSymbolIdle;
1994
        InboundSymbolIdle;
1995 4 magro732
      end loop;
1996
    end loop;
1997 40 magro732
    TestWait(outboundSymbolWriteEmpty, '1', "symbols pending");
1998
    linkInitializedExpected <= '1';
1999
    OutboundSymbolControl(RioControlSymbolCreate(STYPE0_STATUS, "01100", "11111",
2000
                                                 STYPE1_NOP, "000"));
2001
    InboundSymbolIdle;
2002 4 magro732
 
2003
    -- Receive the frame.
2004 40 magro732
    for i in 0 to 2 loop
2005
      OutboundSymbolIdle;
2006
      InboundSymbolIdle;
2007
    end loop;
2008
    OutboundSymbolControl(RioControlSymbolCreate(STYPE0_STATUS, "01100", "11111",
2009
                                                 STYPE1_START_OF_PACKET, "000"));
2010
    InboundSymbolIdle;
2011 4 magro732
    for i in 0 to frame.length-1 loop
2012 40 magro732
      OutboundSymbolData(frame.payload(i));
2013
      InboundSymbolIdle;
2014 4 magro732
    end loop;
2015 40 magro732
    OutboundSymbolControl(RioControlSymbolCreate(STYPE0_STATUS, "01100", "11111",
2016
                                                 STYPE1_END_OF_PACKET, "000"));
2017
    InboundSymbolControl(RioControlSymbolCreate(STYPE0_PACKET_ACCEPTED, "00110", "11111",
2018
                                                STYPE1_NOP, "000"));
2019
    for i in 0 to 4 loop
2020
      OutboundSymbolIdle;
2021
      InboundSymbolIdle;
2022
    end loop;
2023 4 magro732
 
2024 40 magro732
    TestWait(outboundSymbolWriteEmpty, '1', "symbols pending");
2025
    TestCompare(outboundFrameWriteEmpty, '1', "packet pending");
2026 4 magro732
 
2027
    ---------------------------------------------------------------------------
2028 51 magro732
    TestSpec("-----------------------------------------------------------------");
2029
    TestSpec("Step 9:");
2030
    TestSpec("Action: Let a packet timeout expire. Then answer with totally ");
2031
    TestSpec("        unexpected ackId.");
2032
    TestSpec("Result: A link request should be transmitted and the link should ");
2033
    TestSpec("        be restarted.");
2034 4 magro732
    ---------------------------------------------------------------------------
2035 51 magro732
    TestCaseStart("TG_RioSerial-TC4-Step9");
2036 4 magro732
    ---------------------------------------------------------------------------
2037
 
2038
    -- Create the frame.
2039
    CreateRandomPayload(payload.data, seed1, seed2);
2040
    payload.length := 8;
2041
    frame := RioFrameCreate(ackId=>"00111", vc=>'0', crf=>'0', prio=>"00",
2042
                            tt=>"01", ftype=>"0000",
2043
                            sourceId=>x"0000", destId=>x"0000",
2044
                            payload=>payload);
2045 40 magro732
    OutboundFrame(frame);
2046 4 magro732
 
2047
    -- Receive the frame.
2048 40 magro732
    for i in 0 to 4 loop
2049
      OutboundSymbolIdle;
2050
      InboundSymbolIdle;
2051
    end loop;
2052
    OutboundSymbolControl(RioControlSymbolCreate(STYPE0_STATUS, "01100", "11111",
2053
                                                 STYPE1_START_OF_PACKET, "000"));
2054
    InboundSymbolIdle;
2055 4 magro732
    for i in 0 to frame.length-1 loop
2056 40 magro732
      OutboundSymbolData(frame.payload(i));
2057
      InboundSymbolIdle;
2058 4 magro732
    end loop;
2059 40 magro732
    OutboundSymbolControl(RioControlSymbolCreate(STYPE0_STATUS, "01100", "11111",
2060
                                                 STYPE1_END_OF_PACKET, "000"));
2061
    InboundSymbolIdle;
2062 4 magro732
 
2063
    -- Wait a while to let the timer expire and receive the link-request.
2064 40 magro732
    for j in 1 to 7 loop
2065
      for i in 0 to 256 loop
2066
        OutboundSymbolIdle;
2067
        InboundSymbolIdle;
2068
      end loop;
2069
      OutboundSymbolControl(RioControlSymbolCreate(STYPE0_STATUS, "01100", "11111",
2070
                                                   STYPE1_NOP, "000"));
2071
      InboundSymbolIdle;
2072
      TestWait(outboundSymbolWriteEmpty, '1', "symbols pending");
2073 4 magro732
    end loop;
2074 40 magro732
    for i in 0 to 242 loop
2075
      OutboundSymbolIdle;
2076
      InboundSymbolIdle;
2077
    end loop;
2078 4 magro732
 
2079 40 magro732
    -- Receive the link-request and answer back with a link-response.
2080
    -- Send a link-response that indicates a totally unexpected ackId.
2081
    OutboundSymbolControl(RioControlSymbolCreate(STYPE0_STATUS, "01100", "11111",
2082
                                                 STYPE1_LINK_REQUEST, "100"));
2083
    InboundSymbolControl(RioControlSymbolCreate(STYPE0_LINK_RESPONSE, "10000", "11111",
2084
                                                STYPE1_NOP, "000"));
2085
    for i in 0 to 4 loop
2086
      OutboundSymbolIdle;
2087
      InboundSymbolIdle;
2088
    end loop;
2089
    TestWait(outboundSymbolWriteEmpty, '1', "symbols pending");
2090
    linkInitializedExpected <= '0';
2091 4 magro732
 
2092
    -- Reinitialize the transmitter.
2093 40 magro732
    OutboundSymbolIdle;
2094
    InboundSymbolControl(RioControlSymbolCreate(STYPE0_STATUS, "00111", "11111",
2095
                                                STYPE1_NOP, "000"));
2096
    for i in 0 to 250 loop
2097
      OutboundSymbolIdle;
2098
      InboundSymbolIdle;
2099 4 magro732
    end loop;
2100 40 magro732
    for j in 0 to 13 loop
2101
      OutboundSymbolControl(RioControlSymbolCreate(STYPE0_STATUS, "01100", "11111",
2102
                                                   STYPE1_NOP, "000"));
2103
      InboundSymbolIdle;
2104
      for i in 0 to 16 loop
2105
        OutboundSymbolIdle;
2106
        InboundSymbolIdle;
2107 4 magro732
      end loop;
2108
    end loop;
2109 40 magro732
    TestWait(outboundSymbolWriteEmpty, '1', "symbols pending");
2110
    linkInitializedExpected <= '1';
2111
    OutboundSymbolControl(RioControlSymbolCreate(STYPE0_STATUS, "01100", "11111",
2112
                                                 STYPE1_NOP, "000"));
2113
    InboundSymbolIdle;
2114 4 magro732
 
2115
    -- Receive the frame.
2116 40 magro732
    for i in 0 to 2 loop
2117
      OutboundSymbolIdle;
2118
      InboundSymbolIdle;
2119
    end loop;
2120
    OutboundSymbolControl(RioControlSymbolCreate(STYPE0_STATUS, "01100", "11111",
2121
                                                 STYPE1_START_OF_PACKET, "000"));
2122
    InboundSymbolIdle;
2123 4 magro732
    for i in 0 to frame.length-1 loop
2124 40 magro732
      OutboundSymbolData(frame.payload(i));
2125
      InboundSymbolIdle;
2126 4 magro732
    end loop;
2127 40 magro732
    OutboundSymbolControl(RioControlSymbolCreate(STYPE0_STATUS, "01100", "11111",
2128
                                                 STYPE1_END_OF_PACKET, "000"));
2129
    InboundSymbolControl(RioControlSymbolCreate(STYPE0_PACKET_ACCEPTED, "00111", "11111",
2130
                                                STYPE1_NOP, "000"));
2131
    for i in 0 to 4 loop
2132
      OutboundSymbolIdle;
2133
      InboundSymbolIdle;
2134
    end loop;
2135 4 magro732
 
2136 40 magro732
    TestWait(outboundSymbolWriteEmpty, '1', "symbols pending");
2137
    TestCompare(outboundFrameWriteEmpty, '1', "packet pending");
2138
 
2139 4 magro732
    ---------------------------------------------------------------------------
2140 51 magro732
    TestSpec("-----------------------------------------------------------------");
2141
    TestSpec("Step 10:");
2142
    TestSpec("Action: Send status with unexpected ackId in normal operation.");
2143
    TestSpec("Result: The transmitter should disregard the error.");
2144 4 magro732
    ---------------------------------------------------------------------------
2145 51 magro732
    TestCaseStart("TG_RioSerial-TC4-Step10");
2146 4 magro732
    ---------------------------------------------------------------------------
2147
 
2148
    -- Send a status with unexpected ackId.
2149 40 magro732
    OutboundSymbolIdle;
2150
    InboundSymbolControl(RioControlSymbolCreate(STYPE0_STATUS, "10000", "11111",
2151
                                                STYPE1_NOP, "000"));
2152 4 magro732
 
2153
    -- Receive no change.
2154 40 magro732
    for i in 0 to 250 loop
2155
      OutboundSymbolIdle;
2156
      InboundSymbolIdle;
2157
    end loop;
2158
    OutboundSymbolControl(RioControlSymbolCreate(STYPE0_STATUS, "01100", "11111",
2159
                                                 STYPE1_NOP, "000"));
2160
    InboundSymbolIdle;
2161 4 magro732
 
2162 40 magro732
    TestWait(outboundSymbolWriteEmpty, '1', "symbols pending");
2163
    TestCompare(outboundFrameWriteEmpty, '1', "packet pending");
2164
 
2165 4 magro732
    ---------------------------------------------------------------------------
2166 51 magro732
    TestSpec("-----------------------------------------------------------------");
2167
    TestSpec("Step 11:");
2168
    TestSpec("Action: Send packet-retry with unexpected ackId in normal operation.");
2169
    TestSpec("Result: The transmitter should enter output-error-stopped.");
2170 4 magro732
    ---------------------------------------------------------------------------
2171 51 magro732
    TestCaseStart("TG_RioSerial-TC4-Step11");
2172 4 magro732
    ---------------------------------------------------------------------------
2173
 
2174
    -- Send a packet-retry with unexpected ackId.
2175 40 magro732
    OutboundSymbolIdle;
2176
    InboundSymbolControl(RioControlSymbolCreate(STYPE0_PACKET_RETRY, "10000", "11111",
2177
                                                STYPE1_NOP, "000"));
2178
    for i in 0 to 6 loop
2179
      OutboundSymbolIdle;
2180
      InboundSymbolIdle;
2181
    end loop;
2182 4 magro732
 
2183
    -- Receive link-request.
2184 40 magro732
    OutboundSymbolControl(RioControlSymbolCreate(STYPE0_STATUS, "01100", "11111",
2185
                                                 STYPE1_LINK_REQUEST, "100"));
2186
    InboundSymbolControl(RioControlSymbolCreate(STYPE0_LINK_RESPONSE, "01000", "11111",
2187
                                                STYPE1_NOP, "000"));
2188
    TestWait(outboundSymbolWriteEmpty, '1', "symbols pending");
2189
 
2190
    -- Create a frame.
2191 4 magro732
    CreateRandomPayload(payload.data, seed1, seed2);
2192
    payload.length := 10;
2193
    frame := RioFrameCreate(ackId=>"01000", vc=>'0', crf=>'0', prio=>"00",
2194
                            tt=>"01", ftype=>"0000",
2195
                            sourceId=>x"0000", destId=>x"0000",
2196
                            payload=>payload);
2197 40 magro732
    OutboundFrame(frame);
2198 4 magro732
 
2199 40 magro732
    -- Wait for the transmitter to recover the previous error.
2200
    for i in 0 to 8 loop
2201
      OutboundSymbolIdle;
2202
      InboundSymbolIdle;
2203
    end loop;
2204
 
2205 4 magro732
    -- Receive the frame.
2206 40 magro732
    OutboundSymbolControl(RioControlSymbolCreate(STYPE0_STATUS, "01100", "11111",
2207
                                                 STYPE1_START_OF_PACKET, "000"));
2208
    InboundSymbolIdle;
2209 4 magro732
    for i in 0 to frame.length-1 loop
2210 40 magro732
      OutboundSymbolData(frame.payload(i));
2211
      InboundSymbolIdle;
2212 4 magro732
    end loop;
2213 40 magro732
    OutboundSymbolControl(RioControlSymbolCreate(STYPE0_STATUS, "01100", "11111",
2214
                                                 STYPE1_END_OF_PACKET, "000"));
2215
    InboundSymbolControl(RioControlSymbolCreate(STYPE0_PACKET_ACCEPTED, "01000", "11111",
2216
                                                STYPE1_NOP, "000"));
2217
    for i in 0 to 4 loop
2218
      OutboundSymbolIdle;
2219
      InboundSymbolIdle;
2220
    end loop;
2221
 
2222
    TestWait(outboundSymbolWriteEmpty, '1', "symbols pending");
2223
    TestCompare(outboundFrameWriteEmpty, '1', "packet pending");
2224 4 magro732
 
2225
    ---------------------------------------------------------------------------
2226 51 magro732
    TestSpec("-----------------------------------------------------------------");
2227
    TestSpec("Step 12:");
2228
    TestSpec("Action: Send packet-accepted with unexpected ackId in normal ");
2229
    TestSpec("        operation.");
2230
    TestSpec("Result: The transmitter should enter output-error-stopped.");
2231 4 magro732
    ---------------------------------------------------------------------------
2232 51 magro732
    TestCaseStart("TG_RioSerial-TC4-Step12");
2233 4 magro732
    ---------------------------------------------------------------------------
2234 14 magro732
 
2235 4 magro732
    -- Send a packet-accepted with unexpected ackId.
2236 40 magro732
    OutboundSymbolIdle;
2237
    InboundSymbolControl(RioControlSymbolCreate(STYPE0_PACKET_ACCEPTED, "10000", "11111",
2238
                                                STYPE1_NOP, "000"));
2239
    for i in 0 to 6 loop
2240
      OutboundSymbolIdle;
2241
      InboundSymbolIdle;
2242
    end loop;
2243 4 magro732
 
2244
    -- Receive link-request.
2245 40 magro732
    OutboundSymbolControl(RioControlSymbolCreate(STYPE0_STATUS, "01100", "11111",
2246
                                                 STYPE1_LINK_REQUEST, "100"));
2247
    InboundSymbolControl(RioControlSymbolCreate(STYPE0_LINK_RESPONSE, "01001", "11111",
2248
                                                STYPE1_NOP, "000"));
2249
    TestWait(outboundSymbolWriteEmpty, '1', "symbols pending");
2250
 
2251 4 magro732
    -- Create the frame.
2252
    CreateRandomPayload(payload.data, seed1, seed2);
2253
    payload.length := 11;
2254
    frame := RioFrameCreate(ackId=>"01001", vc=>'0', crf=>'0', prio=>"00",
2255
                            tt=>"01", ftype=>"0000",
2256
                            sourceId=>x"0000", destId=>x"0000",
2257
                            payload=>payload);
2258 40 magro732
    OutboundFrame(frame);
2259 4 magro732
 
2260 40 magro732
    -- Wait for the transmitter to recover the previous error.
2261
    for i in 0 to 8 loop
2262
      OutboundSymbolIdle;
2263
      InboundSymbolIdle;
2264
    end loop;
2265
 
2266 4 magro732
    -- Receive the frame.
2267 40 magro732
    OutboundSymbolControl(RioControlSymbolCreate(STYPE0_STATUS, "01100", "11111",
2268
                                                 STYPE1_START_OF_PACKET, "000"));
2269
    InboundSymbolIdle;
2270 4 magro732
    for i in 0 to frame.length-1 loop
2271 40 magro732
      OutboundSymbolData(frame.payload(i));
2272
      InboundSymbolIdle;
2273 4 magro732
    end loop;
2274 40 magro732
    OutboundSymbolControl(RioControlSymbolCreate(STYPE0_STATUS, "01100", "11111",
2275
                                                 STYPE1_END_OF_PACKET, "000"));
2276
    InboundSymbolControl(RioControlSymbolCreate(STYPE0_PACKET_ACCEPTED, "01001", "11111",
2277
                                                STYPE1_NOP, "000"));
2278
    for i in 0 to 4 loop
2279
      OutboundSymbolIdle;
2280
      InboundSymbolIdle;
2281
    end loop;
2282
 
2283
    TestWait(outboundSymbolWriteEmpty, '1', "symbols pending");
2284
    TestCompare(outboundFrameWriteEmpty, '1', "packet pending");
2285 4 magro732
 
2286
    ---------------------------------------------------------------------------
2287 51 magro732
    TestSpec("-----------------------------------------------------------------");
2288
    TestSpec("Step 13:");
2289
    TestSpec("Action: Send a packet and then accept it with unexpected ackId.");
2290
    TestSpec("Result: The transmitter should enter output-error-stopped.");
2291 4 magro732
    ---------------------------------------------------------------------------
2292 51 magro732
    TestCaseStart("TG_RioSerial-TC4-Step13");
2293 4 magro732
    ---------------------------------------------------------------------------
2294
 
2295
    -- Create the frame.
2296
    CreateRandomPayload(payload.data, seed1, seed2);
2297
    payload.length := 12;
2298
    frame := RioFrameCreate(ackId=>"01010", vc=>'0', crf=>'0', prio=>"00",
2299
                            tt=>"01", ftype=>"0000",
2300
                            sourceId=>x"0000", destId=>x"0000",
2301
                            payload=>payload);
2302 40 magro732
    OutboundFrame(frame);
2303 4 magro732
 
2304
    -- Receive the frame.
2305 40 magro732
    -- Send unexpected ackId in packet-accepted.
2306
    for i in 0 to 4 loop
2307
      OutboundSymbolIdle;
2308
      InboundSymbolIdle;
2309
    end loop;
2310
    OutboundSymbolControl(RioControlSymbolCreate(STYPE0_STATUS, "01100", "11111",
2311
                                                 STYPE1_START_OF_PACKET, "000"));
2312
    InboundSymbolIdle;
2313 4 magro732
    for i in 0 to frame.length-1 loop
2314 40 magro732
      OutboundSymbolData(frame.payload(i));
2315
      InboundSymbolIdle;
2316 4 magro732
    end loop;
2317 40 magro732
    OutboundSymbolControl(RioControlSymbolCreate(STYPE0_STATUS, "01100", "11111",
2318
                                                 STYPE1_END_OF_PACKET, "000"));
2319
    InboundSymbolControl(RioControlSymbolCreate(STYPE0_PACKET_ACCEPTED, "10000", "11111",
2320
                                                STYPE1_NOP, "000"));
2321 4 magro732
 
2322 40 magro732
    -- Receive link-request.
2323
    for i in 0 to 6 loop
2324
      OutboundSymbolIdle;
2325
      InboundSymbolIdle;
2326
    end loop;
2327
    OutboundSymbolControl(RioControlSymbolCreate(STYPE0_STATUS, "01100", "11111",
2328
                                                 STYPE1_LINK_REQUEST, "100"));
2329
    InboundSymbolControl(RioControlSymbolCreate(STYPE0_LINK_RESPONSE, "01011", "11111",
2330
                                                STYPE1_NOP, "000"));
2331 4 magro732
 
2332 40 magro732
    -- Wait some additional ticks to let the transmitter recover the previous error.
2333
    for i in 0 to 6 loop
2334
      OutboundSymbolIdle;
2335
      InboundSymbolIdle;
2336
    end loop;
2337 4 magro732
 
2338 40 magro732
    TestWait(outboundSymbolWriteEmpty, '1', "symbols pending");
2339
    TestCompare(outboundFrameWriteEmpty, '1', "packet pending");
2340
 
2341 4 magro732
    ---------------------------------------------------------------------------
2342 51 magro732
    TestSpec("-----------------------------------------------------------------");
2343
    TestSpec("TG_RioSerial-TC5");
2344
    TestSpec("Description: Test mixed port transmission and reception.");
2345
    TestSpec("Requirement: XXXXX");
2346
    TestSpec("-----------------------------------------------------------------");
2347
    TestSpec("Step 1:");
2348
    TestSpec("Action: Start sending an outbound packet and while in transmission, ");
2349
    TestSpec("        start and complete an inbound packet.");
2350
    TestSpec("Result: The ack for the inbound packet should be inserted into the");
2351
    TestSpec("        outbound packet.");
2352 4 magro732
    ---------------------------------------------------------------------------
2353 51 magro732
    TestCaseStart("TG_RioSerial-TC5-Step1");
2354 4 magro732
    ---------------------------------------------------------------------------
2355
 
2356 40 magro732
    -- Send a long outbound frame.
2357 4 magro732
    CreateRandomPayload(payload.data, seed1, seed2);
2358 40 magro732
    payload.length := 133;
2359
    frameOutbound := RioFrameCreate(ackId=>"01011", vc=>'0', crf=>'0', prio=>"00",
2360
                                    tt=>"01", ftype=>"0000",
2361
                                    sourceId=>x"0000", destId=>x"0000",
2362
                                    payload=>payload);
2363
    OutboundFrame(frameOutbound);
2364 4 magro732
 
2365 40 magro732
    -- Receive a short inbound frame.
2366 4 magro732
    CreateRandomPayload(payload.data, seed1, seed2);
2367 40 magro732
    payload.length := 2;
2368
    frameInbound := RioFrameCreate(ackId=>"01100", vc=>'0', crf=>'0', prio=>"00",
2369 4 magro732
                            tt=>"01", ftype=>"0000",
2370
                            sourceId=>x"0000", destId=>x"0000",
2371
                            payload=>payload);
2372 40 magro732
    InboundFrame(frameInbound);
2373
 
2374 4 magro732
 
2375 40 magro732
    -- Receive the outbound frame and start a short inbound frame at the same time.
2376
    for i in 0 to 4 loop
2377
      OutboundSymbolIdle;
2378
      InboundSymbolIdle;
2379 4 magro732
    end loop;
2380
 
2381 40 magro732
    OutboundSymbolControl(RioControlSymbolCreate(STYPE0_STATUS, "01100", "11111",
2382
                                                 STYPE1_START_OF_PACKET, "000"));
2383
    InboundSymbolIdle;
2384
 
2385
    OutboundSymbolData(frameOutbound.payload(0));
2386
    InboundSymbolControl(RioControlSymbolCreate(STYPE0_STATUS, "10000", "11111",
2387 37 magro732
                                                STYPE1_START_OF_PACKET, "000"));
2388 4 magro732
 
2389 40 magro732
    OutboundSymbolData(frameOutbound.payload(1));
2390
    InboundSymbolData(frameInbound.payload(0));
2391 4 magro732
 
2392 40 magro732
    OutboundSymbolData(frameOutbound.payload(2));
2393
    InboundSymbolData(frameInbound.payload(1));
2394
 
2395
    OutboundSymbolData(frameOutbound.payload(3));
2396
    InboundSymbolData(frameInbound.payload(2));
2397
 
2398
    OutboundSymbolData(frameOutbound.payload(4));
2399
    InboundSymbolControl(RioControlSymbolCreate(STYPE0_STATUS, "10000", "11111",
2400 37 magro732
                                                STYPE1_END_OF_PACKET, "000"));
2401 4 magro732
 
2402 40 magro732
    OutboundSymbolData(frameOutbound.payload(5));
2403
    InboundSymbolIdle;
2404
 
2405
    OutboundSymbolData(frameOutbound.payload(6));
2406
    InboundSymbolIdle;
2407
 
2408
    OutboundSymbolData(frameOutbound.payload(7));
2409
    InboundSymbolIdle;
2410 4 magro732
 
2411 40 magro732
    OutboundSymbolData(frameOutbound.payload(8));
2412
    InboundSymbolIdle;
2413 4 magro732
 
2414 40 magro732
    OutboundSymbolData(frameOutbound.payload(9));
2415
    InboundSymbolIdle;
2416 4 magro732
 
2417 40 magro732
    OutboundSymbolData(frameOutbound.payload(10));
2418
    InboundSymbolIdle;
2419 4 magro732
 
2420 40 magro732
    OutboundSymbolData(frameOutbound.payload(11));
2421
    InboundSymbolIdle;
2422 4 magro732
 
2423 40 magro732
    OutboundSymbolData(frameOutbound.payload(12));
2424
    InboundSymbolIdle;
2425 4 magro732
 
2426 40 magro732
    OutboundSymbolControl(RioControlSymbolCreate(STYPE0_PACKET_ACCEPTED, "01100", "11111",
2427
                                                 STYPE1_NOP, "000"));
2428
    InboundSymbolIdle;
2429 4 magro732
 
2430 40 magro732
    for i in 13 to frameOutbound.length-1 loop
2431
      OutboundSymbolData(frameOutbound.payload(i));
2432
      InboundSymbolIdle;
2433 15 magro732
    end loop;
2434
 
2435 40 magro732
    OutboundSymbolControl(RioControlSymbolCreate(STYPE0_STATUS, "01101", "11111",
2436
                                                 STYPE1_END_OF_PACKET, "000"));
2437
    InboundSymbolControl(RioControlSymbolCreate(STYPE0_PACKET_ACCEPTED, "01011", "11111",
2438
                                                STYPE1_NOP, "000"));
2439 4 magro732
 
2440 40 magro732
    for i in 0 to 4 loop
2441
      OutboundSymbolIdle;
2442
      InboundSymbolIdle;
2443
    end loop;
2444 4 magro732
 
2445 40 magro732
    TestWait(outboundSymbolWriteEmpty, '1', "symbols pending");
2446
    TestCompare(outboundFrameWriteEmpty, '1', "packet pending");
2447
 
2448 4 magro732
    ---------------------------------------------------------------------------
2449
    -- Test completed.
2450
    ---------------------------------------------------------------------------
2451
 
2452
    TestEnd;
2453
  end process;
2454
 
2455 40 magro732
 
2456 37 magro732
  -----------------------------------------------------------------------------
2457 40 magro732
  -- Instantiate interface simulator models.
2458 37 magro732
  -----------------------------------------------------------------------------
2459 40 magro732
 
2460
  process
2461 37 magro732
  begin
2462
    wait until clk = '1';
2463 40 magro732
    TestCompare(linkInitialized, linkInitializedExpected, "link initialized");
2464 37 magro732
  end process;
2465 4 magro732
 
2466 40 magro732
  SwitchPort: TestSwitchPort
2467 4 magro732
    port map(
2468
      clk=>clk, areset_n=>areset_n,
2469 40 magro732
      outboundWriteEmpty_o=>outboundFrameWriteEmpty,
2470
      outboundWrite_i=>outboundFrameWrite,
2471
      outboundWriteMessage_i=>outboundFrameWriteMessage,
2472
      outboundWriteAck_o=>outboundFrameWriteAck,
2473
      inboundWriteEmpty_o=>inboundFrameWriteEmpty,
2474
      inboundWrite_i=>inboundFrameWrite,
2475
      inboundWriteMessage_i=>inboundFrameWriteMessage,
2476
      inboundWriteAck_o=>inboundFrameWriteAck,
2477 4 magro732
      readFrameEmpty_o=>readFrameEmpty, readFrame_i=>readFrame,
2478
      readFrameRestart_i=>readFrameRestart, readFrameAborted_o=>readFrameAborted,
2479
      readWindowEmpty_o=>readWindowEmpty,
2480
      readWindowReset_i=>readWindowReset, readWindowNext_i=>readWindowNext,
2481
      readContentEmpty_o=>readContentEmpty, readContent_i=>readContent,
2482
      readContentEnd_o=>readContentEnd, readContentData_o=>readContentData,
2483 40 magro732
      writeFrame_i=>writeFrame, writeFrameAbort_i=>writeFrameAbort,
2484 4 magro732
      writeContent_i=>writeContent, writeContentData_i=>writeContentData);
2485
 
2486 40 magro732
  PcsPort: TestSymbolPort
2487
    port map(
2488
      clk=>clk, areset_n=>areset_n,
2489
      portInitialized_i=>portInitialized,
2490
      outboundControlValid_i=>outboundControlValid,
2491
      outboundControlSymbol_i=>outboundControlSymbol,
2492
      outboundDataValid_i=>outboundDataValid,
2493
      outboundDataSymbol_i=>outboundDataSymbol,
2494
      inboundControlValid_o=>inboundControlValid,
2495
      inboundControlSymbol_o=>inboundControlSymbol,
2496
      inboundDataValid_o=>inboundDataValid,
2497
      inboundDataSymbol_o=>inboundDataSymbol,
2498
      outboundWriteEmpty_o=>outboundSymbolWriteEmpty,
2499
      outboundWrite_i=>outboundSymbolWrite,
2500
      outboundWriteMessage_i=>outboundSymbolWriteMessage,
2501
      outboundWriteAck_o=>outboundSymbolWriteAck,
2502
      inboundWriteEmpty_o=>inboundSymbolWriteEmpty,
2503
      inboundWrite_i=>inboundSymbolWrite,
2504
      inboundWriteMessage_i=>inboundSymbolWriteMessage,
2505
      inboundWriteAck_o=>inboundSymbolWriteAck);
2506
 
2507 37 magro732
  -----------------------------------------------------------------------------
2508
  -- Instantiate the test object.
2509
  -----------------------------------------------------------------------------
2510
  TestObject: RioSerial
2511 4 magro732
    generic map(
2512 37 magro732
      TIMEOUT_WIDTH=>11, SYMBOL_COUNTER_WIDTH=>8,
2513
      TICKS_SEND_STATUS_STARTUP=>15, TICKS_SEND_STATUS_OPERATIONAL=>255)
2514 4 magro732
    port map(
2515 37 magro732
      clk=>clk, areset_n=>areset_n, enable=>enable,
2516 4 magro732
      portLinkTimeout_i=>portLinkTimeout,
2517
      linkInitialized_o=>linkInitialized,
2518
      inputPortEnable_i=>inputPortEnable,
2519
      outputPortEnable_i=>outputPortEnable,
2520
      localAckIdWrite_i=>localAckIdWrite,
2521
      clrOutstandingAckId_i=>clrOutstandingAckId,
2522
      inboundAckId_i=>inboundAckIdWrite,
2523
      outstandingAckId_i=>outstandingAckIdWrite,
2524
      outboundAckId_i=>outboundAckIdWrite,
2525
      inboundAckId_o=>inboundAckIdRead,
2526
      outstandingAckId_o=>outstandingAckIdRead,
2527
      outboundAckId_o=>outboundAckIdRead,
2528 37 magro732
      readFrameEmpty_i=>readFrameEmpty,
2529
      readFrame_o=>readFrame,
2530
      readFrameRestart_o=>readFrameRestart,
2531 4 magro732
      readFrameAborted_i=>readFrameAborted,
2532
      readWindowEmpty_i=>readWindowEmpty,
2533 37 magro732
      readWindowReset_o=>readWindowReset,
2534
      readWindowNext_o=>readWindowNext,
2535 4 magro732
      readContentEmpty_i=>readContentEmpty,
2536 37 magro732
      readContent_o=>readContent,
2537
      readContentEnd_i=>readContentEnd,
2538
      readContentData_i=>readContentData,
2539 40 magro732
      writeFrameFull_i=>inboundFrameFull,
2540 37 magro732
      writeFrame_o=>writeFrame,
2541
      writeFrameAbort_o=>writeFrameAbort,
2542
      writeContent_o=>writeContent,
2543
      writeContentData_o=>writeContentData,
2544 4 magro732
      portInitialized_i=>portInitialized,
2545 37 magro732
      outboundControlValid_o=>outboundControlValid,
2546
      outboundControlSymbol_o=>outboundControlSymbol,
2547
      outboundDataValid_o=>outboundDataValid,
2548
      outboundDataSymbol_o=>outboundDataSymbol,
2549
      inboundControlValid_i=>inboundControlValid,
2550
      inboundControlSymbol_i=>inboundControlSymbol,
2551
      inboundDataValid_i=>inboundDataValid,
2552
      inboundDataSymbol_i=>inboundDataSymbol);
2553 4 magro732
 
2554
end architecture;
2555
 
2556
 
2557
 
2558
-------------------------------------------------------------------------------
2559
-- 
2560
-------------------------------------------------------------------------------
2561
library ieee;
2562
use ieee.std_logic_1164.all;
2563
use ieee.numeric_std.all;
2564
library std;
2565
use std.textio.all;
2566
use work.rio_common.all;
2567 40 magro732
use work.TestRioSerialPackage.all;
2568 48 magro732
use work.TestPortPackage.all;
2569 4 magro732
 
2570 40 magro732
 
2571 4 magro732
-------------------------------------------------------------------------------
2572
-- 
2573
-------------------------------------------------------------------------------
2574
entity TestSwitchPort is
2575
  port(
2576
    clk : in std_logic;
2577
    areset_n : in std_logic;
2578
 
2579 40 magro732
    outboundWriteEmpty_o : out std_logic;
2580
    outboundWrite_i : in std_logic;
2581
    outboundWriteMessage_i : in MessageFrame;
2582
    outboundWriteAck_o : out std_logic;
2583 4 magro732
 
2584 40 magro732
    inboundWriteEmpty_o : out std_logic;
2585
    inboundWrite_i : in std_logic;
2586
    inboundWriteMessage_i : in MessageFrame;
2587
    inboundWriteAck_o : out std_logic;
2588
 
2589 4 magro732
    readFrameEmpty_o : out std_logic;
2590
    readFrame_i : in std_logic;
2591
    readFrameRestart_i : in std_logic;
2592
    readFrameAborted_o : out std_logic;
2593
    readWindowEmpty_o : out std_logic;
2594
    readWindowReset_i : in std_logic;
2595
    readWindowNext_i : in std_logic;
2596
    readContentEmpty_o : out std_logic;
2597
    readContent_i : in std_logic;
2598
    readContentEnd_o : out std_logic;
2599 18 magro732
    readContentData_o : out std_logic_vector(31 downto 0);
2600 4 magro732
 
2601
    writeFrame_i : in std_logic;
2602
    writeFrameAbort_i : in std_logic;
2603
    writeContent_i : in std_logic;
2604 18 magro732
    writeContentData_i : in std_logic_vector(31 downto 0));
2605 4 magro732
end entity;
2606
 
2607
 
2608
-------------------------------------------------------------------------------
2609
-- 
2610
-------------------------------------------------------------------------------
2611
architecture TestSwitchPortImpl of TestSwitchPort is
2612 40 magro732
  constant QUEUE_SIZE : natural := 63;
2613
  type QueueArray is array (natural range <>) of MessageFrame;
2614
 
2615
  function QueueIndexInc(constant i : natural) return natural is
2616
    variable returnValue : natural;
2617
  begin
2618
    if(i = QUEUE_SIZE) then
2619
      returnValue := 0;
2620
    else
2621
      returnValue := i + 1;
2622
    end if;
2623
    return returnValue;
2624
  end function;
2625
 
2626 4 magro732
begin
2627
 
2628
  -----------------------------------------------------------------------------
2629
  -- 
2630
  -----------------------------------------------------------------------------
2631 40 magro732
  Outbound: process
2632
    variable frameQueue : QueueArray(0 to QUEUE_SIZE);
2633
    variable front, back, window : natural range 0 to QUEUE_SIZE;
2634
    variable frameIndex : natural;
2635 4 magro732
  begin
2636 40 magro732
    wait until areset_n = '1';
2637
 
2638 4 magro732
    readFrameEmpty_o <= '1';
2639
    readFrameAborted_o <= '0';
2640
    readWindowEmpty_o <= '1';
2641
    readContentEmpty_o <= '1';
2642
    readContentEnd_o <= '0';
2643 40 magro732
    readContentData_o <= (others=>'0');
2644 4 magro732
 
2645 40 magro732
    front := 0;
2646
    back := 0;
2647
    window := 0;
2648
    frameIndex := 0;
2649
    outboundWriteEmpty_o <= '1';
2650
    outboundWriteAck_o <= '0';
2651
 
2652 4 magro732
    loop
2653 40 magro732
      wait until clk = '1' or outboundWrite_i = '1';
2654 4 magro732
 
2655 40 magro732
      if (clk'event) then
2656
        if (readFrame_i = '1') then
2657
          if (back /= front) then
2658
            back := QueueIndexInc(back);
2659
          else
2660
            TestError("OUTBOUND:BACK:reading when no frame is present");
2661
          end if;
2662 4 magro732
        end if;
2663
 
2664 40 magro732
        if (readFrameRestart_i = '1') then
2665
          frameIndex := 0;
2666 4 magro732
        end if;
2667 40 magro732
 
2668
        if (readWindowReset_i = '1') then
2669
          window := back;
2670
          frameIndex := 0;
2671
        end if;
2672 15 magro732
 
2673 40 magro732
        if (readWindowNext_i = '1') then
2674
          if (window /= front) then
2675
            window := QueueIndexInc(window);
2676
            frameIndex := 0;
2677
          else
2678
            TestError("OUTBOUND:WINDOW:reading when no frame is present");
2679
          end if;
2680 15 magro732
        end if;
2681 40 magro732
 
2682
        if (readContent_i = '1') then
2683
          if (back /= front) then
2684
            if (frameIndex < frameQueue(window).frame.length) then
2685
              readContentData_o <= frameQueue(window).frame.payload(frameIndex);
2686
              frameIndex := frameIndex + 1;
2687
              if (frameIndex = frameQueue(window).frame.length) then
2688
                readContentEnd_o <= '1';
2689
              else
2690
                readContentEnd_o <= '0';
2691
              end if;
2692
            else
2693
              TestError("OUTBOUND:CONTENT:reading when frame has ended");
2694
            end if;
2695
          else
2696
            TestError("OUTBOUND:CONTENT:reading when no frame is present");
2697
          end if;
2698
        end if;
2699 15 magro732
 
2700 40 magro732
        if (front = back) then
2701
          readFrameEmpty_o <= '1';
2702 4 magro732
        else
2703 40 magro732
          readFrameEmpty_o <= '0';
2704 4 magro732
        end if;
2705 40 magro732
 
2706
        if (front = window) then
2707
          readWindowEmpty_o <= '1';
2708
          readContentEmpty_o <= '1';
2709
        else
2710
          readWindowEmpty_o <= '0';
2711
          if (frameIndex /= frameQueue(window).frame.length) then
2712
            readContentEmpty_o <= '0';
2713
          else
2714
            readContentEmpty_o <= '1';
2715
          end if;
2716
        end if;
2717
 
2718
        if (front = back) then
2719
          outboundWriteEmpty_o <= '1';
2720
        else
2721
          outboundWriteEmpty_o <= '0';
2722
        end if;
2723
      elsif (outboundWrite_i'event) then
2724
        frameQueue(front) := outboundWriteMessage_i;
2725
        front := QueueIndexInc(front);
2726 15 magro732
 
2727 40 magro732
        outboundWriteEmpty_o <= '0';
2728
        outboundWriteAck_o <= '1';
2729
        wait until outboundWrite_i = '0';
2730
        outboundWriteAck_o <= '0';
2731 4 magro732
      end if;
2732
    end loop;
2733
  end process;
2734
 
2735
  -----------------------------------------------------------------------------
2736
  -- 
2737
  -----------------------------------------------------------------------------
2738 40 magro732
  Inbound: process
2739
    variable frameQueue : QueueArray(0 to QUEUE_SIZE);
2740
    variable front, back : natural range 0 to QUEUE_SIZE;
2741 4 magro732
    variable frameIndex : natural range 0 to 69;
2742
  begin
2743
    wait until areset_n = '1';
2744
 
2745 40 magro732
    inboundWriteEmpty_o <= '1';
2746
    inboundWriteAck_o <= '0';
2747 4 magro732
 
2748 40 magro732
    front := 0;
2749
    back := 0;
2750
    frameIndex := 0;
2751
 
2752 4 magro732
    loop
2753 40 magro732
      wait until clk = '1' or inboundWrite_i = '1';
2754
 
2755
      if (clk'event) then
2756
 
2757
        if (writeFrame_i = '1') then
2758
          if (frameIndex = 0) then
2759
            TestError("INBOUND:Empty frame written.");
2760 4 magro732
          end if;
2761 40 magro732
          if (frameIndex /= frameQueue(back).frame.length) then
2762
            TestError("INBOUND:Frame with unmatching length was written.");
2763 4 magro732
          end if;
2764 40 magro732
          if (back /= front) then
2765
            back := QueueIndexInc(back);
2766
          else
2767
            TestError("INBOUND:Unexpected frame written.");
2768 4 magro732
          end if;
2769 40 magro732
          frameIndex := 0;
2770
        end if;
2771
 
2772
        if (writeFrameAbort_i = '1') then
2773
          if (back /= front) then
2774
            if (frameQueue(back).willAbort) then
2775
              if (frameIndex /= frameQueue(back).frame.length) then
2776
                TestError("INBOUND:Frame with unmatching length was aborted.");
2777
              end if;
2778
              back := QueueIndexInc(back);
2779
            else
2780
              TestError("INBOUND:Not expecting this frame to abort.");
2781
            end if;
2782
          end if;
2783
          frameIndex := 0;
2784
        end if;
2785
 
2786
        if (writeContent_i = '1') then
2787
          if (frameIndex < frameQueue(back).frame.length) then
2788
            if (frameQueue(back).frame.payload(frameIndex) /= writeContentData_i) then
2789
              TestError("INBOUND:Unexpected frame content written.");
2790
            end if;
2791 4 magro732
            frameIndex := frameIndex + 1;
2792 40 magro732
          else
2793
            TestError("INBOUND:Receiving more frame content than expected.");
2794 4 magro732
          end if;
2795 40 magro732
        end if;
2796
 
2797
        if (front = back) then
2798
          inboundWriteEmpty_o <= '1';
2799
        else
2800
          inboundWriteEmpty_o <= '0';
2801
        end if;
2802
      elsif (inboundWrite_i'event) then
2803
        frameQueue(front) := inboundWriteMessage_i;
2804
        front := QueueIndexInc(front);
2805
 
2806
        inboundWriteEmpty_o <= '0';
2807
        inboundWriteAck_o <= '1';
2808
        wait until inboundWrite_i = '0';
2809
        inboundWriteAck_o <= '0';
2810
      end if;
2811
    end loop;
2812
  end process;
2813
 
2814
end architecture;
2815
 
2816
 
2817
 
2818
-------------------------------------------------------------------------------
2819
-- 
2820
-------------------------------------------------------------------------------
2821
library ieee;
2822
use ieee.std_logic_1164.all;
2823
use ieee.numeric_std.all;
2824
library std;
2825
use std.textio.all;
2826
use work.rio_common.all;
2827
use work.TestRioSerialPackage.all;
2828 48 magro732
use work.TestPortPackage.all;
2829 40 magro732
 
2830
 
2831
-------------------------------------------------------------------------------
2832
-- 
2833
-------------------------------------------------------------------------------
2834
entity TestSymbolPort is
2835
  port(
2836
    clk : in std_logic;
2837
    areset_n : in std_logic;
2838
 
2839
    portInitialized_i : in std_logic;
2840
    outboundControlValid_i : in std_logic;
2841
    outboundControlSymbol_i : in std_logic_vector(23 downto 0);
2842
    outboundDataValid_i : in std_logic;
2843
    outboundDataSymbol_i : in std_logic_vector(31 downto 0);
2844
    inboundControlValid_o : out std_logic;
2845
    inboundControlSymbol_o : out std_logic_vector(23 downto 0);
2846
    inboundDataValid_o : out std_logic;
2847
    inboundDataSymbol_o : out std_logic_vector(31 downto 0);
2848
 
2849
    outboundWriteEmpty_o : out std_logic;
2850
    outboundWrite_i : in std_logic;
2851
    outboundWriteMessage_i : in MessageSymbol;
2852
    outboundWriteAck_o : out std_logic;
2853
 
2854
    inboundWriteEmpty_o : out std_logic;
2855
    inboundWrite_i : in std_logic;
2856
    inboundWriteMessage_i : in MessageSymbol;
2857
    inboundWriteAck_o : out std_logic);
2858
end entity;
2859
 
2860
 
2861
-------------------------------------------------------------------------------
2862
-- 
2863
-------------------------------------------------------------------------------
2864
architecture TestSymbolPortImpl of TestSymbolPort is
2865
  constant QUEUE_SIZE : natural := 2047;
2866
  type QueueArray is array (natural range <>) of MessageSymbol;
2867
 
2868
  function QueueIndexInc(constant i : natural) return natural is
2869
    variable returnValue : natural;
2870
  begin
2871
    if(i = QUEUE_SIZE) then
2872
      returnValue := 0;
2873
    else
2874
      returnValue := i + 1;
2875
    end if;
2876
    return returnValue;
2877
  end function;
2878
 
2879
begin
2880
 
2881
  -----------------------------------------------------------------------------
2882
  -- 
2883
  -----------------------------------------------------------------------------
2884
  Outbound: process
2885
    variable front, back : natural range 0 to QUEUE_SIZE;
2886
    variable symbolQueue : QueueArray(0 to QUEUE_SIZE);
2887
  begin
2888
    wait until areset_n = '1';
2889
 
2890
    front := 0;
2891
    back := 0;
2892
    outboundWriteEmpty_o <= '1';
2893
    outboundWriteAck_o <= '0';
2894
 
2895
    loop
2896
      wait until clk = '1' or outboundWrite_i = '1';
2897
 
2898
      if (clk'event) then
2899
        if (back /= front) then
2900
          if (symbolQueue(back).symbolType = "01") then
2901
            if (not ((symbolQueue(back).ignoreIdle) and
2902
                     (outboundControlValid_i = '0') and
2903
                     (outboundDataValid_i = '0'))) then
2904
              TestCompare(outboundControlValid_i, '1', "OUTBOUND:control symbol");
2905
              TestCompare(outboundControlSymbol_i(23 downto 21), symbolQueue(back).symbolContent(23 downto 21),
2906
                          "OUTBOUND:stype0=" & to_string(symbolQueue(back).symbolContent(23 downto 21)));
2907
              TestCompare(outboundControlSymbol_i(20 downto 16), symbolQueue(back).symbolContent(20 downto 16),
2908
                          "OUTBOUND:parameter0=" & to_string(symbolQueue(back).symbolContent(20 downto 16)));
2909
              TestCompare(outboundControlSymbol_i(15 downto 11), symbolQueue(back).symbolContent(15 downto 11),
2910
                          "OUTBOUND:parameter1=" & to_string(symbolQueue(back).symbolContent(15 downto 11)));
2911
              TestCompare(outboundControlSymbol_i(10 downto 8), symbolQueue(back).symbolContent(10 downto 8),
2912
                          "OUTBOUND:stype1=" & to_string(symbolQueue(back).symbolContent(10 downto 8)));
2913
              TestCompare(outboundControlSymbol_i(7 downto 5), symbolQueue(back).symbolContent(7 downto 5),
2914
                          "OUTBOUND:cmd=" & to_string(symbolQueue(back).symbolContent(7 downto 5)));
2915
              TestCompare(outboundControlSymbol_i(4 downto 0), symbolQueue(back).symbolContent(4 downto 0),
2916
                          "OUTBOUND:crc5=" & to_string(symbolQueue(back).symbolContent(4 downto 0)));
2917
              TestCompare(outboundDataValid_i, '0', "OUTBOUND:no data symbol");
2918
              back := QueueIndexInc(back);
2919
            end if;
2920
          elsif (symbolQueue(back).symbolType = "10") then
2921
            if (not ((symbolQueue(back).ignoreIdle) and
2922
                     (outboundControlValid_i = '0') and
2923
                     (outboundDataValid_i = '0'))) then
2924
              TestCompare(outboundDataValid_i, '1', "OUTBOUND:valid data symbol");
2925
              TestCompare(outboundDataSymbol_i, symbolQueue(back).symbolContent(31 downto 0),
2926
                "OUTBOUND:data symbol content");
2927
              TestCompare(outboundControlValid_i, '0', "OUTBOUND:valid control symbol");
2928
              back := QueueIndexInc(back);
2929
            end if;
2930
          elsif (symbolQueue(back).symbolType = "00") then
2931
            TestCompare(outboundControlValid_i, '0', "OUTBOUND:valid control symbol");
2932
            TestCompare(outboundDataValid_i, '0', "OUTBOUND:valid data symbol");
2933
            back := QueueIndexInc(back);
2934
          else
2935
            TestCompare(outboundControlValid_i, '1', "OUTBOUND:valid control symbol");
2936
            TestCompare(outboundDataValid_i, '1', "OUTBOUND:valid data symbol");
2937
            back := QueueIndexInc(back);
2938 4 magro732
          end if;
2939
 
2940 40 magro732
          if (front = back) then
2941
            outboundWriteEmpty_o <= '1';
2942
          else
2943
            outboundWriteEmpty_o <= '0';
2944 4 magro732
          end if;
2945 40 magro732
        else
2946
          TestError("OUTBOUND:empty symbol queue");
2947
        end if;
2948
      elsif (outboundWrite_i'event) then
2949
        symbolQueue(front) := outboundWriteMessage_i;
2950
        front := QueueIndexInc(front);
2951
 
2952
        outboundWriteEmpty_o <= '0';
2953
        outboundWriteAck_o <= '1';
2954
        wait until outboundWrite_i = '0';
2955
        outboundWriteAck_o <= '0';
2956
      end if;
2957
    end loop;
2958 4 magro732
  end process;
2959
 
2960 40 magro732
  -----------------------------------------------------------------------------
2961
  -- 
2962
  -----------------------------------------------------------------------------
2963
  Inbound: process
2964
    variable front, back : natural range 0 to QUEUE_SIZE;
2965
    variable symbolQueue : QueueArray(0 to QUEUE_SIZE);
2966
  begin
2967
    wait until areset_n = '1';
2968
 
2969
    front := 0;
2970
    back := 0;
2971
    inboundWriteEmpty_o <= '1';
2972
    inboundWriteAck_o <= '0';
2973
 
2974
    inboundControlValid_o <= '0';
2975
    inboundControlSymbol_o <= (others=>'U');
2976
    inboundDataValid_o <= '0';
2977
    inboundDataSymbol_o <= (others=>'U');
2978
 
2979
    loop
2980
      wait until clk = '1' or inboundWrite_i = '1';
2981
 
2982
      if (clk'event) then
2983
        if (back /= front) then
2984
          if (symbolQueue(back).symbolType = "00") then
2985
            inboundControlValid_o <= '0';
2986
            inboundDataValid_o <= '0';
2987
          elsif (symbolQueue(back).symbolType = "01") then
2988
            inboundControlValid_o <= '1';
2989
            inboundControlSymbol_o <= symbolQueue(back).symbolContent(23 downto 0);
2990
            inboundDataValid_o <= '0';
2991
          elsif (symbolQueue(back).symbolType = "10") then
2992
            inboundControlValid_o <= '0';
2993
            inboundDataValid_o <= '1';
2994
            inboundDataSymbol_o <= symbolQueue(back).symbolContent(31 downto 0);
2995
          else
2996
            inboundControlValid_o <= '1';
2997
            inboundDataValid_o <= '1';
2998
          end if;
2999
 
3000
          back := QueueIndexInc(back);
3001
 
3002
          if (front = back) then
3003
            inboundWriteEmpty_o <= '1';
3004
          else
3005
            inboundWriteEmpty_o <= '0';
3006
          end if;
3007
        else
3008
          TestError("INBOUND:empty symbol queue");
3009
        end if;
3010
      elsif (inboundWrite_i'event) then
3011
        symbolQueue(front) := inboundWriteMessage_i;
3012
        front := QueueIndexInc(front);
3013
 
3014
        inboundWriteEmpty_o <= '0';
3015
        inboundWriteAck_o <= '1';
3016
        wait until inboundWrite_i = '0';
3017
        inboundWriteAck_o <= '0';
3018
      end if;
3019
    end loop;
3020
  end process;
3021
 
3022 4 magro732
end architecture;

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.