paicore_behavioral/noc/noc.vhdl
2025-07-18 05:09:06 -05:00

109 lines
No EOL
5.2 KiB
VHDL

library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
use work.router_types.all;
use work.quadtree_components.all;
use work.noc_conf.all;
entity noc is
generic (
num_paths_ext : positive := 32;
buffer_width : positive := 64;
buffer_depth : positive := 4;
fifo_ptr_size : positive := 3;
level : positive := 5;
top_level : positive := 5;
chip_x : std_logic_vector(4 downto 0) := "00000";
chip_y : std_logic_vector(4 downto 0) := "00000"
);
port (
clks : in std_logic_vector(
calculate_num_routers(top_level)-1 downto 0);
arstN : in std_logic;
data_chip_in : in t_DATA_EXT(4*num_paths_ext-1 downto 0);
c_rcv_reqs : in std_logic_vector(4*num_paths_ext-1 downto 0);
c_send_ack : in std_logic_vector(4*num_paths_ext-1 downto 0);
pe_data_in : in t_DATA(4**level-1 downto 0);
pe_rcv_reqs : in std_logic_vector(4**level-1 downto 0);
pe_send_ack : in std_logic_vector(4**level-1 downto 0);
data_chip_out : out t_DATA_EXT(4*num_paths_ext-1 downto 0);
c_rcv_ack : out std_logic_vector(4*num_paths_ext-1 downto 0);
c_send_reqs : out std_logic_vector(4*num_paths_ext-1 downto 0);
pe_data_out : out t_DATA(4**level-1 downto 0);
pe_rcv_acks : out std_logic_vector(4**level-1 downto 0);
pe_send_reqs : out std_logic_vector(4**level-1 downto 0)
);
end noc;
architecture impl of noc is
constant l5_core_x : std_logic_vector(4 downto 0) := "00000";
constant l5_core_y : std_logic_vector(4 downto 0) := "00000";
constant num_paths_up : positive := 32;
constant num_paths_down : positive := 16;
constant npu_bit_size : positive := 6;
constant npd_bit_size : positive := 5;
constant num_routers : integer := calculate_num_routers(top_level);
signal r_data_ds_in : t_DATA(4*num_paths_down-1 downto 0);
signal r_data_ds_out : t_DATA(4*num_paths_down-1 downto 0);
signal r_rcv_reqs : std_logic_vector(4*num_paths_up+4*num_paths_down-1 downto 0);
signal r_rcv_reqs_ds : std_logic_vector(4*num_paths_down-1 downto 0);
signal r_snd_ack : std_logic_vector(4*num_paths_up+4*num_paths_down-1 downto 0);
signal r_snd_ack_ds : std_logic_vector(4*num_paths_down-1 downto 0);
signal r_snd_reqs : std_logic_vector(4*num_paths_up+4*num_paths_down-1 downto 0);
signal r_snd_reqs_ds : std_logic_vector(4*num_paths_down-1 downto 0);
signal r_rcv_ack : std_logic_vector(4*num_paths_up+4*num_paths_down-1 downto 0);
signal r_rcv_ack_ds : std_logic_vector(4*num_paths_down-1 downto 0);
signal s_data_chip_out : t_DATA_EXT(4*num_paths_ext-1 downto 0);
signal s_c_rcv_ack : std_logic_vector(4*num_paths_ext-1 downto 0);
signal s_c_send_reqs : std_logic_vector(4*num_paths_ext-1 downto 0);
begin
r_rcv_reqs <= c_rcv_reqs & r_rcv_reqs_ds;
r_snd_ack <= c_send_ack & r_snd_ack_ds;
s_c_send_reqs <= r_snd_reqs(4*num_paths_up+4*num_paths_down-1 downto 4*num_paths_down);
r_snd_reqs_ds <= r_snd_reqs(4*num_paths_down-1 downto 0);
s_c_rcv_ack <= r_rcv_ack(4*num_paths_up+4*num_paths_down-1 downto 4*num_paths_down);
r_rcv_ack_ds <= r_rcv_ack(4*num_paths_down-1 downto 0);
c_send_reqs <= s_c_send_reqs;
c_rcv_ack <= s_c_rcv_ack;
data_chip_out <= s_data_chip_out;
router_l5: parent_router
generic map(num_paths_up => num_paths_up, num_paths_down => num_paths_down,
npu_bit_size => npu_bit_size, npd_bit_size => npd_bit_size,
level => level, buffer_width => buffer_width, buffer_depth => buffer_depth,
fifo_ptr_size => fifo_ptr_size, chip_x => chip_x, chip_y => chip_y)
port map(clk => clks(num_routers-1), arstN => arstN, core_x => l5_core_x, core_y => l5_core_y,
data_in_ds => r_data_ds_in, data_in_us => data_chip_in,
rcv_reqs => r_rcv_reqs, send_ack => r_snd_ack, rcv_acks => r_rcv_ack,
send_reqs => r_snd_reqs, data_out_ds => r_data_ds_out,
data_out_us => s_data_chip_out);
quadtree_inst: quadtree
generic map(num_paths_up => num_paths_up, num_paths_down => num_paths_down,
npu_bit_size => npu_bit_size, npd_bit_size => npd_bit_size,
level => level, top_level => top_level,
buffer_width => buffer_width, buffer_depth => buffer_depth,
fifo_ptr_size => fifo_ptr_size, chip_x => chip_x, chip_y => chip_y)
port map(clks => clks(num_routers-2 downto 0),
arstN => arstN, core_x => l5_core_x,
core_y => l5_core_y, data_in_us => r_data_ds_out,
rcv_reqs_us => r_snd_reqs_ds, send_ack_us => r_rcv_ack_ds,
pe_data_in => pe_data_in, pe_rcv_reqs => pe_rcv_reqs,
pe_send_ack => pe_send_ack, data_out_us => r_data_ds_in,
rcv_acks_us => r_snd_ack_ds, send_reqs_us => r_rcv_reqs_ds,
pe_rcv_acks => pe_rcv_acks, pe_send_reqs => pe_send_reqs,
pe_data_out => pe_data_out);
end impl;