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 ------------------------------------------------------------------------------- 19 use ieee.std_logic_1164.
all;
20 use ieee.std_logic_unsigned.
all;
21 use ieee.std_logic_arith.
all;
42 tData => (others => '0'), 43 tStrb => (others => '1'), 44 tKeep => (others => '1'), 46 tDest => (others => '0'), 47 tId => (others => '0'), 48 tUser => (others => '0'));
69 type TUserModeType is (TUSER_NORMAL_C, TUSER_FIRST_LAST_C, TUSER_LAST_C, TUSER_NONE_C);
101 ------------------------------------------------------------------------------------------------- 102 -- Special control backpressure interface for use with stream fifos 103 ------------------------------------------------------------------------------------------------- 125 ------------------------------------------------------------------------------------------------- 126 -- Helper function prototypes 127 ------------------------------------------------------------------------------------------------- 136 bytePos : :=
1)
-- -1 = last 142 bytePos : :=
1)
-- -1 = last 149 bytePos : :=
1)
-- -1 = last 156 bytePos :
in :=
1);
-- -1 = last 163 bytePos :
in :=
1);
-- -1 = last 177 end package AxiStreamPkg;
185 ret.
tKeep := genTKeep
(config
);
186 ret.
tStrb := genTKeep
(config
);
188 end function axiStreamMasterInit;
215 ret := getTKeep
(axisMaster.
tKeep)-
1;
239 pos := axiStreamGetUserPos
(axisConfig, axisMaster, bytePos
);
245 -- Handle TUSER_BITS_C=0 case 247 ret :=
(others => '
0'
);
257 bytePos : :=
1)
-- -1 = last 263 user := axiStreamGetuserField
(axisConfig, axisMaster, bytePos
);
264 return(user
(bitPos
));
272 bytePos :
in :=
1)
is 277 pos := axiStreamGetUserPos
(axisConfig, axisMaster, bytePos
);
283 axisMaster.
tUser :=
(others => '
0'
);
293 bytePos :
in :=
1)
is 298 pos := axiStreamGetUserPos
(axisConfig, axisMaster, bytePos
);
306 if (i
) then return t;
else return e;
end if;
311 if (i
) then return t;
else return e;
end if;
316 if (i
) then return t;
else return e;
end if;
321 if (i
) then return t;
else return e;
end if;
326 if (i
) then return t;
else return e;
end if;
331 if (i
) then return t;
else return e;
end if;
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";
355 end function genTKeep;
360 end function genTKeep;
363 variable tKeepFull :
slv(15 downto 0);
365 tKeepFull := resize
(tKeep,
16);
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;
386 end function getTKeep;
388 "X" procedure axiStreamSimSendTxn (
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 400 -- Wait for rising edge 401 wait until clk = '
1';
404 master <= axiStreamMasterInit
(CONFIG_C
);
406 master.
tData <= resize
(tdata,
128);
407 if (tKeep /=
"X") then 408 master.
tKeep <= resize
(tkeep,
16);
410 master.
tLast <= tlast;
416 while (slave.
tReady = '
0'
) loop 417 wait until clk = '
1';
422 procedure axiStreamSimReceiveTxn (
431 tId :
out slv(
7 downto 0);
436 -- Wait for rising edge 437 while (master.
tValid = '
0'
) loop 438 wait until clk = '
1';
450 procedure axiStreamSimSendFrame (
455 data :
in slVectorArray;
456 tUserFirst :
in slv(
7 downto 0) := (
others => '0');
457 tUserLast :
in slv(
7 downto 0) := (
others => '0'))
459 constant DATA_WIDTH_C : := data'
length(1);
460 constant DATA_BYTES_C : := wordCount
(DATA_WIDTH_C,
8);
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'
);
466 for i
in data'
range(1) loop 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'
);
472 axiStreamSimSendTxn
(CONFIG_C, clk, master, slave, txWord, txKeep, toSl
(i = data'
high));
473 txWord :=
(others => '
0'
);
474 txKeep :=
(others => '
0'
);
476 wait until clk = '
1';
481 procedure axiStreamSimSendFrame (
487 tUserFirst :
in slv(
7 downto 0) := (
others => '0');
488 tUserLast :
in slv(
7 downto 0) := (
others => '0'))
492 for i
in data'
range loop 493 for j
in data
(0)'
range loop 494 vec
(i, j
) := data
(i
)(j
);
497 axiStreamSimSendFrame
(CONFIG_C, clk, master, slave, vec, tUserFirst, tUserLast
);
500 procedure axiStreamSimSendFrame (
505 data :
in slv16Array;
506 tUserFirst :
in slv(
7 downto 0) := (
others => '0');
507 tUserLast :
in slv(
7 downto 0) := (
others => '0'))
511 for i
in data'
range loop 512 for j
in data
(0)'
range loop 513 vec
(i, j
) := data
(i
)(j
);
516 axiStreamSimSendFrame
(CONFIG_C, clk, master, slave, vec, tUserFirst, tUserLast
);
519 procedure axiStreamSimSendFrame (
524 data :
in slv32Array;
525 tUserFirst :
in slv(
7 downto 0) := (
others => '0');
526 tUserLast :
in slv(
7 downto 0) := (
others => '0'))
530 for i
in data'
range loop 531 for j
in data
(0)'
range loop 532 vec
(i, j
) := data
(i
)(j
);
535 axiStreamSimSendFrame
(CONFIG_C, clk, master, slave, vec, tUserFirst, tUserLast
);
538 procedure axiStreamSimSendFrame (
543 data :
in slv64Array;
544 tUserFirst :
in slv(
7 downto 0) := (
others => '0');
545 tUserLast :
in slv(
7 downto 0) := (
others => '0'))
549 for i
in data'
range loop 550 for j
in data
(0)'
range loop 551 vec
(i, j
) := data
(i
)(j
);
554 axiStreamSimSendFrame
(CONFIG_C, clk, master, slave, vec, tUserFirst, tUserLast
);
557 procedure axiStreamSimSendFrame (
562 data :
in slv128Array;
563 tUserFirst :
in slv(
7 downto 0) := (
others => '0');
564 tUserLast :
in slv(
7 downto 0) := (
others => '0'))
568 for i
in data'
range loop 569 for j
in data
(0)'
range loop 570 vec
(i, j
) := data
(i
)(j
);
573 axiStreamSimSendFrame
(CONFIG_C, clk, master, slave, vec, tUserFirst, tUserLast
);
577 variable size : :=
1;
591 0)));
-- TUSER_NONE_C 602 variable size : := getSlvSize
(c
);
603 variable retValue :
slv(size-
1 downto 0) :=
(others => '
0'
);
608 assignSlv
(i, retValue, din.
tLast);
617 -- Assume lsb is present 620 -- TKEEP Fixed uses 0 bits 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 629 assignSlv
(i, retValue, resize
(axiStreamGetUserField
(c, din, -
1), c.
TUSER_BITS_C));
-- Last valid byte 633 assignSlv
(i, retValue, resize
(axiStreamGetUserField
(c, din, j
), c.
TUSER_BITS_C));
638 -- Strobe is optional 659 variable user :
slv(maximum
(c.
TUSER_BITS_C-
1,
0) downto 0) :=
(others => '
0'
);
668 assignRecord
(i, din, master.
tLast);
677 assignRecord
(i, din, keep
);
678 master.
tKeep := genTKeep
(conv_integer
(keep
)+
1);
679 else -- KEEP_MODE_C = TKEEP_FIXED_C 686 assignRecord
(i, din, user
);
687 axiStreamSetUserField
(c, master, resize
(user, c.
TUSER_BITS_C),
0);
-- First byte 689 assignRecord
(i, din, user
);
690 axiStreamSetUserField
(c, master, resize
(user, c.
TUSER_BITS_C), -
1);
-- Last valid byte 693 assignRecord
(i, din, user
);
694 axiStreamSetUserField
(c, master, resize
(user, c.
TUSER_BITS_C), -
1);
-- Last valid byte 698 assignRecord
(i, din, user
);
699 axiStreamSetUserField
(c, master, resize
(user, c.
TUSER_BITS_C), j
);
703 user :=
(others => '
0'
);
706 -- Strobe is optional 710 master.
tStrb := master.
tKeep;
-- Strobe follows keep if unused 727 end package body AxiStreamPkg;
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,
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
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
axiStreamSetUserBitaxisConfig,axisMaster,bitPos,bitValue,bytePos,
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
array(natural range <> ,natural range <> ) of AxiStreamSlaveType AxiStreamSlaveVectorArray
TUserModeType TUSER_MODE_C
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
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