1 | ---------------------------------------------------------------------------------- |
---|
2 | -- Company: |
---|
3 | -- Engineer: |
---|
4 | -- |
---|
5 | -- Create Date: 20:05:07 11/19/2011 |
---|
6 | -- Design Name: |
---|
7 | -- Module Name: MPI_NOC - Behavioral |
---|
8 | -- Project Name: |
---|
9 | -- Target Devices: |
---|
10 | -- Tool versions: |
---|
11 | -- Description: |
---|
12 | -- |
---|
13 | -- Dependencies: |
---|
14 | -- |
---|
15 | -- Revision: |
---|
16 | -- Revision 0.01 - File Created |
---|
17 | -- Additional Comments: |
---|
18 | -- |
---|
19 | ---------------------------------------------------------------------------------- |
---|
20 | library IEEE; |
---|
21 | use IEEE.STD_LOGIC_1164.ALL; |
---|
22 | library NocLib ; |
---|
23 | |
---|
24 | use NocLib.CoreTypes.all; |
---|
25 | -- Uncomment the following library declaration if using |
---|
26 | -- arithmetic functions with Signed or Unsigned values |
---|
27 | --use IEEE.NUMERIC_STD.ALL; |
---|
28 | |
---|
29 | -- Uncomment the following library declaration if instantiating |
---|
30 | -- any Xilinx primitives in this code. |
---|
31 | --library UNISIM; |
---|
32 | --use UNISIM.VComponents.all; |
---|
33 | |
---|
34 | entity MPI_NOC is |
---|
35 | generic (NPROC : positive:=2); |
---|
36 | port( |
---|
37 | |
---|
38 | MPI_Node_in : in Ar_MPIPort_in(1 to NPROC); |
---|
39 | MPI_Node_Out : out Ar_MPIPort_out(1 to NPROC) |
---|
40 | ); |
---|
41 | end MPI_NOC; |
---|
42 | |
---|
43 | architecture structural of MPI_NOC is |
---|
44 | -- Declare signals for interconnections |
---|
45 | |
---|
46 | --constant NPROC : positive :=8 ; |
---|
47 | --Inputs |
---|
48 | signal noc_portOut :typ_portio(1 to NPROC); |
---|
49 | signal noc_portIn :typ_portio(1 to NPROC); |
---|
50 | |
---|
51 | signal noc_fifo_in_full : std_logic_vector(NPROC downto 1):= (others => '0'); |
---|
52 | signal noc_data_available : std_logic_vector(NPROC downto 1):= (others => '0'); |
---|
53 | signal noc_fifo_in_empty : std_logic_vector(NPROC downto 1):= (others => '0'); |
---|
54 | signal noc_data_in_en : std_logic_vector(NPROC downto 1) := (others => '0'); |
---|
55 | signal noc_cmd_in_en : std_logic_vector(NPROC downto 1) := (others => '0'); |
---|
56 | signal noc_data_out_en : std_logic_vector(NPROC downto 1) := (others => '0'); |
---|
57 | -- signal noc_clk : std_logic := '0'; |
---|
58 | --signal noc_reset : std_logic := '0'; |
---|
59 | |
---|
60 | -- Declare components |
---|
61 | COMPONENT SWITCH_GEN |
---|
62 | GENERIC (number_of_ports : positive := NPROC); |
---|
63 | PORT( |
---|
64 | Port_in : IN typ_PortIO(1 to number_of_ports); |
---|
65 | Port_out : OUT typ_PortIO(1 to number_of_ports); |
---|
66 | data_in_en : IN std_logic_vector(NPROC downto 1); |
---|
67 | cmd_in_en : IN std_logic_vector(NPROC downto 1); |
---|
68 | data_out_en : IN std_logic_vector(NPROC downto 1); |
---|
69 | fifo_in_full : OUT std_logic_vector(NPROC downto 1); |
---|
70 | fifo_in_empty : OUT std_logic_vector(NPROC downto 1); |
---|
71 | data_available : OUT std_logic_vector(NPROC downto 1); |
---|
72 | clk : IN std_logic; |
---|
73 | reset : IN std_logic |
---|
74 | ); |
---|
75 | END COMPONENT; |
---|
76 | COMPONENT CORE_MPI is |
---|
77 | Port ( instruction : in STD_LOGIC_VECTOR (Word-1 downto 0); |
---|
78 | instruction_en : in STD_LOGIC; |
---|
79 | |
---|
80 | barrier_completed : out STD_LOGIC; |
---|
81 | packet_received : out STD_LOGIC; |
---|
82 | packet_ack : in std_logic; |
---|
83 | PushOut : out STD_LOGIC_VECTOR (Word-1 downto 0); |
---|
84 | ram_we : out STD_LOGIC; |
---|
85 | hold_req : out STD_Logic; --requete vers application |
---|
86 | hold_ack : in STD_Logic; --autorisation par l'application |
---|
87 | ram_address_rd : out STD_LOGIC_VECTOR (ADRLEN-1 downto 0); |
---|
88 | ram_address_wr : out STD_LOGIC_VECTOR (ADRLEN-1 downto 0); |
---|
89 | ram_data_out : in STD_LOGIC_VECTOR (Word-1 downto 0); |
---|
90 | ram_data_in : out STD_LOGIC_VECTOR (Word-1 downto 0); |
---|
91 | switch_port_in_wr_en : out STD_LOGIC; -- OK (au switch) pour lire les données |
---|
92 | switch_port_in_empty : in STD_LOGIC; |
---|
93 | switch_port_in_cmd_en : out STD_LOGIC; |
---|
94 | switch_port_in_full : in STD_LOGIC; -- port d'entréendu switch saturé |
---|
95 | switch_port_in_data : out STD_LOGIC_VECTOR (Word-1 downto 0); -- port de donées d'entrée |
---|
96 | switch_port_out_rd_en : out STD_LOGIC; -- OK (au switch) pour écrire les données |
---|
97 | switch_port_out_data_vailaible : in STD_LOGIC; -- Donnée disponible à la sortie (du switch) |
---|
98 | clk : in STD_LOGIC; |
---|
99 | clkout : out std_logic; |
---|
100 | reset : in STD_LOGIC; |
---|
101 | ram_en : out STD_LOGIC; |
---|
102 | instruction_fifo_full : out STD_LOGIC; |
---|
103 | switch_port_out_data : in STD_LOGIC_VECTOR (Word-1 downto 0)); |
---|
104 | end COMPONENT; |
---|
105 | -- cette fonction met en place l'architecture d'exécution de l'environnement |
---|
106 | -- elle permet de construire le Noc et de connecter les différents core MPI |
---|
107 | -- chaque core reçoit un ID qui sera son Rank lors de l'appel à MPI_GET_Rank |
---|
108 | -- faut il créer une petite mémoire chargée de stocker les IDs ? |
---|
109 | -- Oui car cette mémoire sera consultée par la fonction MPI_Init pour associer |
---|
110 | -- un communicateur au MPI Core |
---|
111 | |
---|
112 | |
---|
113 | |
---|
114 | begin |
---|
115 | Socsyst: if nproc > 1 generate --nproc |
---|
116 | -- instancier le switch et connecter les différents ports |
---|
117 | |
---|
118 | switch_gen1: SWITCH_GEN generic map (NPROC) |
---|
119 | PORT MAP ( |
---|
120 | Port_in => Noc_PortIn, |
---|
121 | |
---|
122 | Port_out => noc_Portout, |
---|
123 | |
---|
124 | --signaux de contrôle de la lecture des ports |
---|
125 | data_in_en => noc_data_in_en, |
---|
126 | cmd_in_en => noc_cmd_in_en, |
---|
127 | data_out_en => noc_data_out_en, |
---|
128 | fifo_in_full => noc_fifo_in_full, |
---|
129 | fifo_in_empty => noc_fifo_in_empty, |
---|
130 | data_available => noc_data_available, |
---|
131 | clk => MPI_Node_in(1).clk, |
---|
132 | reset => MPI_Node_in(1).reset |
---|
133 | ); |
---|
134 | end generate; |
---|
135 | connect_core: for i in 1 to nproc generate -- nproc |
---|
136 | hardmpi:core_mpi port map ( |
---|
137 | |
---|
138 | |
---|
139 | PushOut=>MPI_Node_out(i).PushOut, |
---|
140 | ram_we=> MPI_Node_out(i).ram_we, |
---|
141 | ram_en=>MPI_Node_out(i).ram_en , |
---|
142 | hold_req=>MPI_NODE_out(i).hold_req, |
---|
143 | packet_received=>MPI_Node_out(i).packet_received , |
---|
144 | packet_ack=>MPI_Node_in(i).packet_ack, |
---|
145 | hold_ack=>MPI_NODE_in(i).hold_ack, |
---|
146 | ram_address_rd => MPI_Node_out(i).ram_address_rd , |
---|
147 | ram_address_wr => MPI_Node_out(i).ram_address_wr , |
---|
148 | ram_data_in=>MPI_Node_out(i).ram_data_in , |
---|
149 | ram_data_out=>MPI_Node_in(i).ram_data_out, |
---|
150 | barrier_completed =>MPI_Node_out(i).barrier_completed, |
---|
151 | instruction => MPI_Node_in(i).instruction, |
---|
152 | instruction_en => MPI_Node_in(i).instruction_en, |
---|
153 | instruction_fifo_full =>MPI_Node_Out(i).instruction_fifo_full, |
---|
154 | switch_port_in_wr_en => noc_data_in_en(i), |
---|
155 | switch_port_in_cmd_en=>noc_cmd_in_en(i), |
---|
156 | switch_port_in_full => noc_fifo_in_full(i), |
---|
157 | switch_port_in_empty => noc_fifo_in_empty(i), |
---|
158 | switch_port_in_data => noc_PortIn(i), |
---|
159 | switch_port_out_rd_en => noc_data_out_en(i), |
---|
160 | switch_port_out_data_vailaible => noc_data_available(i), |
---|
161 | switch_port_out_data => noc_PortOut(i), |
---|
162 | clk =>MPI_Node_in(1).clk, |
---|
163 | reset =>MPI_Node_in(1).reset |
---|
164 | |
---|
165 | ); |
---|
166 | end generate; |
---|
167 | |
---|
168 | |
---|
169 | |
---|
170 | |
---|
171 | end Structural; |
---|
172 | |
---|