66
77module floo_output_arbiter import floo_pkg :: * ;
88# (
9+ // / Number of input ports
910 parameter int unsigned NumRoutes = 1 ,
11+ // / Type definitions
1012 parameter type flit_t = logic ,
1113 parameter type payload_t = logic ,
1214 parameter payload_t NarrowRspMask = '0 ,
@@ -15,86 +17,75 @@ module floo_output_arbiter import floo_pkg::*;
1517) (
1618 input logic clk_i,
1719 input logic rst_ni,
18- // / Ports towards the input routes
20+ // / Input ports
1921 input logic [NumRoutes- 1 : 0 ] valid_i,
2022 output logic [NumRoutes- 1 : 0 ] ready_o,
2123 input flit_t [NumRoutes- 1 : 0 ] data_i,
22- input id_t node_id_i ,
23- // / Ports towards the output route
24+ input id_t xy_id_i ,
25+ // / Output port
2426 output logic valid_o,
2527 input logic ready_i,
2628 output flit_t data_o
2729);
2830
29- flit_t[NumRoutes- 1 : 0 ] in_reducing_data, in_normal_data ;
30- logic [NumRoutes- 1 : 0 ] in_reducing_valid, in_reducing_ready ;
31- logic [NumRoutes- 1 : 0 ] in_normal_valid, in_normal_ready ;
31+ flit_t[NumRoutes- 1 : 0 ] reduce_data_in, unicast_data_in ;
32+ logic [NumRoutes- 1 : 0 ] reduce_valid_in, reduce_ready_in ;
33+ logic [NumRoutes- 1 : 0 ] unicast_valid_in, unicast_ready_in ;
3234
33- // 1 for every bit means that the corresponding flit is normal, 0 means that it needs to be reduced
34- logic [NumRoutes - 1 : 0 ] path_mask ;
35+ flit_t reduced_data_out, unicast_data_out;
36+ logic reduced_valid_out, unicast_valid_out ;
3537
36- flit_t out_reduced_data, out_normal_data;
37- logic out_reduced_valid, out_reduced_ready;
38- logic out_normal_valid, out_normal_ready;
38+ logic [NumRoutes- 1 : 0 ] reduce_mask;
3939
40- assign out_reduced_ready = ready_i;
41- assign out_normal_ready = ready_i;
40+ // Determine which input ports are to be reduced
41+ for (genvar i = 0 ; i < NumRoutes; i++ ) begin : gen_reduce_mask
42+ assign reduce_mask[i] = (data_i[i].hdr.commtype == CollectB);
43+ end
4244
43- floo_gen_path_mask # (
44- .NumRoutes ( NumRoutes ),
45- .flit_t ( flit_t )
46- ) i_gen_path_mask (
47- .clk_i,
48- .rst_ni,
49- .data_i ( data_i ),
50- .mask_o ( path_mask )
51- );
52-
53- // the normal arbitrater side
54- assign in_normal_valid = valid_i & path_mask;
55- assign in_normal_data = data_i ;
45+ // Arbitrate unicasts
46+ assign unicast_valid_in = valid_i & ~ reduce_mask;
47+ assign unicast_data_in = data_i;
5648
5749 floo_wormhole_arbiter # (
5850 .NumRoutes ( NumRoutes ),
59- .flit_t ( flit_t )
51+ .flit_t ( flit_t )
6052 ) i_wormhole_arbiter (
6153 .clk_i,
6254 .rst_ni,
63-
64- .valid_i ( in_normal_valid ),
65- .ready_o ( in_normal_ready ),
66- .data_i ( in_normal_data ),
67-
68- .valid_o ( out_normal_valid ),
69- .ready_i ( out_reduced_ready ),
70- .data_o ( out_normal_data )
55+ .valid_i ( unicast_valid_in ),
56+ .ready_o ( unicast_ready_in ),
57+ .data_i ( unicast_data_in ),
58+ .valid_o ( unicast_valid_out ),
59+ .ready_i ( ready_i ),
60+ .data_o ( unicast_data_out )
7161 );
7262
73- // the reduction side
74- assign in_reducing_valid = valid_i & ~ path_mask ;
75- assign in_reducing_data = data_i ;
63+ // Arbitrate reductions
64+ assign reduce_valid_in = valid_i & reduce_mask ;
65+ assign reduce_data_in = data_i;
7666
7767 floo_reduction_arbiter # (
78- .NumRoutes ( NumRoutes ),
79- .flit_t ( flit_t ),
80- .payload_t ( payload_t ),
81- .NarrowRspMask ( NarrowRspMask ),
82- .WideRspMask ( WideRspMask ),
83- .id_t ( id_t )
68+ .NumRoutes ( NumRoutes ),
69+ .flit_t ( flit_t ),
70+ .payload_t ( payload_t ),
71+ .id_t ( id_t ),
72+ .NarrowRspMask ( NarrowRspMask ),
73+ .WideRspMask ( WideRspMask )
8474 ) i_reduction_arbiter (
85- .valid_i ( in_reducing_valid ),
86- .ready_o ( in_reducing_ready ),
87- .data_i ( in_reducing_data ),
88- .node_id_i ( node_id_i ),
89-
90- .valid_o ( out_reduced_valid ),
91- .ready_i ( out_normal_ready ),
92- .data_o ( out_reduced_data )
75+ .valid_i ( reduce_valid_in ),
76+ .ready_o ( reduce_ready_in ),
77+ .data_i ( reduce_data_in ),
78+ .node_id_i ( xy_id_i ),
79+ .valid_o ( reduced_valid_out ),
80+ .ready_i ( ready_i ),
81+ .data_o ( reduced_data_out )
9382 );
9483
95- // choose which side to output, prefer the reduced side
96- assign valid_o = (out_reduced_valid & | in_reducing_valid) ? out_reduced_valid : out_normal_valid;
97- assign data_o = (out_reduced_valid & | in_reducing_valid) ? out_reduced_data : out_normal_data;
98- assign ready_o = (out_reduced_valid & | in_reducing_valid) ? in_reducing_ready : in_normal_ready;
84+ // Arbitrate between wormhole and reduction arbiter
85+ // TODO(fischeti): Discuss with Chen if the handshaking is correctly handled
86+ // I believe that the `ready_i` of the two arbiters should be masked.
87+ assign valid_o = (reduced_valid_out & | reduce_valid_in) ? reduced_valid_out : unicast_valid_out;
88+ assign data_o = (reduced_valid_out & | reduce_valid_in) ? reduced_data_out : unicast_data_out;
89+ assign ready_o = (reduced_valid_out & | reduce_valid_in) ? reduce_ready_in : unicast_ready_in;
9990
10091endmodule
0 commit comments