SURF  1.0
AxiStreamPkg.vhd
Go to the documentation of this file.
1 -------------------------------------------------------------------------------
2 -- File : AxiStreamPkg.vhd
3 -- Company : SLAC National Accelerator Laboratory
4 -- Created : 2014-04-24
5 -- Last update: 2017-02-09
6 -------------------------------------------------------------------------------
7 -- Description: AXI Stream Package File
8 -------------------------------------------------------------------------------
9 -- This file is part of 'SLAC Firmware Standard Library'.
10 -- It is subject to the license terms in the LICENSE.txt file found in the
11 -- top-level directory of this distribution and at:
12 -- https://confluence.slac.stanford.edu/display/ppareg/LICENSE.html.
13 -- No part of 'SLAC Firmware Standard Library', including this file,
14 -- may be copied, modified, propagated, or distributed except according to
15 -- the terms contained in the LICENSE.txt file.
16 -------------------------------------------------------------------------------
17 
18 library ieee;
19 use ieee.std_logic_1164.all;
20 use ieee.std_logic_unsigned.all;
21 use ieee.std_logic_arith.all;
22 
23 use work.StdRtlPkg.all;
24 
25 package AxiStreamPkg is
26 --! @file
27  --! @ingroup axi
28 
29  type AxiStreamMasterType is record
31  tData : slv(127 downto 0);
32  tStrb : slv(15 downto 0);
33  tKeep : slv(15 downto 0);
34  tLast : sl;
35  tDest : slv(7 downto 0);
36  tId : slv(7 downto 0);
37  tUser : slv(127 downto 0);
38  end record AxiStreamMasterType;
39 
41  tValid => '0',
42  tData => (others => '0'),
43  tStrb => (others => '1'),
44  tKeep => (others => '1'),
45  tLast => '0',
46  tDest => (others => '0'),
47  tId => (others => '0'),
48  tUser => (others => '0'));
49  type AxiStreamMasterArray is array (natural range<>) of AxiStreamMasterType;
50  type AxiStreamMasterVectorArray is array (natural range<>, natural range<>) of AxiStreamMasterType;
52  type AxiStreamQuadMasterArray is array (natural range <>) of AxiStreamMasterArray(3 downto 0);
53 
54  type AxiStreamSlaveType is record
56  end record AxiStreamSlaveType;
57 
58  type AxiStreamSlaveArray is array (natural range<>) of AxiStreamSlaveType;
59  type AxiStreamSlaveVectorArray is array (natural range<>, natural range<>) of AxiStreamSlaveType;
61  type AxiStreamQuadSlaveArray is array (natural range <>) of AxiStreamSlaveArray(3 downto 0);
62 
64  tReady => '0');
65 
67  tReady => '1');
68 
69  type TUserModeType is (TUSER_NORMAL_C, TUSER_FIRST_LAST_C, TUSER_LAST_C, TUSER_NONE_C);
70 
71  type TKeepModeType is (TKEEP_NORMAL_C, TKEEP_COMP_C, TKEEP_FIXED_C);
72 
73  type AxiStreamConfigType is record
74  TSTRB_EN_C : boolean;
75  TDATA_BYTES_C : natural range 1 to 16;
76  TDEST_BITS_C : natural range 0 to 8;
77  TID_BITS_C : natural range 0 to 8;
78  TKEEP_MODE_C : TkeepModeType;
79  TUSER_BITS_C : natural range 0 to 8;
81  end record AxiStreamConfigType;
82 
84  TSTRB_EN_C => false,
85  TDATA_BYTES_C => 16,
86  TDEST_BITS_C => 4,
87  TID_BITS_C => 0,
88  TKEEP_MODE_C => TKEEP_NORMAL_C,
89  TUSER_BITS_C => 4,
90  TUSER_MODE_C => TUSER_NORMAL_C);
91 
92  type AxiStreamConfigArray is array (natural range<>) of AxiStreamConfigType;
93  type AxiStreamConfigVectorArray is array (natural range<>, natural range<>) of AxiStreamConfigType;
94 
95  function axiStreamMasterInit (constant config : AxiStreamConfigType) return AxiStreamMasterType;
96 
97  function getSlvSize (c : AxiStreamConfigType) return integer;
98  function toSlv (din : AxiStreamMasterType; c : AxiStreamConfigType) return slv;
99  function toAxiStreamMaster (din : slv; valid : sl; c : AxiStreamConfigType) return AxiStreamMasterType;
100 
101  -------------------------------------------------------------------------------------------------
102  -- Special control backpressure interface for use with stream fifos
103  -------------------------------------------------------------------------------------------------
104  type AxiStreamCtrlType is record
107  idle : sl;
108  end record AxiStreamCtrlType;
109 
111  pause => '1',
112  overflow => '0',
113  idle => '0');
114 
116  pause => '0',
117  overflow => '0',
118  idle => '1');
119 
120  type AxiStreamCtrlArray is array (natural range<>) of AxiStreamCtrlType;
121  type AxiStreamCtrlVectorArray is array (natural range<>, natural range<>) of AxiStreamCtrlType;
123  type AxiStreamQuadCtrlArray is array (natural range <>) of AxiStreamCtrlArray(3 downto 0);
124 
125  -------------------------------------------------------------------------------------------------
126  -- Helper function prototypes
127  -------------------------------------------------------------------------------------------------
128  function axiStreamPacked (
129  constant CONFIG_C : AxiStreamConfigType;
130  axisMaster : AxiStreamMasterType)
131  return boolean;
132 
134  axisConfig : AxiStreamConfigType;
135  axisMaster : AxiStreamMasterType;
136  bytePos : integer := 1) -- -1 = last
137  return integer;
138 
140  axisConfig : AxiStreamConfigType;
141  axisMaster : AxiStreamMasterType;
142  bytePos : integer := 1) -- -1 = last
143  return slv;
144 
146  axisConfig : AxiStreamConfigType;
147  axisMaster : AxiStreamMasterType;
148  bitPos : integer;
149  bytePos : integer := 1) -- -1 = last
150  return sl;
151 
153  axisConfig : in AxiStreamConfigType;
154  axisMaster : inout AxiStreamMasterType;
155  fieldValue : in slv;
156  bytePos : in integer := 1); -- -1 = last
157 
158 - procedure axiStreamSetUserBit (
159  axisConfig : in AxiStreamConfigType;
160  axisMaster : inout AxiStreamMasterType;
161  bitPos : in integer;
162  bitValue : in sl;
163  bytePos : in integer := 1); -- -1 = last
164 
165  function ite(i : boolean; t : AxiStreamConfigType; e : AxiStreamConfigType) return AxiStreamConfigType;
166  function ite(i : boolean; t : AxiStreamMasterType; e : AxiStreamMasterType) return AxiStreamMasterType;
167  function ite(i : boolean; t : AxiStreamSlaveType; e : AxiStreamSlaveType) return AxiStreamSlaveType;
168  function ite(i : boolean; t : AxiStreamCtrlType; e : AxiStreamCtrlType) return AxiStreamCtrlType;
169  function ite(i : boolean; t : TUserModeType; e : TUserModeType) return TUserModeType;
170  function ite(i : boolean; t : TKeepModeType; e : TKeepModeType) return TKeepModeType;
171 
172  function genTKeep (bytes : integer range 0 to 16) return slv;
173  function genTKeep (constant config : AxiStreamConfigType) return slv;
174 
175  function getTKeep (tKeep : slv) return natural;
176 
177 end package AxiStreamPkg;
178 
179 package body AxiStreamPkg is
180 
181  function axiStreamMasterInit (constant config : AxiStreamConfigType) return AxiStreamMasterType is
182  variable ret : AxiStreamMasterType;
183  begin
185  ret.tKeep := genTKeep(config);
186  ret.tStrb := genTKeep(config);
187  return ret;
188  end function axiStreamMasterInit;
189 
190  function axiStreamPacked (
191  constant CONFIG_C : AxiStreamConfigType;
192  axisMaster : AxiStreamMasterType)
193  return boolean is
194  begin
195  if (not allBits(axisMaster.tKeep(CONFIG_C.TDATA_BYTES_C-1 downto 0), '1')) then
196  return false;
197  end if;
198  if (CONFIG_C.TSTRB_EN_C and
199  not allBits(axisMaster.tStrb(CONFIG_C.TDATA_BYTES_C-1 downto 0), '1')) then
200  return false;
201  end if;
202  return true;
203  end function;
204 
206  axisConfig : AxiStreamConfigType;
207  axisMaster : AxiStreamMasterType;
208  bytePos : integer := 1)
209  return integer is
210 
211  variable ret : integer;
212  begin
213 
214  if bytePos = -1 then
215  ret := getTKeep(axisMaster.tKeep)-1;
216  if (ret > axisConfig.TDATA_BYTES_C) then
217  ret := axisConfig.TDATA_BYTES_C-1;
218  end if;
219  if ret < 0 then
220  ret := 0;
221  end if;
222  else
223  ret := bytePos;
224  end if;
225 
226  return(ret);
227  end function;
228 
230  axisConfig : AxiStreamConfigType;
231  axisMaster : AxiStreamMasterType;
232  bytePos : integer := 1)
233  return slv is
234 
235  variable pos : integer;
236  variable ret : slv(maximum(axisConfig.TUSER_BITS_C-1, 0) downto 0);
237  begin
238 
239  pos := axiStreamGetUserPos(axisConfig, axisMaster, bytePos);
240 
241  ret := ite(axisConfig.TUSER_BITS_C>0,
242  axisMaster.tUser((axisConfig.TUSER_BITS_C*pos)+axisConfig.TUSER_BITS_C-1 downto ((axisConfig.TUSER_BITS_C*pos))),
243  "0");
244 
245  -- Handle TUSER_BITS_C=0 case
246  if (axisConfig.TUSER_BITS_C = 0 or axisConfig.TUSER_MODE_C = TUSER_NONE_C) then
247  ret := (others => '0');
248  end if;
249 
250  return(ret);
251  end function;
252 
254  axisConfig : AxiStreamConfigType;
255  axisMaster : AxiStreamMasterType;
256  bitPos : integer;
257  bytePos : integer := 1) -- -1 = last
258  return sl is
259 
260  variable user : slv(maximum(axisConfig.TUSER_BITS_C-1, 0) downto 0);
261  begin
262 
263  user := axiStreamGetuserField(axisConfig, axisMaster, bytePos);
264  return(user(bitPos));
265 
266  end function;
267 
269  axisConfig : in AxiStreamConfigType;
270  axisMaster : inout AxiStreamMasterType;
271  fieldValue : in slv;
272  bytePos : in integer := 1) is
273 
274  variable pos : integer;
275  begin
276 
277  pos := axiStreamGetUserPos(axisConfig, axisMaster, bytePos);
278 
279  if (axisConfig.TUSER_BITS_C > 0 and axisConfig.TUSER_MODE_C /= TUSER_NONE_C) then
280  axisMaster.tUser((axisConfig.TUSER_BITS_C*pos)+axisConfig.TUSER_BITS_C-1 downto
281  ((axisConfig.TUSER_BITS_C*pos))) := fieldValue;
282  else
283  axisMaster.tUser := (others => '0');
284  end if;
285 
286  end procedure;
287 
288 - procedure axiStreamSetUserBit (
289  axisConfig : in AxiStreamConfigType;
290  axisMaster : inout AxiStreamMasterType;
291  bitPos : in integer;
292  bitValue : in sl;
293  bytePos : in integer := 1) is
294 
295  variable pos : integer;
296  begin
297 
298  pos := axiStreamGetUserPos(axisConfig, axisMaster, bytePos);
299 
300  axisMaster.tUser((axisConfig.TUSER_BITS_C*pos) + bitPos) := bitValue;
301 
302  end procedure;
303 
304  function ite (i : boolean; t : AxiStreamConfigType; e : AxiStreamConfigType) return AxiStreamConfigType is
305  begin
306  if (i) then return t; else return e; end if;
307  end function ite;
308 
309  function ite (i : boolean; t : AxiStreamMasterType; e : AxiStreamMasterType) return AxiStreamMasterType is
310  begin
311  if (i) then return t; else return e; end if;
312  end function ite;
313 
314  function ite (i : boolean; t : AxiStreamSlaveType; e : AxiStreamSlaveType) return AxiStreamSlaveType is
315  begin
316  if (i) then return t; else return e; end if;
317  end function ite;
318 
319  function ite (i : boolean; t : AxiStreamCtrlType; e : AxiStreamCtrlType) return AxiStreamCtrlType is
320  begin
321  if (i) then return t; else return e; end if;
322  end function ite;
323 
324  function ite (i : boolean; t : TUserModeType; e : TUserModeType) return TUserModeType is
325  begin
326  if (i) then return t; else return e; end if;
327  end function ite;
328 
329  function ite (i : boolean; t : TKeepModeType; e : TKeepModeType) return TKeepModeType is
330  begin
331  if (i) then return t; else return e; end if;
332  end function ite;
333 
334  function genTKeep (bytes : integer range 0 to 16) return slv is
335  begin
336  case bytes is
337  when 0 => return X"0000";
338  when 1 => return X"0001";
339  when 2 => return X"0003";
340  when 3 => return X"0007";
341  when 4 => return X"000F";
342  when 5 => return X"001F";
343  when 6 => return X"003F";
344  when 7 => return X"007F";
345  when 8 => return X"00FF";
346  when 9 => return X"01FF";
347  when 10 => return X"03FF";
348  when 11 => return X"07FF";
349  when 12 => return X"0FFF";
350  when 13 => return X"1FFF";
351  when 14 => return X"3FFF";
352  when 15 => return X"7FFF";
353  when 16 => return X"FFFF";
354  end case;
355  end function genTKeep;
356 
357  function genTKeep (constant config : AxiStreamConfigType) return slv is
358  begin
359  return genTKeep(config.TDATA_BYTES_C);
360  end function genTKeep;
361 
362  function getTKeep (tKeep : slv) return natural is
363  variable tKeepFull : slv(15 downto 0);
364  begin
365  tKeepFull := resize(tKeep, 16);
366  case tKeepFull is
367  when X"0000" => return 0;
368  when X"0001" => return 1;
369  when X"0003" => return 2;
370  when X"0007" => return 3;
371  when X"000F" => return 4;
372  when X"001F" => return 5;
373  when X"003F" => return 6;
374  when X"007F" => return 7;
375  when X"00FF" => return 8;
376  when X"01FF" => return 9;
377  when X"03FF" => return 10;
378  when X"07FF" => return 11;
379  when X"0FFF" => return 12;
380  when X"1FFF" => return 13;
381  when X"3FFF" => return 14;
382  when X"7FFF" => return 15;
383  when X"FFFF" => return 16;
384  when others => return 0;
385  end case;
386  end function getTKeep;
387 
388 "X" procedure axiStreamSimSendTxn (
389  constant CONFIG_C : in AxiStreamConfigType;
390  signal clk : in sl;
391  signal master : out AxiStreamMasterType;
392  signal slave : in AxiStreamSlaveType;
393  tData : in slv;
394  tKeep : in slv := ;
395  tLast : in sl := '0';
396  tDest : in slv(7 downto 0) := X"00";
397  tId : in slv(7 downto 0) := X"00";
398  tUser : in slv(127 downto 0) := (others => '0')) is
399  begin
400  -- Wait for rising edge
401  wait until clk = '1';
402 
403  -- Set the bus
404  master <= axiStreamMasterInit(CONFIG_C);
405  master.tValid <= '1';
406  master.tData <= resize(tdata, 128);
407  if (tKeep /= "X") then
408  master.tKeep <= resize(tkeep, 16);
409  end if;
410  master.tLast <= tlast;
411  master.tDest <= tDest;
412  master.tId <= tid;
413  master.tUser <= tUser;
414 
415  -- Wait for tReady
416  while (slave.tReady = '0') loop
417  wait until clk = '1';
418  end loop;
419 
420  end procedure;
421 
422  procedure axiStreamSimReceiveTxn (
423  constant CONFIG_C : in AxiStreamConfigType;
424  signal clk : in sl;
425  signal master : in AxiStreamMasterType;
426  signal slave : out AxiStreamSlaveType;
427  tData : out slv;
428  tKeep : out slv(15 downto 0);
429  tLast : out sl;
430  tDest : out slv(7 downto 0);
431  tId : out slv(7 downto 0);
432  tUser : out slv) is
433  begin
434  slave.tready <= '1';
435 
436  -- Wait for rising edge
437  while (master.tValid = '0') loop
438  wait until clk = '1';
439  end loop;
440  -- Sample the bus
441  tLast := master.tLast;
442  tData := resize(master.tData, tData'length);
443  tKeep := master.tKeep;
444  tDest := master.tDest;
445  tId := master.tId;
446  tUser := resize(master.tUser, tUser'length);
447 
448  end procedure;
449 
450  procedure axiStreamSimSendFrame (
451  constant CONFIG_C : in AxiStreamConfigType;
452  signal clk : in sl;
453  signal master : out AxiStreamMasterType;
454  signal slave : in AxiStreamSlaveType;
455  data : in slVectorArray;
456  tUserFirst : in slv(7 downto 0) := (others => '0');
457  tUserLast : in slv(7 downto 0) := (others => '0'))
458  is
459  constant DATA_WIDTH_C : natural := data'length(1);
460  constant DATA_BYTES_C : natural := wordCount(DATA_WIDTH_C, 8);
461 
462  variable txWord : slv(CONFIG_C.TDATA_BYTES_C*8-1 downto 0) := (others => '0');
463  variable txKeep : slv(CONFIG_C.TDATA_BYTES_C-1 downto 0) := (others => '0');
464  variable wordNum : integer;
465  begin
466  for i in data'range(1) loop
467  wordNum := i mod CONFIG_C.TDATA_BYTES_C;
468  txWord((wordNum+1)*DATA_WIDTH_C-1 downto wordNum*DATA_WIDTH_C) := muxSlVectorArray(data, i);
469  txKeep((wordNum+1)*DATA_BYTES_C-1 downto wordNum*DATA_BYTES_C) := (others => '1');
470 
471  if (wordNum = CONFIG_C.TDATA_BYTES_C-1) then
472  axiStreamSimSendTxn(CONFIG_C, clk, master, slave, txWord, txKeep, toSl(i = data'high));
473  txWord := (others => '0');
474  txKeep := (others => '0');
475  end if;
476  wait until clk = '1';
477  master.tValid <= '0';
478  end loop;
479  end procedure;
480 
481  procedure axiStreamSimSendFrame (
482  constant CONFIG_C : in AxiStreamConfigType;
483  signal clk : in sl;
484  signal master : out AxiStreamMasterType;
485  signal slave : in AxiStreamSlaveType;
486  data : in slv8Array;
487  tUserFirst : in slv(7 downto 0) := (others => '0');
488  tUserLast : in slv(7 downto 0) := (others => '0'))
489  is
490  variable vec : SlVectorArray(data'range, data(0)'range);
491  begin
492  for i in data'range loop
493  for j in data(0)'range loop
494  vec(i, j) := data(i)(j);
495  end loop;
496  end loop;
497  axiStreamSimSendFrame(CONFIG_C, clk, master, slave, vec, tUserFirst, tUserLast);
498  end procedure;
499 
500  procedure axiStreamSimSendFrame (
501  constant CONFIG_C : in AxiStreamConfigType;
502  signal clk : in sl;
503  signal master : out AxiStreamMasterType;
504  signal slave : in AxiStreamSlaveType;
505  data : in slv16Array;
506  tUserFirst : in slv(7 downto 0) := (others => '0');
507  tUserLast : in slv(7 downto 0) := (others => '0'))
508  is
509  variable vec : SlVectorArray(data'range, data(0)'range);
510  begin
511  for i in data'range loop
512  for j in data(0)'range loop
513  vec(i, j) := data(i)(j);
514  end loop;
515  end loop;
516  axiStreamSimSendFrame(CONFIG_C, clk, master, slave, vec, tUserFirst, tUserLast);
517  end procedure;
518 
519  procedure axiStreamSimSendFrame (
520  constant CONFIG_C : in AxiStreamConfigType;
521  signal clk : in sl;
522  signal master : out AxiStreamMasterType;
523  signal slave : in AxiStreamSlaveType;
524  data : in slv32Array;
525  tUserFirst : in slv(7 downto 0) := (others => '0');
526  tUserLast : in slv(7 downto 0) := (others => '0'))
527  is
528  variable vec : SlVectorArray(data'range, data(0)'range);
529  begin
530  for i in data'range loop
531  for j in data(0)'range loop
532  vec(i, j) := data(i)(j);
533  end loop;
534  end loop;
535  axiStreamSimSendFrame(CONFIG_C, clk, master, slave, vec, tUserFirst, tUserLast);
536  end procedure;
537 
538  procedure axiStreamSimSendFrame (
539  constant CONFIG_C : in AxiStreamConfigType;
540  signal clk : in sl;
541  signal master : out AxiStreamMasterType;
542  signal slave : in AxiStreamSlaveType;
543  data : in slv64Array;
544  tUserFirst : in slv(7 downto 0) := (others => '0');
545  tUserLast : in slv(7 downto 0) := (others => '0'))
546  is
547  variable vec : SlVectorArray(data'range, data(0)'range);
548  begin
549  for i in data'range loop
550  for j in data(0)'range loop
551  vec(i, j) := data(i)(j);
552  end loop;
553  end loop;
554  axiStreamSimSendFrame(CONFIG_C, clk, master, slave, vec, tUserFirst, tUserLast);
555  end procedure;
556 
557  procedure axiStreamSimSendFrame (
558  constant CONFIG_C : in AxiStreamConfigType;
559  signal clk : in sl;
560  signal master : out AxiStreamMasterType;
561  signal slave : in AxiStreamSlaveType;
562  data : in slv128Array;
563  tUserFirst : in slv(7 downto 0) := (others => '0');
564  tUserLast : in slv(7 downto 0) := (others => '0'))
565  is
566  variable vec : SlVectorArray(data'range, data(0)'range);
567  begin
568  for i in data'range loop
569  for j in data(0)'range loop
570  vec(i, j) := data(i)(j);
571  end loop;
572  end loop;
573  axiStreamSimSendFrame(CONFIG_C, clk, master, slave, vec, tUserFirst, tUserLast);
574  end procedure;
575 
576  function getSlvSize (c : AxiStreamConfigType) return integer is
577  variable size : integer := 1;
578  begin
579 
580  -- Data
581  size := size + c.TDATA_BYTES_C*8;
582 
583  -- Keep
584  size := size + ite(c.TKEEP_MODE_C = TKEEP_NORMAL_C, c.TDATA_BYTES_C,
585  ite(c.TKEEP_MODE_C = TKEEP_COMP_C, bitSize(c.TDATA_BYTES_C-1), 0));
586 
587  -- User bits
588  size := size + ite(c.TUSER_MODE_C = TUSER_FIRST_LAST_C, c.TUSER_BITS_C*2,
589  ite(c.TUSER_MODE_C = TUSER_LAST_C, c.TUSER_BITS_C,
590  ite(c.TUSER_MODE_C = TUSER_NORMAL_C, c.TDATA_BYTES_C * c.TUSER_BITS_C,
591  0))); -- TUSER_NONE_C
592 
593  size := size + ite(c.TSTRB_EN_C, c.TDATA_BYTES_C, 0); -- Strobe bits
594  size := size + c.TDEST_BITS_C;
595  size := size + c.TID_BITS_C;
596 
597  return(size);
598 
599  end function;
600 
601  function toSlv (din : AxiStreamMasterType; c : AxiStreamConfigType) return slv is
602  variable size : integer := getSlvSize(c);
603  variable retValue : slv(size-1 downto 0) := (others => '0');
604  variable i : integer := 0;
605  begin
606 
607  -- init, pass last
608  assignSlv(i, retValue, din.tLast);
609 
610  -- Pack data
611  assignSlv(i, retValue, din.tData((c.TDATA_BYTES_C*8)-1 downto 0));
612 
613  -- Pack keep
614  if c.TKEEP_MODE_C = TKEEP_NORMAL_C then
615  assignSlv(i, retValue, din.tKeep(c.TDATA_BYTES_C-1 downto 0));
616  elsif c.TKEEP_MODE_C = TKEEP_COMP_C then
617  -- Assume lsb is present
618  assignSlv(i, retValue, toSlv(getTKeep(din.tKeep(c.TDATA_BYTES_C-1 downto 1)), bitSize(c.TDATA_BYTES_C-1)));
619  end if;
620  -- TKEEP Fixed uses 0 bits
621 
622  -- Pack user bits
623  if (c.TUSER_BITS_C > 0 and c.TUSER_MODE_C /= TUSER_NONE_C) then
624  if c.TUSER_MODE_C = TUSER_FIRST_LAST_C then
625  assignSlv(i, retValue, resize(axiStreamGetUserField(c, din, 0), c.TUSER_BITS_C)); -- First byte
626  assignSlv(i, retValue, resize(axiStreamGetUserField(c, din, -1), c.TUSER_BITS_C)); -- Last valid byte
627 
628  elsif c.TUSER_MODE_C = TUSER_LAST_C then
629  assignSlv(i, retValue, resize(axiStreamGetUserField(c, din, -1), c.TUSER_BITS_C)); -- Last valid byte
630 
631  elsif c.TUSER_MODE_C = TUSER_NORMAL_C then
632  for j in 0 to c.TDATA_BYTES_C-1 loop
633  assignSlv(i, retValue, resize(axiStreamGetUserField(c, din, j), c.TUSER_BITS_C));
634  end loop;
635  end if;
636  end if;
637 
638  -- Strobe is optional
639  if c.TSTRB_EN_C = true then
640  assignSlv(i, retValue, din.tStrb(c.TDATA_BYTES_C-1 downto 0));
641  end if;
642 
643  -- Dest is optional
644  if c.TDEST_BITS_C > 0 then
645  assignSlv(i, retValue, din.tDest(c.TDEST_BITS_C-1 downto 0));
646  end if;
647 
648  -- Id is optional
649  if c.TID_BITS_C > 0 then
650  assignSlv(i, retValue, din.tId(c.TID_BITS_C-1 downto 0));
651  end if;
652 
653  return(retValue);
654 
655  end function;
656 
657  function toAxiStreamMaster (din : slv; valid : sl; c : AxiStreamConfigType) return AxiStreamMasterType is
658  variable master : AxiStreamMasterType := axiStreamMasterInit(c);
659  variable user : slv(maximum(c.TUSER_BITS_C-1, 0) downto 0) := (others => '0');
660  variable keep : slv(bitSize(c.TDATA_BYTES_C-1)-1 downto 0);
661  variable i : integer := 0;
662  begin
663 
664  -- Set valid,
665  master.tValid := valid;
666 
667  -- Set last
668  assignRecord(i, din, master.tLast);
669 
670  -- Get data
671  assignRecord(i, din, master.tData((c.TDATA_BYTES_C*8)-1 downto 0));
672 
673  -- Get keep bits
674  if c.TKEEP_MODE_C = TKEEP_NORMAL_C then
675  assignRecord(i, din, master.tKeep(c.TDATA_BYTES_C-1 downto 0));
676  elsif c.TKEEP_MODE_C = TKEEP_COMP_C then
677  assignRecord(i, din, keep);
678  master.tKeep := genTKeep(conv_integer(keep)+1);
679  else -- KEEP_MODE_C = TKEEP_FIXED_C
680  master.tKeep := genTKeep(c.TDATA_BYTES_C);
681  end if;
682 
683  -- get user bits
684  if (c.TUSER_BITS_C > 0 and c.TUSER_MODE_C /= TUSER_NONE_C) then
685  if c.TUSER_MODE_C = TUSER_FIRST_LAST_C then
686  assignRecord(i, din, user);
687  axiStreamSetUserField (c, master, resize(user, c.TUSER_BITS_C), 0); -- First byte
688 
689  assignRecord(i, din, user);
690  axiStreamSetUserField (c, master, resize(user, c.TUSER_BITS_C), -1); -- Last valid byte
691 
692  elsif c.TUSER_MODE_C = TUSER_LAST_C then
693  assignRecord(i, din, user);
694  axiStreamSetUserField (c, master, resize(user, c.TUSER_BITS_C), -1); -- Last valid byte
695 
696  elsif (c.TUSER_MODE_C = TUSER_NORMAL_C) then
697  for j in 0 to c.TDATA_BYTES_C-1 loop
698  assignRecord(i, din, user);
699  axiStreamSetUserField (c, master, resize(user, c.TUSER_BITS_C), j);
700  end loop;
701  end if;
702  else
703  user := (others => '0');
704  end if;
705 
706  -- Strobe is optional
707  if c.TSTRB_EN_C = true then
708  assignRecord(i, din, master.tStrb(c.TDATA_BYTES_C-1 downto 0));
709  else
710  master.tStrb := master.tKeep; -- Strobe follows keep if unused
711  end if;
712 
713  -- Dest is optional
714  if c.TDEST_BITS_C > 0 then
715  assignRecord(i, din, master.tDest(c.TDEST_BITS_C-1 downto 0));
716  end if;
717 
718  -- ID is optional
719  if c.TID_BITS_C > 0 then
720  assignRecord(i, din, master.tId(c.TID_BITS_C-1 downto 0));
721  end if;
722 
723  return(master);
724 
725  end function;
726 
727 end package body AxiStreamPkg;
728 
slv( 7 downto 0) tId
natural range 0 to 8 TDEST_BITS_C
(TUSER_NORMAL_C,TUSER_FIRST_LAST_C,TUSER_LAST_C,TUSER_NONE_C) TUserModeType
array(natural range <> ) of AxiStreamSlaveType AxiStreamSlaveArray
AxiStreamConfigType itei,t,e,
integer axiStreamGetUserPosaxisConfig,axisMaster,bytePos,
natural getTKeeptKeep,
slv toSlvdin,c,
std_logic sl
Definition: StdRtlPkg.vhd:28
axiStreamSetUserFieldaxisConfig,axisMaster,fieldValue,bytePos,
AxiStreamMasterType :=(tValid => '0',tData =>( others => '0'),tStrb =>( others => '1'),tKeep =>( others => '1'),tLast => '0',tDest =>( others => '0'),tId =>( others => '0'),tUser =>( others => '0')) AXI_STREAM_MASTER_INIT_C
array(natural range <> ) of AxiStreamCtrlArray( 3 downto 0) AxiStreamQuadCtrlArray
array(natural range <> ) of AxiStreamMasterArray( 3 downto 0) AxiStreamQuadMasterArray
array(natural range <> ,natural range <> ) of sl SlVectorArray
Definition: StdRtlPkg.vhd:669
slv( 15 downto 0) tStrb
slv( 15 downto 0) tKeep
AxiStreamCtrlArray( 3 downto 0) AxiStreamQuadCtrlType
array(natural range <> ,natural range <> ) of AxiStreamConfigType AxiStreamConfigVectorArray
natural range 1 to 16 TDATA_BYTES_C
slv axiStreamGetUserFieldaxisConfig,axisMaster,bytePos,
TkeepModeType TKEEP_MODE_C
natural range 0 to 8 TID_BITS_C
array(natural range <> ) of AxiStreamConfigType AxiStreamConfigArray
slv( 127 downto 0) tData
axiStreamSetUserBitaxisConfig,axisMaster,bitPos,bitValue,bytePos,
slv genTKeepbytes,
AxiStreamMasterType axiStreamMasterInitconfig,
array(natural range <> ,natural range <> ) of AxiStreamCtrlType AxiStreamCtrlVectorArray
AxiStreamSlaveType :=(tReady => '0') AXI_STREAM_SLAVE_INIT_C
AxiStreamMasterType toAxiStreamMasterdin,valid,c,
AxiStreamCtrlType :=(pause => '1',overflow => '0',idle => '0') AXI_STREAM_CTRL_INIT_C
boolean TSTRB_EN_C
array(natural range <> ,natural range <> ) of AxiStreamSlaveType AxiStreamSlaveVectorArray
TUserModeType TUSER_MODE_C
slv( 127 downto 0) tUser
array(natural range <> ) of AxiStreamCtrlType AxiStreamCtrlArray
array(natural range <> ,natural range <> ) of AxiStreamMasterType AxiStreamMasterVectorArray
array(natural range <> ) of AxiStreamMasterType AxiStreamMasterArray
natural range 0 to 8 TUSER_BITS_C
boolean axiStreamPackedCONFIG_C,axisMaster,
AxiStreamConfigType :=(TSTRB_EN_C => false,TDATA_BYTES_C => 16,TDEST_BITS_C => 4,TID_BITS_C => 0,TKEEP_MODE_C => TKEEP_NORMAL_C,TUSER_BITS_C => 4,TUSER_MODE_C => TUSER_NORMAL_C) AXI_STREAM_CONFIG_INIT_C
array(natural range <> ) of AxiStreamSlaveArray( 3 downto 0) AxiStreamQuadSlaveArray
AxiStreamCtrlType :=(pause => '0',overflow => '0',idle => '1') AXI_STREAM_CTRL_UNUSED_C
slv( 7 downto 0) tDest
AxiStreamMasterArray( 3 downto 0) AxiStreamQuadMasterType
(TKEEP_NORMAL_C,TKEEP_COMP_C,TKEEP_FIXED_C) TKeepModeType
AxiStreamSlaveType :=(tReady => '1') AXI_STREAM_SLAVE_FORCE_C
sl axiStreamGetUserBitaxisConfig,axisMaster,bitPos,bytePos,
AxiStreamSlaveArray( 3 downto 0) AxiStreamQuadSlaveType
std_logic_vector slv
Definition: StdRtlPkg.vhd:29
integer getSlvSizec,