@@ -70,45 +70,42 @@ def __init__(self, port, fifo_depth=16, fifo_buffered=False, with_csr=False):
70
70
else :
71
71
raise NotImplementedError
72
72
73
+ # Reservation FIFO -------------------------------------------------------------------------
74
+
75
+ res_fifo = stream .SyncFIFO ([("dummy" , 1 )], fifo_depth )
76
+ self .submodules += res_fifo
77
+
73
78
# Request issuance -------------------------------------------------------------------------
74
- request_enable = Signal ()
75
- request_issued = Signal ()
76
79
77
80
if is_native :
78
81
self .comb += cmd .we .eq (0 )
79
82
if is_axi :
80
83
self .comb += cmd .size .eq (int (log2 (port .data_width // 8 )))
81
84
self .comb += [
82
85
cmd .addr .eq (sink .address ),
83
- cmd .valid .eq (enable & sink .valid & request_enable ),
84
- sink . ready .eq (enable & cmd . ready & request_enable ),
85
- request_issued . eq (cmd .valid & cmd . ready )
86
+ cmd .last .eq (sink .last ),
87
+ cmd . valid .eq (enable & sink . valid & res_fifo . sink . ready ),
88
+ sink . ready . eq (enable & cmd .ready & res_fifo . sink . ready ),
86
89
]
87
-
88
- # FIFO reservation level counter -----------------------------------------------------------
89
- # - Incremented when data is planned to be queued.
90
- # - Decremented when data is dequeued.
91
- data_dequeued = Signal ()
92
- self .rsv_level = rsv_level = Signal (max = fifo_depth + 1 )
93
- self .sync += [
94
- If (request_issued ,
95
- If (~ data_dequeued , rsv_level .eq (self .rsv_level + 1 ))
96
- ).Elif (data_dequeued ,
97
- rsv_level .eq (rsv_level - 1 )
98
- )
90
+ self .comb += [
91
+ res_fifo .sink .valid .eq (cmd .valid & cmd .ready ),
92
+ res_fifo .sink .last .eq (cmd .last ),
99
93
]
100
- self .comb += request_enable .eq (rsv_level != fifo_depth )
101
94
102
95
# FIFO -------------------------------------------------------------------------------------
103
96
fifo = stream .SyncFIFO ([("data" , port .data_width )], fifo_depth , fifo_buffered )
104
97
self .submodules += fifo
105
98
106
99
self .comb += [
107
100
rdata .connect (fifo .sink , omit = {"id" , "resp" , "dest" , "user" }),
108
- fifo .source .connect (source , omit = {"ready" }),
101
+ fifo .source .connect (source , omit = {"valid" , "ready" , "last" }),
102
+ If (res_fifo .source .valid ,
103
+ source .valid .eq (fifo .source .valid ),
104
+ source .last .eq (res_fifo .source .last ),
105
+ ),
109
106
fifo .source .ready .eq (source .ready | ~ enable ), # Flush FIFO/Reservation counter when disabled.
110
- data_dequeued .eq (fifo .source .valid & fifo .source .ready )
111
107
]
108
+ self .comb += res_fifo .source .ready .eq (fifo .source .valid & fifo .source .ready )
112
109
113
110
if with_csr :
114
111
self .add_csr ()
0 commit comments