在chisel3中实现Queue,
对象队列返回 TransitName :
object Queue
{
/** Create a queue and supply a DecoupledIO containing the product. */
@chiselName
def apply[T <: Data](
enq: ReadyValidIO[T],
entries: Int = 2,
pipe: Boolean = false,
flow: Boolean = false): DecoupledIO[T] = {
if (entries == 0) {
val deq = Wire(new DecoupledIO(enq.bits))
deq.valid := enq.valid
deq.bits := enq.bits
enq.ready := deq.ready
deq
} else {
require(entries > 0)
val q = Module(new Queue(chiselTypeOf(enq.bits), entries, pipe, flow))
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
TransitName(q.io.deq, q)
}
}
我无法理解 TransitName 中的内容,因为我无法理解其源代码的含义。
在位于TransitName(q.io.deq, q)
的行,我认为只返回q.io.deq(而不是 TransitName ),它可以正常工作。但为什么我们需要 TransitName ??
答案 0 :(得分:1)
TransitName
正在帮助根据用户指定的内容命名创建的Queue
模块。 Queue
工厂在内部创建一个新的Queue
对象,但只返回其IO的一部分。 Chisel根据用户的名称(或通过某些名称覆盖)知道如何命名IO。但是,Chisel 不知道将队列命名为什么。为了提高下游表示(FIRRTL,Verilog)中队列的可读性,这将“转移”#34; q.io.deq
的{{1}}的名称,而不是给它生成/临时名称(例如,Queue
)丢失与用户姓名的连接。
但是,从功能的角度来看,_T_42
所做的只是返回TransitName
。
查看TransitName
object definition了解更多详情(以及一个好评)。