Skip to content

Commit b012c9b

Browse files
committed
Merge branch 'cabal_mfb_switch' into 'devel'
feat(mfb_tools): add new MFB_SWITCH_SIMPLE module See merge request ndk/ndk-fpga!254
2 parents 1054393 + 4be52cf commit b012c9b

File tree

4 files changed

+271
-1
lines changed

4 files changed

+271
-1
lines changed

comp/mfb_tools/flow/metadata_extractor/metadata_extractor.vhd

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -199,7 +199,7 @@ begin
199199
generic map(
200200
ITEMS => MVB_ITEMS ,
201201
ITEM_WIDTH => MFB_META_WIDTH,
202-
FAKE_PIPE => (not OUT_MFB_PIPE_EN),
202+
FAKE_PIPE => (not OUT_MVB_PIPE_EN),
203203
USE_DST_RDY => true ,
204204
OPT => "SRL" ,
205205
DEVICE => DEVICE
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
# Modules.tcl: Components include script
2+
# Copyright (C) 2025 CESNET
3+
# Author(s): Jakub Cabal <[email protected]>
4+
#
5+
# SPDX-License-Identifier: BSD-3-Clause
6+
7+
# Set paths
8+
set MFB_FIFOX_BASE "$OFM_PATH/comp/mfb_tools/storage/fifox"
9+
set MFB_SPLITTER_BASE "$OFM_PATH/comp/mfb_tools/flow/splitter_simple"
10+
set MFB_MERGER_BASE "$OFM_PATH/comp/mfb_tools/flow/merger_simple"
11+
12+
# Packages
13+
lappend PACKAGES "$OFM_PATH/comp/base/pkg/math_pack.vhd"
14+
lappend PACKAGES "$OFM_PATH/comp/base/pkg/type_pack.vhd"
15+
16+
# Components
17+
lappend COMPONENTS [ list "MFB_FIFOX" $MFB_FIFOX_BASE "FULL" ]
18+
lappend COMPONENTS [ list "MFB_SPLITTER" $MFB_SPLITTER_BASE "FULL" ]
19+
lappend COMPONENTS [ list "MFB_MERGER" $MFB_MERGER_BASE "FULL" ]
20+
21+
# Files
22+
lappend MOD "$ENTITY_BASE/mfb_switch_simple.vhd"
Lines changed: 235 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,235 @@
1+
-- mfb_switch_simple.vhd:
2+
-- Copyright (C) 2025 CESNET z. s. p. o.
3+
-- Author(s): Jakub Cabal <[email protected]>
4+
--
5+
-- SPDX-License-Identifier: BSD-3-Clause
6+
7+
library IEEE;
8+
use IEEE.std_logic_1164.all;
9+
use IEEE.numeric_std.all;
10+
11+
library work;
12+
use work.type_pack.all;
13+
use work.math_pack.all;
14+
15+
entity MFB_SWITCH_SIMPLE is
16+
generic (
17+
PORTS : natural := 2;
18+
REGIONS : natural := 4;
19+
REGION_SIZE : natural := 8;
20+
BLOCK_SIZE : natural := 8;
21+
ITEM_WIDTH : natural := 8;
22+
META_WIDTH : natural := 1;
23+
FIFO_DEPTH : natural := 512;
24+
-- Enable masking SOF and EOF due to switch to the other input.
25+
MASKING_EN : boolean := True;
26+
-- Maximum amount of clock periods with destination ready before
27+
-- it tries to switch to the other input.
28+
CNT_MAX : integer := 64;
29+
-- FPGA device name: ULTRASCALE, STRATIX10, AGILEX, ...
30+
DEVICE : string := "AGILEX"
31+
);
32+
port (
33+
-- =====================================================================
34+
-- Clock and Reset
35+
-- =====================================================================
36+
CLK : in std_logic;
37+
RESET : in std_logic;
38+
39+
-- =====================================================================
40+
-- Multiple input MFB interfaces
41+
-- =====================================================================
42+
RX_MFB_SEL : in slv_array_t(PORTS-1 downto 0)(REGIONS*max(1,log2(PORTS))-1 downto 0); -- valid with SOF
43+
RX_MFB_META : in slv_array_t(PORTS-1 downto 0)(REGIONS*META_WIDTH-1 downto 0);
44+
RX_MFB_DATA : in slv_array_t(PORTS-1 downto 0)(REGIONS*REGION_SIZE*BLOCK_SIZE*ITEM_WIDTH-1 downto 0);
45+
RX_MFB_SOF : in slv_array_t(PORTS-1 downto 0)(REGIONS-1 downto 0);
46+
RX_MFB_EOF : in slv_array_t(PORTS-1 downto 0)(REGIONS-1 downto 0);
47+
RX_MFB_SOF_POS : in slv_array_t(PORTS-1 downto 0)(REGIONS*max(1, log2(REGION_SIZE))-1 downto 0);
48+
RX_MFB_EOF_POS : in slv_array_t(PORTS-1 downto 0)(REGIONS*log2(REGION_SIZE*BLOCK_SIZE)-1 downto 0);
49+
RX_MFB_SRC_RDY : in std_logic_vector(PORTS-1 downto 0);
50+
RX_MFB_DST_RDY : out std_logic_vector(PORTS-1 downto 0);
51+
52+
-- =====================================================================
53+
-- Multiple output MFB interfaces
54+
-- =====================================================================
55+
TX_MFB_META : out slv_array_t(PORTS-1 downto 0)(REGIONS*META_WIDTH-1 downto 0);
56+
TX_MFB_DATA : out slv_array_t(PORTS-1 downto 0)(REGIONS*REGION_SIZE*BLOCK_SIZE*ITEM_WIDTH-1 downto 0);
57+
TX_MFB_SOF : out slv_array_t(PORTS-1 downto 0)(REGIONS-1 downto 0);
58+
TX_MFB_EOF : out slv_array_t(PORTS-1 downto 0)(REGIONS-1 downto 0);
59+
TX_MFB_SOF_POS : out slv_array_t(PORTS-1 downto 0)(REGIONS*max(1, log2(REGION_SIZE))-1 downto 0);
60+
TX_MFB_EOF_POS : out slv_array_t(PORTS-1 downto 0)(REGIONS*log2(REGION_SIZE*BLOCK_SIZE)-1 downto 0);
61+
TX_MFB_SRC_RDY : out std_logic_vector(PORTS-1 downto 0);
62+
TX_MFB_DST_RDY : in std_logic_vector(PORTS-1 downto 0)
63+
);
64+
end entity;
65+
66+
architecture FULL of MFB_SWITCH_SIMPLE is
67+
68+
constant SW_PATHS : natural := 2**PORTS;
69+
70+
signal sw_mfb_meta_arr : slv_array_t(SW_PATHS-1 downto 0)(REGIONS*META_WIDTH-1 downto 0);
71+
signal sw_mfb_data_arr : slv_array_t(SW_PATHS-1 downto 0)(REGIONS*REGION_SIZE*BLOCK_SIZE*ITEM_WIDTH-1 downto 0);
72+
signal sw_mfb_sof_arr : slv_array_t(SW_PATHS-1 downto 0)(REGIONS-1 downto 0);
73+
signal sw_mfb_eof_arr : slv_array_t(SW_PATHS-1 downto 0)(REGIONS-1 downto 0);
74+
signal sw_mfb_sof_pos_arr : slv_array_t(SW_PATHS-1 downto 0)(REGIONS*max(1, log2(REGION_SIZE))-1 downto 0);
75+
signal sw_mfb_eof_pos_arr : slv_array_t(SW_PATHS-1 downto 0)(REGIONS*log2(REGION_SIZE*BLOCK_SIZE)-1 downto 0);
76+
signal sw_mfb_src_rdy_arr : std_logic_vector(SW_PATHS-1 downto 0);
77+
signal sw_mfb_dst_rdy_arr : std_logic_vector(SW_PATHS-1 downto 0);
78+
79+
signal fo_mfb_meta_arr : slv_array_t(SW_PATHS-1 downto 0)(REGIONS*META_WIDTH-1 downto 0);
80+
signal fo_mfb_data_arr : slv_array_t(SW_PATHS-1 downto 0)(REGIONS*REGION_SIZE*BLOCK_SIZE*ITEM_WIDTH-1 downto 0);
81+
signal fo_mfb_sof_arr : slv_array_t(SW_PATHS-1 downto 0)(REGIONS-1 downto 0);
82+
signal fo_mfb_eof_arr : slv_array_t(SW_PATHS-1 downto 0)(REGIONS-1 downto 0);
83+
signal fo_mfb_sof_pos_arr : slv_array_t(SW_PATHS-1 downto 0)(REGIONS*max(1, log2(REGION_SIZE))-1 downto 0);
84+
signal fo_mfb_eof_pos_arr : slv_array_t(SW_PATHS-1 downto 0)(REGIONS*log2(REGION_SIZE*BLOCK_SIZE)-1 downto 0);
85+
signal fo_mfb_src_rdy_arr : std_logic_vector(SW_PATHS-1 downto 0);
86+
signal fo_mfb_dst_rdy_arr : std_logic_vector(SW_PATHS-1 downto 0);
87+
88+
signal mx_mfb_meta_arr : slv_array_t(SW_PATHS-1 downto 0)(REGIONS*META_WIDTH-1 downto 0);
89+
signal mx_mfb_data_arr : slv_array_t(SW_PATHS-1 downto 0)(REGIONS*REGION_SIZE*BLOCK_SIZE*ITEM_WIDTH-1 downto 0);
90+
signal mx_mfb_sof_arr : slv_array_t(SW_PATHS-1 downto 0)(REGIONS-1 downto 0);
91+
signal mx_mfb_eof_arr : slv_array_t(SW_PATHS-1 downto 0)(REGIONS-1 downto 0);
92+
signal mx_mfb_sof_pos_arr : slv_array_t(SW_PATHS-1 downto 0)(REGIONS*max(1, log2(REGION_SIZE))-1 downto 0);
93+
signal mx_mfb_eof_pos_arr : slv_array_t(SW_PATHS-1 downto 0)(REGIONS*log2(REGION_SIZE*BLOCK_SIZE)-1 downto 0);
94+
signal mx_mfb_src_rdy_arr : std_logic_vector(SW_PATHS-1 downto 0);
95+
signal mx_mfb_dst_rdy_arr : std_logic_vector(SW_PATHS-1 downto 0);
96+
97+
begin
98+
99+
en_g: if PORTS > 1 generate
100+
101+
input_g : for ii in 0 to PORTS-1 generate
102+
split_i : entity work.MFB_SPLITTER_SIMPLE_GEN
103+
generic map (
104+
SPLITTER_OUTPUTS => PORTS,
105+
REGIONS => REGIONS,
106+
REGION_SIZE => REGION_SIZE,
107+
BLOCK_SIZE => BLOCK_SIZE,
108+
ITEM_WIDTH => ITEM_WIDTH,
109+
META_WIDTH => META_WIDTH,
110+
DEVICE => DEVICE
111+
)
112+
port map (
113+
CLK => CLK,
114+
RESET => RESET,
115+
116+
RX_MFB_SEL => RX_MFB_SEL(ii),
117+
RX_MFB_META => RX_MFB_META(ii),
118+
RX_MFB_DATA => RX_MFB_DATA(ii),
119+
RX_MFB_SOF => RX_MFB_SOF(ii),
120+
RX_MFB_EOF => RX_MFB_EOF(ii),
121+
RX_MFB_SOF_POS => RX_MFB_SOF_POS(ii),
122+
RX_MFB_EOF_POS => RX_MFB_EOF_POS(ii),
123+
RX_MFB_SRC_RDY => RX_MFB_SRC_RDY(ii),
124+
RX_MFB_DST_RDY => RX_MFB_DST_RDY(ii),
125+
126+
TX_MFB_META => sw_mfb_meta_arr((ii+1)*PORTS-1 downto ii*PORTS),
127+
TX_MFB_DATA => sw_mfb_data_arr((ii+1)*PORTS-1 downto ii*PORTS),
128+
TX_MFB_SOF => sw_mfb_sof_arr((ii+1)*PORTS-1 downto ii*PORTS),
129+
TX_MFB_EOF => sw_mfb_eof_arr((ii+1)*PORTS-1 downto ii*PORTS),
130+
TX_MFB_SOF_POS => sw_mfb_sof_pos_arr((ii+1)*PORTS-1 downto ii*PORTS),
131+
TX_MFB_EOF_POS => sw_mfb_eof_pos_arr((ii+1)*PORTS-1 downto ii*PORTS),
132+
TX_MFB_SRC_RDY => sw_mfb_src_rdy_arr((ii+1)*PORTS-1 downto ii*PORTS),
133+
TX_MFB_DST_RDY => sw_mfb_dst_rdy_arr((ii+1)*PORTS-1 downto ii*PORTS)
134+
);
135+
end generate;
136+
137+
fifo_g : for ii in 0 to SW_PATHS-1 generate
138+
fifo_i : entity work.MFB_FIFOX
139+
generic map (
140+
REGIONS => REGIONS,
141+
REGION_SIZE => REGION_SIZE,
142+
BLOCK_SIZE => BLOCK_SIZE,
143+
ITEM_WIDTH => ITEM_WIDTH,
144+
META_WIDTH => META_WIDTH,
145+
FIFO_DEPTH => FIFO_DEPTH,
146+
RAM_TYPE => "AUTO",
147+
DEVICE => DEVICE
148+
)
149+
port map (
150+
CLK => CLK,
151+
RST => RESET,
152+
153+
RX_DATA => sw_mfb_data_arr(ii),
154+
RX_META => sw_mfb_meta_arr(ii),
155+
RX_SOF_POS => sw_mfb_sof_pos_arr(ii),
156+
RX_EOF_POS => sw_mfb_eof_pos_arr(ii),
157+
RX_SOF => sw_mfb_sof_arr(ii),
158+
RX_EOF => sw_mfb_eof_arr(ii),
159+
RX_SRC_RDY => sw_mfb_src_rdy_arr(ii),
160+
RX_DST_RDY => sw_mfb_dst_rdy_arr(ii),
161+
162+
TX_DATA => fo_mfb_data_arr(ii),
163+
TX_META => fo_mfb_meta_arr(ii),
164+
TX_SOF_POS => fo_mfb_sof_pos_arr(ii),
165+
TX_EOF_POS => fo_mfb_eof_pos_arr(ii),
166+
TX_SOF => fo_mfb_sof_arr(ii),
167+
TX_EOF => fo_mfb_eof_arr(ii),
168+
TX_SRC_RDY => fo_mfb_src_rdy_arr(ii),
169+
TX_DST_RDY => fo_mfb_dst_rdy_arr(ii)
170+
);
171+
end generate;
172+
173+
matrix_g : for ii in 0 to PORTS-1 generate
174+
matrix_g2 : for jj in 0 to PORTS-1 generate
175+
mx_mfb_data_arr(ii*PORTS+jj) <= fo_mfb_data_arr(jj*PORTS+ii);
176+
mx_mfb_meta_arr(ii*PORTS+jj) <= fo_mfb_meta_arr(jj*PORTS+ii);
177+
mx_mfb_sof_pos_arr(ii*PORTS+jj) <= fo_mfb_sof_pos_arr(jj*PORTS+ii);
178+
mx_mfb_eof_pos_arr(ii*PORTS+jj) <= fo_mfb_eof_pos_arr(jj*PORTS+ii);
179+
mx_mfb_sof_arr(ii*PORTS+jj) <= fo_mfb_sof_arr(jj*PORTS+ii);
180+
mx_mfb_eof_arr(ii*PORTS+jj) <= fo_mfb_eof_arr(jj*PORTS+ii);
181+
mx_mfb_src_rdy_arr(ii*PORTS+jj) <= fo_mfb_src_rdy_arr(jj*PORTS+ii);
182+
fo_mfb_dst_rdy_arr(jj*PORTS+ii) <= mx_mfb_dst_rdy_arr(ii*PORTS+jj);
183+
end generate;
184+
end generate;
185+
186+
output_g : for ii in 0 to PORTS-1 generate
187+
merge_i : entity work.MFB_MERGER_SIMPLE_GEN
188+
generic map (
189+
MERGER_INPUTS => PORTS,
190+
MFB_REGIONS => REGIONS,
191+
MFB_REGION_SIZE => REGION_SIZE,
192+
MFB_BLOCK_SIZE => BLOCK_SIZE,
193+
MFB_ITEM_WIDTH => ITEM_WIDTH,
194+
MFB_META_WIDTH => META_WIDTH,
195+
MASKING_EN => MASKING_EN,
196+
CNT_MAX => CNT_MAX
197+
)
198+
port map (
199+
CLK => CLK,
200+
RST => RESET,
201+
202+
RX_MFB_META => mx_mfb_meta_arr((ii+1)*PORTS-1 downto ii*PORTS),
203+
RX_MFB_DATA => mx_mfb_data_arr((ii+1)*PORTS-1 downto ii*PORTS),
204+
RX_MFB_SOF => mx_mfb_sof_arr((ii+1)*PORTS-1 downto ii*PORTS),
205+
RX_MFB_EOF => mx_mfb_eof_arr((ii+1)*PORTS-1 downto ii*PORTS),
206+
RX_MFB_SOF_POS => mx_mfb_sof_pos_arr((ii+1)*PORTS-1 downto ii*PORTS),
207+
RX_MFB_EOF_POS => mx_mfb_eof_pos_arr((ii+1)*PORTS-1 downto ii*PORTS),
208+
RX_MFB_SRC_RDY => mx_mfb_src_rdy_arr((ii+1)*PORTS-1 downto ii*PORTS),
209+
RX_MFB_DST_RDY => mx_mfb_dst_rdy_arr((ii+1)*PORTS-1 downto ii*PORTS),
210+
211+
TX_MFB_META => TX_MFB_META(ii),
212+
TX_MFB_DATA => TX_MFB_DATA(ii),
213+
TX_MFB_SOF => TX_MFB_SOF(ii),
214+
TX_MFB_EOF => TX_MFB_EOF(ii),
215+
TX_MFB_SOF_POS => TX_MFB_SOF_POS(ii),
216+
TX_MFB_EOF_POS => TX_MFB_EOF_POS(ii),
217+
TX_MFB_SRC_RDY => TX_MFB_SRC_RDY(ii),
218+
TX_MFB_DST_RDY => TX_MFB_DST_RDY(ii)
219+
);
220+
end generate;
221+
222+
else generate
223+
224+
TX_MFB_META <= RX_MFB_META;
225+
TX_MFB_DATA <= RX_MFB_DATA;
226+
TX_MFB_SOF <= RX_MFB_SOF;
227+
TX_MFB_EOF <= RX_MFB_EOF;
228+
TX_MFB_SOF_POS <= RX_MFB_SOF_POS;
229+
TX_MFB_EOF_POS <= RX_MFB_EOF_POS;
230+
TX_MFB_SRC_RDY <= RX_MFB_SRC_RDY;
231+
RX_MFB_DST_RDY <= TX_MFB_DST_RDY;
232+
233+
end generate;
234+
235+
end architecture;
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
# Makefile: Makefile to compile module
2+
# Copyright (C) 2025 CESNET z. s. p. o.
3+
# Author(s): Jakub Cabal <[email protected]>
4+
#
5+
# SPDX-License-Identifier: BSD-3-Clause
6+
7+
TOP_LEVEL_ENT=MFB_SWITCH_SIMPLE
8+
SYNTH=quartus
9+
10+
.PHONY: all
11+
all: comp
12+
13+
include ../../../../../build/Makefile

0 commit comments

Comments
 (0)