为 apply 方法返回多个元素
Returning multiple elements for apply method
我正在使用 DSL (Chisel),其中库的一个特定部分要求我定义 Seq
项。我有几个伴随对象来创建一些中间逻辑和 return 其中一个项目。我有一种情况,我实际上想要 return 其中两个项目,但我很难弄清楚如何做到这一点。
假设这里的“项目”是Person
。 (这里Person
是什么并不重要)
DSL 希望您通过 Seq
.
来描述您所有的 Person
val p1 = new Person(1)
val p2 = new Person(2)
Seq(p1,p2)
我有一个案例,我想 link 两个人在一起。例如,我知道有些人有朋友,他们到处拖着,所以如果他们出现,他们的朋友也会出现(即使我不喜欢他们)。所以我希望能够做类似下面的事情。
object Group {
def apply(): Person, Person = { //return two of these
val pA = new Person(10)
val pAA = new Person(10+1)
}
}
这样,我就可以轻松地做到以下几点
Seq(p1, p2, Group)
//The Seq should have p1, p2, and the pA, pAA
由于这是 DSL,我无权更改内部结构。我 可以 创建 Seq 的每一部分,然后将它们组合在一起,但这并不理想,因为这是我经常做的事情,因此需要一个好的解决方案。出于同样的原因,我无法发回元组。
我试图查看变量 args 是否适用于 return,但似乎不起作用。
如有任何帮助,我们将不胜感激。谢谢
为我们的救世主 Jack Koenig 更新
这是利用RocketChipRegisterRotuer
节点来描述RegFields
在我的设计中,我经常有来自某些逻辑的信号,我希望软件能够阻止上游逻辑并手动驱动信号(考虑一些使您希望软件能够驾驶)。为此,我构建了一个代表驱动值的 SW 寄存器,以及一个处理控制的“mux”SW 寄存器。我目前所做的是这个(目前 returning a Seq[RegField]
但希望你能看到我希望这是两种 RegField
类型
/**
* Creates a muxed override register. This allows software to take control of a particular signal by setting the "_mux" register
* high. Once in this mode, the value of the signal is based on the software register defined here.
*
* This method makes the assumption that you want the two bitfields to be next to each other (reg then mux). If you do not want this
* or can't do this (because the signal you want to control is >=32bits) you will have to create two separate RWReg. One for the mux
* and one for the SW control value
*
*
* val rx_reset_reg = Wire(Bool())
* val rx_reset_mux = Wire(Bool())
* val rx_reset = WavClockMux (rx_reset_mux, rx_reset_reg, io.core.rx_reset)
* WavD2DRxRegs.CoreOverride -> Seq(WavRWReg(rx_reset_reg,0.U, "rx_reset", "RX Reset"),
* WavRWReg(rx_reset_mux,0.U, "rx_reset_mux", "Mux override for rx_reset")),
*
*
* This method also has the nuance that it returns a Seq[RegField]. So you must concatenate this companion object with the higher leve
* Seq[RegField] that we normally use for register generation
*
* WavRWMuxReg(in=io.core.tx_en, muxed=io.ana.tx_en, reg_reset=false.B, mux_reset=false.B, "tx_en", "Main TX enable") ++ Seq(<other regFields>)
*/
object WavRWMuxReg{
def apply[T <: Data](in: T, muxed : T, reg_reset: T, mux_reset: Bool, name: String, desc: String)(implicit p: Parameters): Seq[RegField] = {
//val reg = RegInit(reset)
val reg = RegInit(muxed.cloneType, reg_reset)
reg.suggestName("swi_" + name)
val mux = RegInit(mux_reset)
mux.suggestName("swi_" + name + "_mux")
muxed := Mux(mux, reg, in)
//litValue returns the Bigint value
val rf_reg = RegField(reg.getWidth, reg.asUInt, RegFieldDesc(name, desc, access=RegFieldAccessType.RW , reset=Some(reg_reset.litValue)))
val rf_mux = RegField(1 , mux.asUInt, RegFieldDesc(name+"_mux", "Mux control for corresponding register", access=RegFieldAccessType.RW , reset=Some(mux_reset.litValue)))
Seq(rf_reg, rf_mux)
}
}
in
为输入逻辑
muxed
将是 post 多路信号(可以分配给类似 Bundle
信号的东西)
*_reset
是自动生成的 value/mux 软件寄存器 的重置值
所以理想情况下,我会用它来创建两者,并且可以只说
node.regmap(
0x0 -> Seq(WavRWReg(/*custom method that returns RegField*/),
WavRWMuxReg(/*returns two RegFields*/))
)
Return a Seq
并连接?
object PlusN {
def apply(m, n): Seq[Person] = (m to m+n).map(Person)
}
val people = Seq(p1, p2) ++ PlusN(10, 1)
我正在使用 DSL (Chisel),其中库的一个特定部分要求我定义 Seq
项。我有几个伴随对象来创建一些中间逻辑和 return 其中一个项目。我有一种情况,我实际上想要 return 其中两个项目,但我很难弄清楚如何做到这一点。
假设这里的“项目”是Person
。 (这里Person
是什么并不重要)
DSL 希望您通过 Seq
.
Person
val p1 = new Person(1)
val p2 = new Person(2)
Seq(p1,p2)
我有一个案例,我想 link 两个人在一起。例如,我知道有些人有朋友,他们到处拖着,所以如果他们出现,他们的朋友也会出现(即使我不喜欢他们)。所以我希望能够做类似下面的事情。
object Group {
def apply(): Person, Person = { //return two of these
val pA = new Person(10)
val pAA = new Person(10+1)
}
}
这样,我就可以轻松地做到以下几点
Seq(p1, p2, Group)
//The Seq should have p1, p2, and the pA, pAA
由于这是 DSL,我无权更改内部结构。我 可以 创建 Seq 的每一部分,然后将它们组合在一起,但这并不理想,因为这是我经常做的事情,因此需要一个好的解决方案。出于同样的原因,我无法发回元组。
我试图查看变量 args 是否适用于 return,但似乎不起作用。
如有任何帮助,我们将不胜感激。谢谢
为我们的救世主 Jack Koenig 更新
这是利用RocketChipRegisterRotuer
节点来描述RegFields
在我的设计中,我经常有来自某些逻辑的信号,我希望软件能够阻止上游逻辑并手动驱动信号(考虑一些使您希望软件能够驾驶)。为此,我构建了一个代表驱动值的 SW 寄存器,以及一个处理控制的“mux”SW 寄存器。我目前所做的是这个(目前 returning a Seq[RegField]
但希望你能看到我希望这是两种 RegField
类型
/**
* Creates a muxed override register. This allows software to take control of a particular signal by setting the "_mux" register
* high. Once in this mode, the value of the signal is based on the software register defined here.
*
* This method makes the assumption that you want the two bitfields to be next to each other (reg then mux). If you do not want this
* or can't do this (because the signal you want to control is >=32bits) you will have to create two separate RWReg. One for the mux
* and one for the SW control value
*
*
* val rx_reset_reg = Wire(Bool())
* val rx_reset_mux = Wire(Bool())
* val rx_reset = WavClockMux (rx_reset_mux, rx_reset_reg, io.core.rx_reset)
* WavD2DRxRegs.CoreOverride -> Seq(WavRWReg(rx_reset_reg,0.U, "rx_reset", "RX Reset"),
* WavRWReg(rx_reset_mux,0.U, "rx_reset_mux", "Mux override for rx_reset")),
*
*
* This method also has the nuance that it returns a Seq[RegField]. So you must concatenate this companion object with the higher leve
* Seq[RegField] that we normally use for register generation
*
* WavRWMuxReg(in=io.core.tx_en, muxed=io.ana.tx_en, reg_reset=false.B, mux_reset=false.B, "tx_en", "Main TX enable") ++ Seq(<other regFields>)
*/
object WavRWMuxReg{
def apply[T <: Data](in: T, muxed : T, reg_reset: T, mux_reset: Bool, name: String, desc: String)(implicit p: Parameters): Seq[RegField] = {
//val reg = RegInit(reset)
val reg = RegInit(muxed.cloneType, reg_reset)
reg.suggestName("swi_" + name)
val mux = RegInit(mux_reset)
mux.suggestName("swi_" + name + "_mux")
muxed := Mux(mux, reg, in)
//litValue returns the Bigint value
val rf_reg = RegField(reg.getWidth, reg.asUInt, RegFieldDesc(name, desc, access=RegFieldAccessType.RW , reset=Some(reg_reset.litValue)))
val rf_mux = RegField(1 , mux.asUInt, RegFieldDesc(name+"_mux", "Mux control for corresponding register", access=RegFieldAccessType.RW , reset=Some(mux_reset.litValue)))
Seq(rf_reg, rf_mux)
}
}
in
为输入逻辑muxed
将是 post 多路信号(可以分配给类似Bundle
信号的东西)*_reset
是自动生成的 value/mux 软件寄存器 的重置值
所以理想情况下,我会用它来创建两者,并且可以只说
node.regmap(
0x0 -> Seq(WavRWReg(/*custom method that returns RegField*/),
WavRWMuxReg(/*returns two RegFields*/))
)
Return a Seq
并连接?
object PlusN {
def apply(m, n): Seq[Person] = (m to m+n).map(Person)
}
val people = Seq(p1, p2) ++ PlusN(10, 1)