class HellaQueue[T <: Data](val entries: Int)(data: => T) extends Module { val io = new QueueIO(data, entries) val fq = Module(new HellaFlowQueue(entries)(data)) fq.io.enq <> io.enq io.deq <> Queue(fq.io.deq, 1, pipe = true) } object HellaQueue { def apply[T <: Data](enq: DecoupledIO[T], entries: Int) = { val q = Module((new HellaQueue(entries)) { enq.bits }) q.io.enq.valid := enq.valid // not using <> so that override is allowed q.io.enq.bits := enq.bits enq.ready := q.io.enq.ready q.io.deq } }
What does the :< operator do in [T <: Data>]?
It is obvious (to me at least) that this is for type parameterization. The <: operator indicates that the type supplied to the class instance must have chisel3.core.Data as an ancestor.
Why does (data: => T) do?
No suprise that (val entries: Int) is the primary constructor. The fat arrow (=>) implies a function. The first argument to the constructor lets you specific the number of entries. The second argument data helps to parameterize the class.
// example usage val xy: Data val hq1 = (new HellaQueue(entries = 90)){xy} // equivalent to above, without (data: => T) in the class constructor val hq2 = (new HellaQueue[SInt](entries = 90))
Why is a class definion and a object definition of the same name?
The object is known as a companion class, consult stackoverflow.com for more info
What does the apply function do in the object?
The apply function acts as an auxillary constructor. Allows alternative syntax for creating HellaQueue.
No comments:
Post a Comment