Skip to content

Commit 2ea8b23

Browse files
committed
Remove Reset sync logic.
1 parent 07c9fd2 commit 2ea8b23

File tree

1 file changed

+11
-49
lines changed

1 file changed

+11
-49
lines changed

src/main/scala/chisel3/util/experimental/crossing/AsyncQueue.scala

Lines changed: 11 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@ class AsyncDequeueIO[T <: Data](gen: T) extends Bundle {
1616
val sink: DecoupledIO[T] = Decoupled(gen)
1717
}
1818

19-
2019
/** Memory used for queue.
2120
* In ASIC, it will be synthesised to Flip-Flop
2221
*
@@ -53,32 +52,29 @@ class DataMemory[T <: Data](gen: T, depth: Int, narrow: Boolean) extends RawModu
5352
}
5453
}
5554

56-
5755
/** Sink of [[AsyncQueue]] constructor.
5856
*
5957
* @tparam T Hardware type to be converted.
6058
* @note SRAM-based clock-domain-crossing source.
6159
*/
62-
class AsyncQueueSink[T <: Data](gen: T, depth: Int, sync: Int, safe: Boolean = true, narrow: Boolean = true) extends MultiIOModule {
60+
class AsyncQueueSink[T <: Data](gen: T, depth: Int, sync: Int, narrow: Boolean = true) extends MultiIOModule {
6361
require(depth > 0 && isPow2(depth), "todo")
6462
require(sync >= 2, "todo")
6563
private val depthWidth: Int = log2Ceil(depth)
6664
/** Dequeue Decoupled IO. */
6765
val dequeue: DecoupledIO[T] = IO(Decoupled(gen))
6866

69-
val sourceReady: Option[Bool] = if (safe) Some(IO(Input(Bool()))) else None
70-
71-
val readIndexGray: UInt = withReset(reset.asAsyncReset())(grayCounter(depthWidth + 1, dequeue.fire(), !sourceReady.getOrElse(true.B), "readIndex"))
67+
val readIndexGray: UInt = withReset(reset.asAsyncReset())(grayCounter(depthWidth + 1, dequeue.fire(), false.B, "readIndex"))
7268
val readIndexGrayReg: UInt = withReset(reset.asAsyncReset())(RegNext(next = readIndexGray, init = 0.U).suggestName("readIndexReg"))
7369
val writeIndexGray: UInt = IO(Input(UInt((depthWidth + 1).W)))
7470

7571
/** ready signal to indicate [[DecoupledIO]] this queue is not empty, can still dequeue new data. */
7672
val empty: Bool = readIndexGray === writeIndexGray
77-
val valid: Bool = sourceReady.getOrElse(true.B) && !empty
73+
val valid: Bool = !empty
7874
val validReg: Bool = withReset(reset.asAsyncReset())(RegNext(next = valid, init = false.B).suggestName("validReg"))
7975

8076
// dequeue to [[DecoupledIO]]
81-
dequeue.valid := validReg && sourceReady.getOrElse(true.B)
77+
dequeue.valid := validReg
8278

8379
// port to access memory
8480
val readEnable: Bool = IO(Output(Bool()))
@@ -109,26 +105,24 @@ class AsyncQueueSink[T <: Data](gen: T, depth: Int, sync: Int, safe: Boolean = t
109105
* @todo make sync optional, if None use async logic.
110106
* add some verification codes.
111107
*/
112-
class AsyncQueueSource[T <: Data](gen: T, depth: Int, sync: Int, safe: Boolean, narrow: Boolean) extends MultiIOModule {
108+
class AsyncQueueSource[T <: Data](gen: T, depth: Int, sync: Int) extends MultiIOModule {
113109
require(depth > 0 && isPow2(depth), "todo")
114110
require(sync >= 2, "todo")
115111
private val depthWidth: Int = log2Ceil(depth)
116112
/** Enqueue Decoupled IO. */
117113
val enqueue: DecoupledIO[T] = IO(Flipped(Decoupled(gen)))
118114

119-
val sinkReady: Option[Bool] = if (safe) Some(IO(Input(Bool()))) else None
120-
121-
val writeIndexGray: UInt = withReset(reset.asAsyncReset())(grayCounter(depthWidth + 1, enqueue.fire(), !sinkReady.getOrElse(true.B), "writeIndex"))
115+
val writeIndexGray: UInt = withReset(reset.asAsyncReset())(grayCounter(depthWidth + 1, enqueue.fire(), false.B, "writeIndex"))
122116
val writeIndexGrayReg: UInt = withReset(reset.asAsyncReset())(RegNext(next = writeIndexGray, init = 0.U).suggestName("writeIndexReg"))
123117
val readIndexGray: UInt = IO(Input(UInt((depthWidth + 1).W)))
124118

125119
/** ready signal to indicate [[DecoupledIO]] this queue is not full, can still enqueue new data. */
126120
val full: Bool = writeIndexGray === (readIndexGray ^ (depth | depth >> 1).U)
127-
val ready: Bool = sinkReady.getOrElse(true.B) && !full
121+
val ready: Bool = !full
128122
val readyReg: Bool = withReset(reset.asAsyncReset())(RegNext(next = ready, init = false.B).suggestName("readyReg"))
129123

130124
// enqueue from [[DecoupledIO]]
131-
enqueue.ready := readyReg && sinkReady.getOrElse(true.B)
125+
enqueue.ready := readyReg
132126

133127
// port to access memory
134128
val writeEnable: Bool = IO(Output(Bool()))
@@ -139,7 +133,6 @@ class AsyncQueueSource[T <: Data](gen: T, depth: Int, sync: Int, safe: Boolean,
139133
writeIndex := writeIndexGrayReg(depthWidth, 0)
140134
}
141135

142-
143136
/** cross-clock-domain syncing asynchronous queue.
144137
*
145138
* @note [[AsyncQueueSource.writeIndexGray]] and [[AsyncQueueSink.readIndexGray]] will be synced to each other.
@@ -152,15 +145,15 @@ class AsyncQueueSource[T <: Data](gen: T, depth: Int, sync: Int, safe: Boolean,
152145
* }}}
153146
*
154147
*/
155-
class AsyncQueue[T <: Data](gen: T, depth: Int = 8, sync: Int = 3, narrow: Boolean = true, safe: Boolean = true) extends MultiIOModule {
148+
class AsyncQueue[T <: Data](gen: T, depth: Int = 8, sync: Int = 3, narrow: Boolean = true) extends MultiIOModule {
156149
val enqueue: AsyncEnqueueIO[T] = IO(new AsyncEnqueueIO(gen))
157150
val sourceModule: AsyncQueueSource[T] =
158-
withClockAndReset(enqueue.clock, enqueue.reset)(Module(new AsyncQueueSource(gen, depth, sync, safe, narrow)))
151+
withClockAndReset(enqueue.clock, enqueue.reset)(Module(new AsyncQueueSource(gen, depth, sync)))
159152
sourceModule.enqueue <> enqueue.source
160153

161154
val dequeue: AsyncDequeueIO[T] = IO(new AsyncDequeueIO(gen))
162155
val sinkModule: AsyncQueueSink[T] =
163-
withClockAndReset(enqueue.clock, enqueue.reset)(Module(new AsyncQueueSink(gen, depth, sync, safe, narrow)))
156+
withClockAndReset(enqueue.clock, enqueue.reset)(Module(new AsyncQueueSink(gen, depth, sync, narrow)))
164157
dequeue.sink <> sinkModule.dequeue
165158

166159
// read/write index bidirectional sync
@@ -194,35 +187,4 @@ class AsyncQueue[T <: Data](gen: T, depth: Int = 8, sync: Int = 3, narrow: Boole
194187
sinkFullData := withClock(dequeue.clock)(RegNext(memoryFullData))
195188
case _ =>
196189
}
197-
198-
// reset sync to clear internal gray code index.
199-
private def resetSync(clock: Clock, desc: String)(in: Bool): Bool = withClockAndReset(clock, (enqueue.reset || dequeue.reset).asAsyncReset()) {
200-
val shiftRegisters: Seq[Bool] = ShiftRegisters(in, sync, false.B, true.B)
201-
group(shiftRegisters, s"${desc}Module", desc)
202-
shiftRegisters.last
203-
}
204-
205-
sinkModule.sourceReady.foreach(_ :=
206-
resetSync(dequeue.clock, "sinkValid")(
207-
resetSync(dequeue.clock, "sinkExtend")(
208-
resetSync(enqueue.clock, "sinkValid1")(
209-
resetSync(enqueue.clock, "sinkValid0")(
210-
true.B
211-
)
212-
)
213-
)
214-
)
215-
)
216-
217-
sourceModule.sinkReady.foreach(_ :=
218-
resetSync(enqueue.clock, "sourceValid")(
219-
resetSync(enqueue.clock, "sourceExtend")(
220-
resetSync(dequeue.clock, "sourceValid1")(
221-
resetSync(dequeue.clock, "sourceValid0")(
222-
true.B
223-
)
224-
)
225-
)
226-
)
227-
)
228190
}

0 commit comments

Comments
 (0)