blob: ee07d5ed3adf56fefb39bebcd76aeac5381ae4f1 [file] [log] [blame]
shalanfd13eb52020-08-21 16:48:07 +02001
2`include "distributor.v"
3`include "arbiter.v"
4
5module wb_xbar #(
6 parameter NM = 2,
7 parameter NS = 4,
8 parameter AW = 32,
9 parameter DW = 32
10) (
11
12 input wb_clk_i,
13 input wb_rst_i,
14
15 // Masters interface
16 input [NM-1:0] wbm_cyc_i,
17 input [NM-1:0] wbm_stb_i,
18 input [NM-1:0] wbm_we_i,
19 input [(NM*(DW/8))-1:0] wbm_sel_i,
20 input [(NM*AW)-1:0] wbm_adr_i,
21 input [(NM*DW)-1:0] wbm_dat_i,
22 output [NM-1:0] wbm_ack_o,
23 output [NM-1:0] wbm_err_o,
24 output [(NM*DW)-1:0] wbm_dat_o,
25
26 // Slaves interfaces
27 input [NS-1:0] wbs_ack_i,
28 input [(NS*DW)-1:0] wbs_dat_i,
29 output [NS-1:0] wbs_cyc_o,
30 output [NS-1:0] wbs_stb_o,
31 output [NS-1:0] wbs_we_o,
32 output [(NS*(DW/8))-1:0] wbs_sel_o,
33 output [(NS*AW)-1:0] wbs_adr_o,
34 output [(NS*DW)-1:0] wbs_dat_o
35);
36 parameter ADR_MASK = {
37 {8'hFF, {24{1'b0}}},
38 {8'hFF, {24{1'b0}}},
39 {8'hFF, {24{1'b0}}},
40 {8'hFF, {24{1'b0}}}
41 };
42
43 parameter SLAVE_ADR = {
44 {8'hB0, {24{1'b0}}},
45 {8'hA0, {24{1'b0}}},
46 {8'h90, {24{1'b0}}},
47 {8'h80, {24{1'b0}}}
48 };
49
50 localparam SEL = DW / 8;
51
52 wire [(NM*NS)-1:0] distributor_cyc_o;
53 wire [(NM*NS)-1:0] distributor_stb_o;
54 wire [(NM*NS)-1:0] distributor_we_o;
55 wire [(NM*NS*SEL)-1:0] distributor_sel_o;
56 wire [(NM*NS*AW)-1:0] distributor_adr_o;
57 wire [(NM*NS*DW)-1:0] distributor_dat_o;
58 wire [(NM*NS)-1:0] distributor_ack_i;
59 wire [(NM*NS)-1:0] distributor_err_i;
60 wire [(NM*NS)-1:0] distributor_rty_i;
61 wire [(NM*NS*DW)-1:0] distributor_dat_i;
62
63 //Arbiter busses:
64 wire [(NM*NS)-1:0] arbiter_cyc_i;
65 wire [(NM*NS)-1:0] arbiter_stb_i;
66 wire [(NM*NS)-1:0] arbiter_we_i;
67 wire [(NM*NS*SEL)-1:0] arbiter_sel_i;
68 wire [(NM*NS*AW)-1:0] arbiter_adr_i;
69 wire [(NM*NS*DW)-1:0] arbiter_dat_i;
70 wire [(NM*NS)-1:0] arbiter_ack_o;
71 wire [(NM*NS)-1:0] arbiter_err_o;
72 wire [(NM*NS*DW)-1:0] arbiter_dat_o;
73
74 //Instantiate distributors
75 generate
76 genvar i;
77 for (i=0; i<NM; i=i+1)
78 begin
79 distributor #(
80 .NS(NS),
81 .AW(AW),
82 .DW(DW),
83 .SLAVE_ADR(SLAVE_ADR),
84 .ADR_MASK(ADR_MASK)
85 ) distributor (
86 .wb_clk_i(wb_clk_i),
87 .wb_rst_i(wb_rst_i),
88
89 .wbm_cyc_i(wbm_cyc_i[i]),
90 .wbm_stb_i(wbm_stb_i[i]),
91 .wbm_we_i(wbm_we_i[i]),
92 .wbm_sel_i(wbm_sel_i[(SEL*(i+1))-1:(SEL*i)]),
93 .wbm_adr_i(wbm_adr_i[(AW*(i+1))-1:(AW*i)]),
94 .wbm_dat_i(wbm_dat_i[(DW*(i+1))-1:(DW*i)]),
95 .wbm_ack_o(wbm_ack_o[i]),
96 .wbm_dat_o(wbm_dat_o[(DW*(i+1))-1:(DW*i)]),
97
98 // Slave interfaces
99 .wbs_cyc_o (distributor_cyc_o[(NS*(i+1))-1:NS*i]),
100 .wbs_stb_o (distributor_stb_o[(NS*(i+1))-1:NS*i]),
101 .wbs_we_o (distributor_we_o [(NS*(i+1))-1:NS*i]),
102 .wbs_sel_o (distributor_sel_o[(NS*SEL*(i+1))-1:NS*SEL*i]),
103 .wbs_adr_o (distributor_adr_o[(NS*AW*(i+1))-1:NS*AW*i]),
104 .wbs_dat_o (distributor_dat_o[(NS*DW*(i+1))-1:NS*DW*i]),
105 .wbs_ack_i (distributor_ack_i[(NS*(i+1))-1:NS*i]),
106 .wbs_dat_i (distributor_dat_i[(NS*DW*(i+1))-1:NS*DW*i])
107 );
108 end
109 endgenerate
110
111 //Instantiate arbiters
112 generate
113 genvar j;
114 for (j=0; j<NS; j=j+1)
115 begin
116 wb_arbiter #(
117 .NM(NM),
118 .AW(AW),
119 .DW(DW)
120 ) arbiter (
121 .wb_clk_i(wb_clk_i),
122 .wb_rst_i(wb_rst_i),
123 // Masters Interface
124 .wbm_cyc_i (arbiter_cyc_i[(NM*(j+1))-1:NM*j]),
125 .wbm_stb_i (arbiter_stb_i[(NM*(j+1))-1:NM*j]),
126 .wbm_we_i (arbiter_we_i [(NM*(j+1))-1:NM*j]),
127 .wbm_sel_i (arbiter_sel_i[(NM*SEL*(j+1))-1:NM*SEL*j]),
128 .wbm_adr_i (arbiter_adr_i[(NM*AW*(j+1))-1:NM*AW*j]),
129 .wbm_dat_i (arbiter_dat_i[(NM*DW*(j+1))-1:NM*DW*j]),
130 .wbm_ack_o (arbiter_ack_o[(NM*(j+1))-1:NM*j]),
131 .wbm_dat_o (arbiter_dat_o[(NM*DW*(j+1))-1:NM*DW*j]),
132
133 // Slave interfaces
134 .wbs_cyc_o (wbs_cyc_o[j]),
135 .wbs_stb_o (wbs_stb_o[j]),
136 .wbs_we_o (wbs_we_o[j]),
137 .wbs_sel_o (wbs_sel_o[(SEL*(j+1))-1:(SEL*j)]),
138 .wbs_adr_o (wbs_adr_o[(AW*(j+1))-1:(AW*j)]),
139 .wbs_dat_o (wbs_dat_o[(DW*(j+1))-1:(DW*j)]),
140 .wbs_ack_i (wbs_ack_i[j]),
141 .wbs_dat_i (wbs_dat_i[(DW*(j+1))-1:(DW*j)])
142 );
143 end
144 endgenerate
145
146 //Crossbar connections
147 generate
148 genvar k, l, m, indx;
149 for (k=0; k<NM; k=k+1)
150 for (l=0; l<NS; l=l+1)
151 begin
152 assign arbiter_cyc_i[(NM*l)+k] = distributor_cyc_o[(NS*k)+l];
153 assign arbiter_stb_i[(NM*l)+k] = distributor_stb_o[(NS*k)+l];
154 assign arbiter_we_i [(NM*l)+k] = distributor_we_o [(NS*k)+l];
155
156 assign arbiter_sel_i[(((NM*l)+k)*SEL)+(SEL-1):((NM*l)+k)*SEL] =
157 distributor_sel_o[(((NS*k)+l)*SEL)+(SEL-1):((NS*k)+l)*SEL];
158
159 assign arbiter_adr_i[(((NM*l)+k)*AW)+(AW-1) : ((NM*l)+k)*AW] =
160 distributor_adr_o[(((NS*k)+l)*AW)+(AW-1) : ((NS*k)+l)*AW];
161
162 assign arbiter_dat_i[(((NM*l)+k)*AW)+(AW-1) : ((NM*l)+k)*AW] =
163 distributor_dat_o[(((NS*k)+l)*AW)+(AW-1) : ((NS*k)+l)*AW];
164
165 assign distributor_dat_i[(((NS*k)+l)*DW)+(DW-1) : ((NS*k)+l)*DW] =
166 arbiter_dat_o[(((NM*l)+k)*DW)+(DW-1) : ((NM*l)+k)*DW];
167
168 assign distributor_ack_i[(NS*k)+l] = arbiter_ack_o[(NM*l)+k];
169 end
170 endgenerate
171
172endmodule