@@ -147,3 +147,47 @@ def __init__(self, slaves=2, master=None):
147
147
if direction == DIR_S_TO_M :
148
148
cases [n ].append (getattr (master , name ).eq (getattr (slave , name )))
149
149
self .comb += Case (selected , cases )
150
+
151
+
152
+ class CRIArbiter (Module ):
153
+ def __init__ (self , masters = 2 , slave = None ):
154
+ if isinstance (masters , int ):
155
+ masters = [Interface () for _ in range (masters )]
156
+ if slave is None :
157
+ slave = Interface ()
158
+ self .masters = masters
159
+ self .slave = slave
160
+
161
+ # # #
162
+
163
+ selected = Signal (max = len (masters ))
164
+
165
+ # mux master->slave signals
166
+ for name , size , direction in layout :
167
+ if direction == DIR_M_TO_S :
168
+ choices = Array (getattr (m , name ) for m in masters )
169
+ self .comb += getattr (slave , name ).eq (choices [selected ])
170
+
171
+ # connect slave->master signals
172
+ for name , size , direction in layout :
173
+ if direction == DIR_S_TO_M :
174
+ source = getattr (slave , name )
175
+ for i , m in enumerate (masters ):
176
+ dest = getattr (m , name )
177
+ if name == "arb_gnt" :
178
+ self .comb += dest .eq (source & (selected == i ))
179
+ else :
180
+ self .comb += dest .eq (source )
181
+
182
+ # select master
183
+ self .sync += \
184
+ If (~ slave .arb_req ,
185
+ [If (m .arb_req , selected .eq (i )) for i , m in enumerate (masters )]
186
+ )
187
+
188
+
189
+ class CRIInterconnectShared (Module ):
190
+ def __init__ (self , masters = 2 , slaves = 2 ):
191
+ shared = Interface ()
192
+ self .submodules .arbiter = CRIArbiter (masters , shared )
193
+ self .submodules .decoder = CRIDecoder (slaves , shared )
0 commit comments