SURF  1.0
UdpEngineRx.vhd
Go to the documentation of this file.
1 -------------------------------------------------------------------------------
2 -- File : UdpEngineRx.vhd
3 -- Company : SLAC National Accelerator Laboratory
4 -- Created : 2015-08-20
5 -- Last update: 2017-05-22
6 -------------------------------------------------------------------------------
7 -- Description: UDP RX Engine Module
8 -- Note: UDP checksum checked in EthMac core
9 -------------------------------------------------------------------------------
10 -- This file is part of 'SLAC Firmware Standard Library'.
11 -- It is subject to the license terms in the LICENSE.txt file found in the
12 -- top-level directory of this distribution and at:
13 -- https://confluence.slac.stanford.edu/display/ppareg/LICENSE.html.
14 -- No part of 'SLAC Firmware Standard Library', including this file,
15 -- may be copied, modified, propagated, or distributed except according to
16 -- the terms contained in the LICENSE.txt file.
17 -------------------------------------------------------------------------------
18 
19 library ieee;
20 use ieee.std_logic_1164.all;
21 use ieee.std_logic_unsigned.all;
22 use ieee.std_logic_arith.all;
23 
24 use work.StdRtlPkg.all;
25 use work.AxiStreamPkg.all;
26 use work.SsiPkg.all;
27 use work.EthMacPkg.all;
28 
29 --! @see entity
30  --! @ingroup ethernet_UdpEngine
31 entity UdpEngineRx is
32  generic (
33  -- Simulation Generics
34  TPD_G : time := 1 ns;
35  -- UDP General Generic
36  DHCP_G : boolean := false;
37  -- UDP Server Generics
38  SERVER_EN_G : boolean := true;
39  SERVER_SIZE_G : positive := 1;
40  SERVER_PORTS_G : PositiveArray := (0 => 8192);
41  -- UDP Client Generics
42  CLIENT_EN_G : boolean := true;
43  CLIENT_SIZE_G : positive := 1;
44  CLIENT_PORTS_G : PositiveArray := (0 => 8193));
45  port (
46  -- Local Configurations
47  localIp : in slv(31 downto 0); -- big-Endian configuration
48  -- Interface to IPV4 Engine
51  -- Interface to UDP Server engine(s)
57  -- Interface to UDP Client engine(s)
58  clientRemoteDet : out slv(CLIENT_SIZE_G-1 downto 0);
61  -- Interface to DHCP Engine
64  -- Clock and Reset
65  clk : in sl;
66  rst : in sl);
67 end UdpEngineRx;
68 
69 architecture rtl of UdpEngineRx is
70 
71  constant SERVER_PORTS_C : Slv16Array(SERVER_SIZE_G-1 downto 0) := EthPortArrayBigEndian(SERVER_PORTS_G, SERVER_SIZE_G);
72  constant CLIENT_PORTS_C : Slv16Array(CLIENT_SIZE_G-1 downto 0) := EthPortArrayBigEndian(CLIENT_PORTS_G, CLIENT_SIZE_G);
73 
74  type RouteType is (
75  NULL_S,
76  SERVER_S,
77  CLIENT_S,
78  DHCP_S);
79 
80  type StateType is (
81  IDLE_S,
82  CHECK_PORT_S,
83  MOVE_S,
84  LAST_S);
85 
86  type RegType is record
90  clientRemoteDet : slv(CLIENT_SIZE_G-1 downto 0);
91  byteCnt : slv(15 downto 0);
92  tData : slv(127 downto 0);
93  sof : sl;
94  localHost : sl;
95  route : RouteType;
96  rxSlave : AxiStreamSlaveType;
97  dhcpMaster : AxiStreamMasterType;
98  serverMaster : AxiStreamMasterType;
99  clientMaster : AxiStreamMasterType;
100  state : StateType;
101  end record RegType;
102  constant REG_INIT_C : RegType := (
103  serverRemotePort => (others => (others => '0')),
104  serverRemoteIp => (others => (others => '0')),
105  serverRemoteMac => (others => (others => '0')),
106  clientRemoteDet => (others => '0'),
107  byteCnt => (others => '0'),
108  tData => (others => '0'),
109  sof => '1',
110  localHost => '0',
111  route => NULL_S,
112  rxSlave => AXI_STREAM_SLAVE_INIT_C,
113  dhcpMaster => AXI_STREAM_MASTER_INIT_C,
114  serverMaster => AXI_STREAM_MASTER_INIT_C,
115  clientMaster => AXI_STREAM_MASTER_INIT_C,
116  state => IDLE_S);
117 
118  signal r : RegType := REG_INIT_C;
119  signal rin : RegType;
120 
121  signal rxMaster : AxiStreamMasterType;
122  signal rxSlave : AxiStreamSlaveType;
123 
124  signal serverSlave : AxiStreamSlaveType;
125  signal clientSlave : AxiStreamSlaveType;
126  signal dhcpSlave : AxiStreamSlaveType;
127 
128  -- attribute dont_touch : string;
129  -- attribute dont_touch of r : signal is "TRUE";
130 
131 begin
132 
133  U_RxPipeline : entity work.AxiStreamPipeline
134  generic map (
135  TPD_G => TPD_G,
136  PIPE_STAGES_G => 0)
137  port map (
138  axisClk => clk,
139  axisRst => rst,
142  mAxisMaster => rxMaster,
143  mAxisSlave => rxSlave);
144 
145  comb : process (clientSlave, dhcpSlave, localIp, r, rst, rxMaster,
146  serverSlave) is
147  variable v : RegType;
148  variable i : natural;
149  begin
150  -- Latch the current value
151  v := r;
152 
153  -- Reset the flags
154  v.clientRemoteDet := (others => '0');
155  v.rxSlave := AXI_STREAM_SLAVE_INIT_C;
156  if serverSlave.tReady = '1' then
157  v.serverMaster.tValid := '0';
158  v.serverMaster.tLast := '0';
159  v.serverMaster.tUser := (others => '0');
160  v.serverMaster.tKeep := (others => '1');
161  end if;
162  if clientSlave.tReady = '1' then
163  v.clientMaster.tValid := '0';
164  v.clientMaster.tLast := '0';
165  v.clientMaster.tUser := (others => '0');
166  v.clientMaster.tKeep := (others => '1');
167  end if;
168  if (dhcpSlave.tReady) = '1' then
169  v.dhcpMaster.tValid := '0';
170  v.dhcpMaster.tLast := '0';
171  v.dhcpMaster.tUser := (others => '0');
172  v.dhcpMaster.tKeep := (others => '1');
173  end if;
174 
175  -- State Machine
176  case r.state is
177  ----------------------------------------------------------------------
178  when IDLE_S =>
179  -- Check for data
180  if (rxMaster.tValid = '1') then
181  -- Accept the data
182  v.rxSlave.tReady := '1';
183  -- Check for SOF with no EOF
184  if (ssiGetUserSof(EMAC_AXIS_CONFIG_C, rxMaster) = '1') and (rxMaster.tLast = '0') then
185  -- Latch the first header
186  v.tData := rxMaster.tData;
187  -- Next state
188  v.state := CHECK_PORT_S;
189  end if;
190  end if;
191  ----------------------------------------------------------------------
192  when CHECK_PORT_S =>
193  -- Check for data
194  if (rxMaster.tValid = '1') then
195  -- Accept the data
196  v.rxSlave.tReady := '1';
197  -- Set default route type
198  v.route := NULL_S;
199  ------------------------------------------------
200  -- Notes: Non-Standard IPv4 Pseudo Header Format
201  ------------------------------------------------
202  -- tData[0][47:0] = Remote MAC Address
203  -- tData[0][63:48] = zeros
204  -- tData[0][95:64] = Remote IP Address
205  -- tData[0][127:96] = Local IP address
206  -- tData[1][7:0] = zeros
207  -- tData[1][15:8] = Protocol Type = UDP
208  -- tData[1][31:16] = IPv4 Pseudo header length
209  -- tData[1][47:32] = Remote Port
210  -- tData[1][63:48] = Local Port
211  -- tData[1][79:64] = UDP Length
212  -- tData[1][95:80] = UDP Checksum
213  -- tData[1][127:96] = UDP Datagram
214  ------------------------------------------------
215  -- Check the IP port
216  if (r.tData(127 downto 96) = localIp) then
217  -- Check if server engine(s) is enabled
218  if (SERVER_EN_G = true) then
219  for i in (SERVER_SIZE_G-1) downto 0 loop
220  -- Check if port is defined
221  if (v.route = NULL_S) and (rxMaster.tData(63 downto 48) = SERVER_PORTS_C(i)) then
222  v.route := SERVER_S;
223  v.serverMaster.tDest := toSlv(i, 8);
224  v.serverRemotePort(i) := rxMaster.tData(47 downto 32);
225  v.serverRemoteIp(i) := r.tData(95 downto 64);
226  v.serverRemoteMac(i) := r.tData(47 downto 0);
227  end if;
228  end loop;
229  end if;
230  -- Check if clients engine(s) is enabled
231  if (CLIENT_EN_G = true) then
232  for i in (CLIENT_SIZE_G-1) downto 0 loop
233  -- Check if port is defined
234  if (v.route = NULL_S) and (rxMaster.tData(63 downto 48) = CLIENT_PORTS_C(i)) then
235  v.route := CLIENT_S;
236  v.clientMaster.tDest := toSlv(i, 8);
237  v.clientRemoteDet(i) := '1';
238  end if;
239  end loop;
240  end if;
241  end if;
242  -- Check if DHCP engine is enabled and DHCP packet
243  if (DHCP_G = true) and (rxMaster.tData(47 downto 32) = DHCP_SPORT) and (rxMaster.tData(63 downto 48) = DHCP_CPORT) then
244  v.route := DHCP_S;
245  end if;
246  -- Get the UDP length = UDP HDR + UDP data
247  v.byteCnt(15 downto 8) := rxMaster.tData(71 downto 64);
248  v.byteCnt(7 downto 0) := rxMaster.tData(79 downto 72);
249  -- Remove the 8 byte UDP header
250  v.byteCnt := v.byteCnt - 8;
251  -- Track the leftovers
252  v.tData(31 downto 0) := rxMaster.tData(127 downto 96);
253  -- Set the flag
254  v.sof := '1';
255  -- Check if localhost
256  if (localIp = r.tData(95 downto 64)) then
257  v.localHost := '1';
258  else
259  v.localHost := '0';
260  end if;
261  -- Check for non-NULL route type
262  if (v.route /= NULL_S) then
263  -- Check for leftovers
264  if (rxMaster.tLast = '1') or (v.byteCnt <= 4) then
265  -- Next state
266  v.state := LAST_S;
267  else
268  -- Next state
269  v.state := MOVE_S;
270  end if;
271  else
272  -- Next state
273  v.state := IDLE_S;
274  end if;
275  end if;
276  ----------------------------------------------------------------------
277  when MOVE_S =>
278  -- Check the route type
279  case r.route is
280  ----------------------------------------------------------------------
281  when SERVER_S =>
282  -- Check if ready to move data
283  if (rxMaster.tValid = '1') and (v.serverMaster.tValid = '0') then
284  -- Accept the data
285  v.rxSlave.tReady := '1';
286  -- Move the data
287  v.serverMaster.tValid := '1';
288  v.serverMaster.tData(31 downto 0) := r.tData(31 downto 0);
289  v.serverMaster.tData(127 downto 32) := rxMaster.tData(95 downto 0);
290  ssiSetUserSof(EMAC_AXIS_CONFIG_C, v.serverMaster, r.sof);
291  -- Track the leftovers
292  v.tData(31 downto 0) := rxMaster.tData(127 downto 96);
293  -- Reset the flag
294  v.sof := '0';
295  -- Decrement the counter
296  v.byteCnt := r.byteCnt - 16;
297  -- Check for tLast or the byte counter
298  if (rxMaster.tLast = '1') or (r.byteCnt <= 16) or (v.byteCnt <= 4) then
299  -- Check if not localhost
300  if (r.localHost = '0') then
301  -- Check for leftovers
302  if (v.byteCnt <= 4) and (r.byteCnt /= 16) then
303  -- Next state
304  v.state := LAST_S;
305  else
306  -- Terminate the packet
307  v.serverMaster.tKeep := genTKeep(conv_integer(r.byteCnt));
308  v.serverMaster.tLast := '1';
309  -- Next state
310  v.state := IDLE_S;
311  end if;
312  else
313  -- Else localhost communication
314  if (rxMaster.tKeep(15 downto 12) /= 0) then
315  v.byteCnt := (x"00" & "000" & onesCount(x"000" & rxMaster.tKeep(15 downto 12)));
316  -- Next state
317  v.state := LAST_S;
318  else
319  v.serverMaster.tKeep := rxMaster.tKeep(11 downto 0) & x"F";
320  v.serverMaster.tLast := '1';
321  -- Next state
322  v.state := IDLE_S;
323  end if;
324  end if;
325  end if;
326  end if;
327  ----------------------------------------------------------------------
328  when CLIENT_S =>
329  -- Check if ready to move data
330  if (rxMaster.tValid = '1') and (v.clientMaster.tValid = '0') then
331  -- Accept the data
332  v.rxSlave.tReady := '1';
333  -- Move the data
334  v.clientMaster.tValid := '1';
335  v.clientMaster.tData(31 downto 0) := r.tData(31 downto 0);
336  v.clientMaster.tData(127 downto 32) := rxMaster.tData(95 downto 0);
337  ssiSetUserSof(EMAC_AXIS_CONFIG_C, v.clientMaster, r.sof);
338  -- Track the leftovers
339  v.tData(31 downto 0) := rxMaster.tData(127 downto 96);
340  -- Reset the flag
341  v.sof := '0';
342  -- Decrement the counter
343  v.byteCnt := r.byteCnt - 16;
344  -- Check for tLast or the byte counter
345  if (rxMaster.tLast = '1') or (r.byteCnt <= 16) or (v.byteCnt <= 4) then
346  -- Check if not localhost
347  if (r.localHost = '0') then
348  -- Check for leftovers
349  if (v.byteCnt <= 4) and (r.byteCnt /= 16) then
350  -- Next state
351  v.state := LAST_S;
352  else
353  -- Terminate the packet
354  v.clientMaster.tKeep := genTKeep(conv_integer(r.byteCnt));
355  v.clientMaster.tLast := '1';
356  -- Next state
357  v.state := IDLE_S;
358  end if;
359  else
360  -- Else localhost communication
361  if (rxMaster.tKeep(15 downto 12) /= 0) then
362  v.byteCnt := (x"00" & "000" & onesCount(x"000" & rxMaster.tKeep(15 downto 12)));
363  -- Next state
364  v.state := LAST_S;
365  else
366  v.clientMaster.tKeep := rxMaster.tKeep(11 downto 0) & x"F";
367  v.clientMaster.tLast := '1';
368  -- Next state
369  v.state := IDLE_S;
370  end if;
371  end if;
372  end if;
373  end if;
374  ----------------------------------------------------------------------
375  when DHCP_S =>
376  -- Check if ready to move data
377  if (rxMaster.tValid = '1') and (v.dhcpMaster.tValid = '0') then
378  -- Accept the data
379  v.rxSlave.tReady := '1';
380  -- Move the data
381  v.dhcpMaster.tValid := '1';
382  v.dhcpMaster.tData(31 downto 0) := r.tData(31 downto 0);
383  v.dhcpMaster.tData(127 downto 32) := rxMaster.tData(95 downto 0);
384  ssiSetUserSof(EMAC_AXIS_CONFIG_C, v.dhcpMaster, r.sof);
385  -- Track the leftovers
386  v.tData(31 downto 0) := rxMaster.tData(127 downto 96);
387  -- Reset the flag
388  v.sof := '0';
389  -- Decrement the counter
390  v.byteCnt := r.byteCnt - 16;
391  -- Check for tLast or the byte counter
392  if (rxMaster.tLast = '1') or (r.byteCnt <= 16) or (v.byteCnt <= 4) then
393  -- Check for leftovers
394  if (v.byteCnt <= 4) and (r.byteCnt /= 16) then
395  -- Next state
396  v.state := LAST_S;
397  else
398  -- Terminate the packet
399  v.dhcpMaster.tKeep := genTKeep(conv_integer(r.byteCnt));
400  v.dhcpMaster.tLast := '1';
401  -- Next state
402  v.state := IDLE_S;
403  end if;
404  end if;
405  end if;
406  ----------------------------------------------------------------------
407  when NULL_S =>
408  -- Next state
409  v.state := IDLE_S;
410  ----------------------------------------------------------------------
411  end case;
412  ----------------------------------------------------------------------
413  when LAST_S =>
414  -- Check the route type
415  case r.route is
416  ----------------------------------------------------------------------
417  when SERVER_S =>
418  -- Check if ready to move data
419  if (v.serverMaster.tValid = '0') then
420  -- Move the data
421  v.serverMaster.tValid := '1';
422  v.serverMaster.tData := r.tData;
423  v.serverMaster.tKeep := genTKeep(conv_integer(r.byteCnt));
424  v.serverMaster.tLast := '1';
425  ssiSetUserSof(EMAC_AXIS_CONFIG_C, v.serverMaster, r.sof);
426  -- Next state
427  v.state := IDLE_S;
428  end if;
429  ----------------------------------------------------------------------
430  when CLIENT_S =>
431  -- Check if ready to move data
432  if (v.clientMaster.tValid = '0') then
433  -- Move the data
434  v.clientMaster.tValid := '1';
435  v.clientMaster.tData := r.tData;
436  v.clientMaster.tKeep := genTKeep(conv_integer(r.byteCnt));
437  v.clientMaster.tLast := '1';
438  ssiSetUserSof(EMAC_AXIS_CONFIG_C, v.clientMaster, r.sof);
439  -- Next state
440  v.state := IDLE_S;
441  end if;
442  ----------------------------------------------------------------------
443  when DHCP_S =>
444  -- Check if ready to move data
445  if (v.dhcpMaster.tValid = '0') then
446  -- Move the data
447  v.dhcpMaster.tValid := '1';
448  v.dhcpMaster.tData := r.tData;
449  v.dhcpMaster.tKeep := genTKeep(conv_integer(r.byteCnt));
450  v.dhcpMaster.tLast := '1';
451  ssiSetUserSof(EMAC_AXIS_CONFIG_C, v.dhcpMaster, r.sof);
452  -- Next state
453  v.state := IDLE_S;
454  end if;
455  ----------------------------------------------------------------------
456  when NULL_S =>
457  -- Next state
458  v.state := IDLE_S;
459  ----------------------------------------------------------------------
460  end case;
461  ----------------------------------------------------------------------
462  end case;
463 
464  -- Reset
465  if (rst = '1') then
466  v := REG_INIT_C;
467  end if;
468 
469  -- Register the variable for next clock cycle
470  rin <= v;
471 
472  -- Outputs
477  rxSlave <= v.rxSlave;
478 
479  end process comb;
480 
481  seq : process (clk) is
482  begin
483  if rising_edge(clk) then
484  r <= rin after TPD_G;
485  end if;
486  end process seq;
487 
488  U_Servers : entity work.AxiStreamDeMux
489  generic map (
490  TPD_G => TPD_G,
491  PIPE_STAGES_G => 1,
493  port map (
494  -- Clock and reset
495  axisClk => clk,
496  axisRst => rst,
497  -- Slave
498  sAxisMaster => r.serverMaster,
499  sAxisSlave => serverSlave,
500  -- Masters
503 
504  U_Clients : entity work.AxiStreamDeMux
505  generic map (
506  TPD_G => TPD_G,
507  PIPE_STAGES_G => 1,
509  port map (
510  -- Clock and reset
511  axisClk => clk,
512  axisRst => rst,
513  -- Slave
514  sAxisMaster => r.clientMaster,
515  sAxisSlave => clientSlave,
516  -- Masters
519 
520  U_Dhcp : entity work.AxiStreamPipeline
521  generic map (
522  TPD_G => TPD_G,
523  PIPE_STAGES_G => 0)
524  port map (
525  axisClk => clk,
526  axisRst => rst,
527  sAxisMaster => r.dhcpMaster,
528  sAxisSlave => dhcpSlave,
531 
532 end rtl;
out serverRemoteMacSlv48Array( SERVER_SIZE_G- 1 downto 0)
Definition: UdpEngineRx.vhd:54
PIPE_STAGES_Ginteger range 0 to 16:= 0
PIPE_STAGES_Gnatural range 0 to 16:= 0
out serverRemoteIpSlv32Array( SERVER_SIZE_G- 1 downto 0)
Definition: UdpEngineRx.vhd:53
array(natural range <> ) of AxiStreamSlaveType AxiStreamSlaveArray
SERVER_EN_Gboolean := true
Definition: UdpEngineRx.vhd:38
array(natural range <> ) of slv( 31 downto 0) Slv32Array
Definition: StdRtlPkg.vhd:379
out obServerMastersAxiStreamMasterArray( SERVER_SIZE_G- 1 downto 0)
Definition: UdpEngineRx.vhd:55
slv( 15 downto 0) := x"4300" DHCP_SPORT
Definition: EthMacPkg.vhd:45
sl sof
Definition: SsiPkg.vhd:72
CLIENT_PORTS_GPositiveArray :=( 0=> 8193)
Definition: UdpEngineRx.vhd:44
CLIENT_EN_Gboolean := true
Definition: UdpEngineRx.vhd:42
std_logic sl
Definition: StdRtlPkg.vhd:28
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 slv( 47 downto 0) Slv48Array
Definition: StdRtlPkg.vhd:363
in ibUdpMasterAxiStreamMasterType
Definition: UdpEngineRx.vhd:49
out mAxisMastersAxiStreamMasterArray( NUM_MASTERS_G- 1 downto 0)
out sAxisSlaveAxiStreamSlaveType
in localIpslv( 31 downto 0)
Definition: UdpEngineRx.vhd:47
slv( 15 downto 0) tKeep
in mAxisSlaveAxiStreamSlaveType
slv( 15 downto 0) := x"4400" DHCP_CPORT
Definition: EthMacPkg.vhd:44
out sAxisSlaveAxiStreamSlaveType
SERVER_SIZE_Gpositive := 1
Definition: UdpEngineRx.vhd:39
out clientRemoteDetslv( CLIENT_SIZE_G- 1 downto 0)
Definition: UdpEngineRx.vhd:58
slv( 127 downto 0) tData
array(natural range <> ) of positive PositiveArray
Definition: StdRtlPkg.vhd:35
in sAxisMasterAxiStreamMasterType
AxiStreamSlaveType :=(tReady => '0') AXI_STREAM_SLAVE_INIT_C
TPD_Gtime := 1 ns
in sAxisMasterAxiStreamMasterType
slv( 127 downto 0) tUser
array(natural range <> ) of AxiStreamMasterType AxiStreamMasterArray
out mAxisMasterAxiStreamMasterType
CLIENT_SIZE_Gpositive := 1
Definition: UdpEngineRx.vhd:43
array(natural range <> ) of slv( 15 downto 0) Slv16Array
Definition: StdRtlPkg.vhd:395
TPD_Gtime := 1 ns
Definition: UdpEngineRx.vhd:34
out ibDhcpMasterAxiStreamMasterType
Definition: UdpEngineRx.vhd:62
slv( 7 downto 0) tDest
in mAxisSlavesAxiStreamSlaveArray( NUM_MASTERS_G- 1 downto 0)
_library_ ieeeieee
in obClientSlavesAxiStreamSlaveArray( CLIENT_SIZE_G- 1 downto 0)
Definition: UdpEngineRx.vhd:60
SERVER_PORTS_GPositiveArray :=( 0=> 8192)
Definition: UdpEngineRx.vhd:40
DHCP_Gboolean := false
Definition: UdpEngineRx.vhd:36
in obServerSlavesAxiStreamSlaveArray( SERVER_SIZE_G- 1 downto 0)
Definition: UdpEngineRx.vhd:56
NUM_MASTERS_Ginteger range 1 to 32:= 12
in ibDhcpSlaveAxiStreamSlaveType
Definition: UdpEngineRx.vhd:63
AxiStreamConfigType :=(TSTRB_EN_C => false,TDATA_BYTES_C => 16,TDEST_BITS_C => 8,TID_BITS_C => 0,TKEEP_MODE_C => TKEEP_COMP_C,TUSER_BITS_C => 4,TUSER_MODE_C => TUSER_FIRST_LAST_C) EMAC_AXIS_CONFIG_C
Definition: EthMacPkg.vhd:58
std_logic_vector slv
Definition: StdRtlPkg.vhd:29
out serverRemotePortSlv16Array( SERVER_SIZE_G- 1 downto 0)
Definition: UdpEngineRx.vhd:52
out ibUdpSlaveAxiStreamSlaveType
Definition: UdpEngineRx.vhd:50
out obClientMastersAxiStreamMasterArray( CLIENT_SIZE_G- 1 downto 0)
Definition: UdpEngineRx.vhd:59