为 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)
  }
}

所以理想情况下,我会用它来创建两者,并且可以只说

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)