OpenCores
URL https://opencores.org/ocsvn/yifive/yifive/trunk

Subversion Repositories yifive

[/] [yifive/] [trunk/] [caravel_yifive/] [verilog/] [rtl/] [wb_interconnect/] [src/] [wb_interconnect.sv] - Blame information for rev 21

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 21 dinesha
//////////////////////////////////////////////////////////////////////
2
////                                                              ////
3
////  Wishbone Interconnect                                       ////
4
////                                                              ////
5
////  This file is part of the YIFive cores project               ////
6
////  http://www.opencores.org/cores/yifive/                      ////
7
////                                                              ////
8
////  Description                                                 ////
9
////    1. 3 masters and 3 slaves share bus Wishbone connection   ////
10
////    2. This block implement simple round robine request       ////
11
////                                                              ////
12
////  To Do:                                                      ////
13
////    nothing                                                   ////
14
////                                                              ////
15
////  Author(s):                                                  ////
16
////      - Dinesh Annayya, dinesha@opencores.org                 ////
17
////                                                              ////
18
////  Revision :                                                  ////
19
////    0.1 - 12th June 2021, Dinesh A                            ////
20
////                                                              ////
21
//////////////////////////////////////////////////////////////////////
22
////                                                              ////
23
//// Copyright (C) 2000 Authors and OPENCORES.ORG                 ////
24
////                                                              ////
25
//// This source file may be used and distributed without         ////
26
//// restriction provided that this copyright statement is not    ////
27
//// removed from the file and that any derivative work contains  ////
28
//// the original copyright notice and the associated disclaimer. ////
29
////                                                              ////
30
//// This source file is free software; you can redistribute it   ////
31
//// and/or modify it under the terms of the GNU Lesser General   ////
32
//// Public License as published by the Free Software Foundation; ////
33
//// either version 2.1 of the License, or (at your option) any   ////
34
//// later version.                                               ////
35
////                                                              ////
36
//// This source is distributed in the hope that it will be       ////
37
//// useful, but WITHOUT ANY WARRANTY; without even the implied   ////
38
//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR      ////
39
//// PURPOSE.  See the GNU Lesser General Public License for more ////
40
//// details.                                                     ////
41
////                                                              ////
42
//// You should have received a copy of the GNU Lesser General    ////
43
//// Public License along with this source; if not, download it   ////
44
//// from http://www.opencores.org/lgpl.shtml                     ////
45
////                                                              ////
46
//////////////////////////////////////////////////////////////////////
47
 
48
 
49
 
50
module wb_interconnect(
51
         input logic            clk_i,
52
         input logic            rst_n,
53
 
54
         // Master 0 Interface
55
         input   logic  [31:0]  m0_wbd_dat_i,
56
         input   logic  [31:0]  m0_wbd_adr_i,
57
         input   logic  [3:0]   m0_wbd_sel_i,
58
         input   logic          m0_wbd_we_i,
59
         input   logic          m0_wbd_cyc_i,
60
         input   logic          m0_wbd_stb_i,
61
         input   logic [3:0]    m0_wbd_tid_i, // target id
62
         output  logic  [31:0]  m0_wbd_dat_o,
63
         output  logic          m0_wbd_ack_o,
64
         output  logic          m0_wbd_err_o,
65
 
66
         // Master 1 Interface
67
         input  logic [31:0]    m1_wbd_dat_i,
68
         input  logic [31:0]    m1_wbd_adr_i,
69
         input  logic [3:0]     m1_wbd_sel_i,
70
         input  logic           m1_wbd_we_i,
71
         input  logic           m1_wbd_cyc_i,
72
         input  logic           m1_wbd_stb_i,
73
         input  logic [3:0]     m1_wbd_tid_i, // target id
74
         output logic [31:0]    m1_wbd_dat_o,
75
         output logic           m1_wbd_ack_o,
76
         output logic           m1_wbd_err_o,
77
 
78
         // Master 2 Interface
79
         input  logic [31:0]    m2_wbd_dat_i,
80
         input  logic [31:0]    m2_wbd_adr_i,
81
         input  logic [3:0]     m2_wbd_sel_i,
82
         input  logic           m2_wbd_we_i,
83
         input  logic           m2_wbd_cyc_i,
84
         input  logic           m2_wbd_stb_i,
85
         input  logic [3:0]     m2_wbd_tid_i, // target id
86
         output logic [31:0]    m2_wbd_dat_o,
87
         output logic           m2_wbd_ack_o,
88
         output logic           m2_wbd_err_o,
89
 
90
 
91
         // Slave 0 Interface
92
         input  logic [31:0]    s0_wbd_dat_i,
93
         input  logic           s0_wbd_ack_i,
94
         input  logic           s0_wbd_err_i,
95
         output logic [31:0]    s0_wbd_dat_o,
96
         output logic [31:0]    s0_wbd_adr_o,
97
         output logic [3:0]     s0_wbd_sel_o,
98
         output logic           s0_wbd_we_o,
99
         output logic           s0_wbd_cyc_o,
100
         output logic           s0_wbd_stb_o,
101
 
102
         // Slave 1 Interface
103
         input  logic [31:0]    s1_wbd_dat_i,
104
         input  logic           s1_wbd_ack_i,
105
         input  logic           s1_wbd_err_i,
106
         output logic [31:0]    s1_wbd_dat_o,
107
         output logic [31:0]    s1_wbd_adr_o,
108
         output logic [3:0]     s1_wbd_sel_o,
109
         output logic           s1_wbd_we_o,
110
         output logic           s1_wbd_cyc_o,
111
         output logic           s1_wbd_stb_o,
112
 
113
         // Slave 2 Interface
114
         input  logic [31:0]    s2_wbd_dat_i,
115
         input  logic           s2_wbd_ack_i,
116
         input  logic           s2_wbd_err_i,
117
         output logic [31:0]    s2_wbd_dat_o,
118
         output logic [31:0]    s2_wbd_adr_o,
119
         output logic [3:0]     s2_wbd_sel_o,
120
         output logic           s2_wbd_we_o,
121
         output logic           s2_wbd_cyc_o,
122
         output logic           s2_wbd_stb_o
123
        );
124
 
125
////////////////////////////////////////////////////////////////////
126
//
127
// Type define
128
//
129
 
130
 
131
// WishBone Wr Interface
132
typedef struct packed {
133
  logic [31:0]  wbd_dat;
134
  logic  [31:0] wbd_adr;
135
  logic  [3:0]  wbd_sel;
136
  logic         wbd_we;
137
  logic         wbd_cyc;
138
  logic         wbd_stb;
139
  logic [3:0]   wbd_tid; // target id
140
} type_wb_wr_intf;
141
 
142
// WishBone Rd Interface
143
typedef struct packed {
144
  logic [31:0]  wbd_dat;
145
  logic         wbd_ack;
146
  logic         wbd_err;
147
} type_wb_rd_intf;
148
 
149
 
150
// Master Write Interface
151
type_wb_wr_intf  m0_wb_wr;
152
type_wb_wr_intf  m1_wb_wr;
153
type_wb_wr_intf  m2_wb_wr;
154
 
155
// Master Read Interface
156
type_wb_rd_intf  m0_wb_rd;
157
type_wb_rd_intf  m1_wb_rd;
158
type_wb_rd_intf  m2_wb_rd;
159
 
160
// Slave Write Interface
161
type_wb_wr_intf  s0_wb_wr;
162
type_wb_wr_intf  s1_wb_wr;
163
type_wb_wr_intf  s2_wb_wr;
164
 
165
// Slave Read Interface
166
type_wb_rd_intf  s0_wb_rd;
167
type_wb_rd_intf  s1_wb_rd;
168
type_wb_rd_intf  s2_wb_rd;
169
 
170
 
171
type_wb_wr_intf  i_bus_m;  // Multiplexed Master I/F
172
type_wb_rd_intf  i_bus_s;  // Multiplexed Slave I/F
173
 
174
 
175
//----------------------------------------
176
// Master Mapping
177
// -------------------------------------
178
assign m0_wb_wr.wbd_dat = m0_wbd_dat_i;
179
assign m0_wb_wr.wbd_adr = m0_wbd_adr_i;
180
assign m0_wb_wr.wbd_sel = m0_wbd_sel_i;
181
assign m0_wb_wr.wbd_we  = m0_wbd_we_i;
182
assign m0_wb_wr.wbd_cyc = m0_wbd_cyc_i;
183
assign m0_wb_wr.wbd_stb = m0_wbd_stb_i;
184
assign m0_wb_wr.wbd_tid = m0_wbd_tid_i;
185
 
186
assign m1_wb_wr.wbd_dat = m1_wbd_dat_i;
187
assign m1_wb_wr.wbd_adr = m1_wbd_adr_i;
188
assign m1_wb_wr.wbd_sel = m1_wbd_sel_i;
189
assign m1_wb_wr.wbd_we  = m1_wbd_we_i;
190
assign m1_wb_wr.wbd_cyc = m1_wbd_cyc_i;
191
assign m1_wb_wr.wbd_stb = m1_wbd_stb_i;
192
assign m1_wb_wr.wbd_tid = m1_wbd_tid_i;
193
 
194
assign m2_wb_wr.wbd_dat = m2_wbd_dat_i;
195
assign m2_wb_wr.wbd_adr = m2_wbd_adr_i;
196
assign m2_wb_wr.wbd_sel = m2_wbd_sel_i;
197
assign m2_wb_wr.wbd_we  = m2_wbd_we_i;
198
assign m2_wb_wr.wbd_cyc = m2_wbd_cyc_i;
199
assign m2_wb_wr.wbd_stb = m2_wbd_stb_i;
200
assign m2_wb_wr.wbd_tid = m2_wbd_tid_i;
201
 
202
assign m0_wbd_dat_o  =  m0_wb_rd.wbd_dat;
203
assign m0_wbd_ack_o  =  m0_wb_rd.wbd_ack;
204
assign m0_wbd_err_o  =  m0_wb_rd.wbd_err;
205
 
206
assign m1_wbd_dat_o  =  m1_wb_rd.wbd_dat;
207
assign m1_wbd_ack_o  =  m1_wb_rd.wbd_ack;
208
assign m1_wbd_err_o  =  m1_wb_rd.wbd_err;
209
 
210
assign m2_wbd_dat_o  =  m2_wb_rd.wbd_dat;
211
assign m2_wbd_ack_o  =  m2_wb_rd.wbd_ack;
212
assign m2_wbd_err_o  =  m2_wb_rd.wbd_err;
213
 
214
assign s0_wb_rd.wbd_dat  = s0_wbd_dat_i ;
215
assign s0_wb_rd.wbd_ack  = s0_wbd_ack_i ;
216
assign s0_wb_rd.wbd_err  = s0_wbd_err_i ;
217
 
218
assign s1_wb_rd.wbd_dat  = s1_wbd_dat_i ;
219
assign s1_wb_rd.wbd_ack  = s1_wbd_ack_i ;
220
assign s1_wb_rd.wbd_err  = s1_wbd_err_i ;
221
 
222
assign s2_wb_rd.wbd_dat  = s2_wbd_dat_i ;
223
assign s2_wb_rd.wbd_ack  = s2_wbd_ack_i ;
224
assign s2_wb_rd.wbd_err  = s2_wbd_err_i ;
225
 
226
 
227
//----------------------------------------
228
// Slave Mapping
229
// -------------------------------------
230
 
231
assign  s0_wbd_dat_o =  s0_wb_wr.wbd_dat ;
232
assign  s0_wbd_adr_o =  s0_wb_wr.wbd_adr ;
233
assign  s0_wbd_sel_o =  s0_wb_wr.wbd_sel ;
234
assign  s0_wbd_we_o  =  s0_wb_wr.wbd_we  ;
235
assign  s0_wbd_cyc_o =  s0_wb_wr.wbd_cyc ;
236
assign  s0_wbd_stb_o =  s0_wb_wr.wbd_stb ;
237
 
238
assign  s1_wbd_dat_o =  s1_wb_wr.wbd_dat ;
239
assign  s1_wbd_adr_o =  s1_wb_wr.wbd_adr ;
240
assign  s1_wbd_sel_o =  s1_wb_wr.wbd_sel ;
241
assign  s1_wbd_we_o  =  s1_wb_wr.wbd_we  ;
242
assign  s1_wbd_cyc_o =  s1_wb_wr.wbd_cyc ;
243
assign  s1_wbd_stb_o =  s1_wb_wr.wbd_stb ;
244
 
245
assign  s2_wbd_dat_o =  s2_wb_wr.wbd_dat ;
246
assign  s2_wbd_adr_o =  s2_wb_wr.wbd_adr ;
247
assign  s2_wbd_sel_o =  s2_wb_wr.wbd_sel ;
248
assign  s2_wbd_we_o  =  s2_wb_wr.wbd_we  ;
249
assign  s2_wbd_cyc_o =  s2_wb_wr.wbd_cyc ;
250
assign  s2_wbd_stb_o =  s2_wb_wr.wbd_stb ;
251
 
252
//
253
// arbitor
254
//
255
logic [1:0]  gnt;
256
 
257
wb_arb  u_wb_arb(
258
        .clk(clk_i),
259
        .rstn(rst_n),
260
        .req({  m2_wbd_cyc_i,
261
                m1_wbd_cyc_i,
262
                m0_wbd_cyc_i}),
263
        .gnt(gnt)
264
);
265
 
266
 
267
// Generate Multiplexed Master Interface based on grant
268
always_comb begin
269
     case(gnt)
270
        3'h0:      i_bus_m = m0_wb_wr;
271
        3'h1:      i_bus_m = m1_wb_wr;
272
        3'h2:      i_bus_m = m2_wb_wr;
273
        default:   i_bus_m = m0_wb_wr;
274
     endcase
275
end
276
 
277
 
278
// Generate Multiplexed Slave Interface based on target Id
279
wire [3:0] wbd_tid =  i_bus_m.wbd_tid; // to fix iverilog warning
280
always_comb begin
281
     case(wbd_tid)
282
        3'h0:      i_bus_s = s0_wb_rd;
283
        3'h1:      i_bus_s = s1_wb_rd;
284
        3'h2:      i_bus_s = s2_wb_rd;
285
        default:   i_bus_s = s0_wb_rd;
286
     endcase
287
end
288
 
289
 
290
// Connect Master => Slave
291
assign  s0_wb_wr = (i_bus_m.wbd_tid == 2'b00) ? i_bus_m : 'h0;
292
assign  s1_wb_wr = (i_bus_m.wbd_tid == 2'b01) ? i_bus_m : 'h0;
293
assign  s2_wb_wr = (i_bus_m.wbd_tid == 2'b10) ? i_bus_m : 'h0;
294
 
295
// Connect Slave to Master
296
assign  m0_wb_rd = (gnt == 2'b00) ? i_bus_s : 'h0;
297
assign  m1_wb_rd = (gnt == 2'b01) ? i_bus_s : 'h0;
298
assign  m2_wb_rd = (gnt == 2'b10) ? i_bus_s : 'h0;
299
 
300
 
301
 
302
endmodule
303
 

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.