2
2
3
3
from migen .fhdl .structure import *
4
4
from migen .corelogic .roundrobin import *
5
- from migen .corelogic .misc import multimux , optree
5
+ from migen .corelogic .misc import optree
6
6
from migen .corelogic .fsm import FSM
7
7
8
8
class CommandRequest :
@@ -41,21 +41,17 @@ def get_fragment(self):
41
41
for i , req in enumerate (self .requests )]
42
42
43
43
stb = Signal ()
44
- inputs_perm = [[req .stb ,
45
- req .a , req .ba ,
46
- req .is_read , req .is_write , req .tag ] for req in self .requests ]
47
- outputs_perm = [stb ,
48
- self .cmd .a , self .cmd .ba ,
49
- self .cmd .is_read , self .cmd .is_write , self .cmd .tag ]
50
- comb += multimux (rr .grant , inputs_perm , outputs_perm )
51
-
52
- inputs_filtered = [[req .cas_n , req .ras_n , req .we_n ] for req in self .requests ]
53
- outputs_filtered = [self .cmd .cas_n , self .cmd .ras_n , self .cmd .we_n ]
54
- ms = multimux (rr .grant , inputs_filtered , outputs_filtered )
55
- comb += [
56
- self .cmd .stb .eq (stb & (self .cmd .is_read == self .want_reads ) & (self .cmd .is_write == self .want_writes )),
57
- If (self .cmd .stb , * ms )
58
- ]
44
+ comb .append (stb .eq (Array (req .stb for req in self .requests )[rr .grant ]))
45
+ for name in ["a" , "ba" , "is_read" , "is_write" , "tag" ]:
46
+ choices = Array (getattr (req , name ) for req in self .requests )
47
+ comb .append (getattr (self .cmd , name ).eq (choices [rr .grant ]))
48
+ for name in ["cas_n" , "ras_n" , "we_n" ]:
49
+ # we should only assert those signals when stb is 1
50
+ choices = Array (getattr (req , name ) for req in self .requests )
51
+ comb .append (If (self .cmd .stb , getattr (self .cmd , name ).eq (choices [rr .grant ])))
52
+ comb .append (self .cmd .stb .eq (stb \
53
+ & (self .cmd .is_read == self .want_reads ) \
54
+ & (self .cmd .is_write == self .want_writes )))
59
55
60
56
comb += [If (self .cmd .stb & self .cmd .ack & (rr .grant == i ), req .ack .eq (1 ))
61
57
for i , req in enumerate (self .requests )]
@@ -80,19 +76,20 @@ def stb_and(cmd, attr):
80
76
return Constant (0 )
81
77
else :
82
78
return cmd .stb & getattr (cmd , attr )
83
- inputs = [[cmd .a , cmd .ba ,
84
- cmd .cas_n , cmd .ras_n ,
85
- cmd .we_n , stb_and (cmd , "is_read" ), stb_and (cmd , "is_write" )]
86
- for cmd in self .commands ]
87
79
for phase , sel in zip (self .dfi .phases , self .sel ):
88
80
comb += [
89
81
phase .cke .eq (1 ),
90
82
phase .cs_n .eq (0 )
91
83
]
92
- outputs = [phase .address , phase .bank ,
93
- phase .cas_n , phase .ras_n , phase .we_n ,
94
- phase .rddata_en , phase .wrdata_en ]
95
- sync += multimux (sel , inputs , outputs )
84
+ sync += [
85
+ phase .address .eq (Array (cmd .a for cmd in self .commands )[sel ]),
86
+ phase .bank .eq (Array (cmd .ba for cmd in self .commands )[sel ]),
87
+ phase .cas_n .eq (Array (cmd .cas_n for cmd in self .commands )[sel ]),
88
+ phase .ras_n .eq (Array (cmd .ras_n for cmd in self .commands )[sel ]),
89
+ phase .we_n .eq (Array (cmd .we_n for cmd in self .commands )[sel ]),
90
+ phase .rddata_en .eq (Array (stb_and (cmd , "is_read" ) for cmd in self .commands )[sel ]),
91
+ phase .wrdata_en .eq (Array (stb_and (cmd , "is_write" ) for cmd in self .commands )[sel ])
92
+ ]
96
93
return Fragment (comb , sync )
97
94
98
95
class _Datapath :
0 commit comments