@@ -14,12 +14,13 @@ def __init__(self, aw, dw, nbanks, req_queue_size, read_latency, write_latency):
14
14
self .write_latency = write_latency
15
15
16
16
bank_layout = [
17
- ("adr" , aw , DIR_M_TO_S ),
18
- ("we" , 1 , DIR_M_TO_S ),
19
- ("stb" , 1 , DIR_M_TO_S ),
20
- ("req_ack" , 1 , DIR_S_TO_M ),
21
- ("dat_ack" , 1 , DIR_S_TO_M ),
22
- ("lock" , 1 , DIR_S_TO_M )
17
+ ("adr" , aw , DIR_M_TO_S ),
18
+ ("we" , 1 , DIR_M_TO_S ),
19
+ ("stb" , 1 , DIR_M_TO_S ),
20
+ ("req_ack" , 1 , DIR_S_TO_M ),
21
+ ("dat_w_ack" , 1 , DIR_S_TO_M ),
22
+ ("dat_r_ack" , 1 , DIR_S_TO_M ),
23
+ ("lock" , 1 , DIR_S_TO_M )
23
24
]
24
25
if nbanks > 1 :
25
26
layout = [("bank" + str (i ), bank_layout ) for i in range (nbanks )]
@@ -77,7 +78,9 @@ def do_finalize(self):
77
78
else :
78
79
controller_selected = [1 ]* nmasters
79
80
master_req_acks = [0 ]* nmasters
80
- master_dat_acks = [0 ]* nmasters
81
+ master_dat_w_acks = [0 ]* nmasters
82
+ master_dat_r_acks = [0 ]* nmasters
83
+
81
84
rrs = [roundrobin .RoundRobin (nmasters , roundrobin .SP_CE ) for n in range (self ._nbanks )]
82
85
self .submodules += rrs
83
86
for nb , rr in enumerate (rrs ):
@@ -109,11 +112,28 @@ def do_finalize(self):
109
112
]
110
113
master_req_acks = [master_req_ack | ((rr .grant == nm ) & bank_selected [nm ] & bank .req_ack )
111
114
for nm , master_req_ack in enumerate (master_req_acks )]
112
- master_dat_acks = [master_dat_ack | ((rr .grant == nm ) & bank .dat_ack )
113
- for nm , master_dat_ack in enumerate (master_dat_acks )]
115
+ master_dat_w_acks = [master_dat_w_ack | ((rr .grant == nm ) & bank .dat_w_ack )
116
+ for nm , master_dat_w_ack in enumerate (master_dat_w_acks )]
117
+ master_dat_r_acks = [master_dat_r_ack | ((rr .grant == nm ) & bank .dat_r_ack )
118
+ for nm , master_dat_r_ack in enumerate (master_dat_r_acks )]
119
+
120
+ for nm , master_dat_w_ack in enumerate (master_dat_w_acks ):
121
+ for i in range (self ._write_latency ):
122
+ new_master_dat_w_ack = Signal ()
123
+ self .sync += new_master_dat_w_ack .eq (master_dat_w_ack )
124
+ master_dat_w_ack = new_master_dat_w_ack
125
+ master_dat_w_acks [nm ] = master_dat_w_ack
126
+
127
+ for nm , master_dat_r_ack in enumerate (master_dat_r_acks ):
128
+ for i in range (self ._read_latency ):
129
+ new_master_dat_r_ack = Signal ()
130
+ self .sync += new_master_dat_r_ack .eq (master_dat_r_ack )
131
+ master_dat_r_ack = new_master_dat_r_ack
132
+ master_dat_r_acks [nm ] = master_dat_r_ack
114
133
115
134
self .comb += [master .req_ack .eq (master_req_ack ) for master , master_req_ack in zip (self ._masters , master_req_acks )]
116
- self .comb += [master .dat_ack .eq (master_dat_ack ) for master , master_dat_ack in zip (self ._masters , master_dat_acks )]
135
+ self .comb += [master .dat_w_ack .eq (master_dat_w_ack ) for master , master_dat_w_ack in zip (self ._masters , master_dat_w_acks )]
136
+ self .comb += [master .dat_r_ack .eq (master_dat_r_ack ) for master , master_dat_r_ack in zip (self ._masters , master_dat_r_acks )]
117
137
118
138
# route data writes
119
139
controller_selected_wl = controller_selected
0 commit comments