shalan | fd13eb5 | 2020-08-21 16:48:07 +0200 | [diff] [blame^] | 1 | |
| 2 | `include "distributor.v" |
| 3 | `include "arbiter.v" |
| 4 | |
| 5 | module 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 | |
| 172 | endmodule |