为应用方法返回多个元素

问题描述

我正在使用 DSL(凿子),其中库的一个特定部分要求我定义 Seq 项。我有几个配套对象来创建一些中间逻辑并返回这些项目之一。我有一种情况,我想实际退回其中的两个项目,但我很难弄清楚如何做到这一点。

假设这里的“项目”是 Person。 (Person 是什么并不重要)

DSL 要求您通过 Person 描述您的所有 Seq

val p1 = new Person(1)
val p2 = new Person(2)

Seq(p1,p2)

我有一个案例,我想将两个人联系在一起。例如,我知道有些人的朋友到处都是,所以如果他们出现,他们的朋友也会出现(即使我不喜欢他们)。所以我希望能够做类似以下的事情。

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,and the pA,pAA 

由于这是一个 DSL,我无权更改内部结构。我可以创建 Seq 的每一部分,然后将它们全部组合在一起,但这并不理想,因为这是我经常做的事情,因此需要一个好的解决方案。出于同样的原因,我无法发回元组

我试图查看变量 args 是否对返回起作用,但这似乎不起作用。

任何帮助将不胜感激。谢谢


我们的领主和救世主杰克·科尼格的更新

这是利用 RocketChip RegisterRotuer 节点来描述 RegFields

通常在我的设计中,我有来自某些逻辑的信号,并且我希望软件能够阻止上游逻辑并手动驱动信号(考虑一些您希望软件能够驱动的启用) .为此,我构建了一个代表驱动值的 SW 寄存器,以及一个处理控制的“mux”SW 寄存器。我目前所做的是这个(目前返回一个 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,"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",reset=Some(mux_reset.litValue)))
    Seq(rf_reg,rf_mux)
  }
}

  • in 是输入逻辑
  • muxed 将是后多路复用信号(可以分配给诸如 Bundle 之类的信号)
  • *_reset自动生成值/多路复用器 SW 寄存器的复位值

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

node.regmap(
  0x0 -> Seq(WavRWReg(/*custom method that returns RegField*/),WavRWMuxReg(/*returns two RegFields*/))
)

解决方法

返回一个 Seq 并连接?

    object PlusN {
       def apply(m,n): Seq[Person] = (m to m+n).map(Person)
    }
    
   val people = Seq(p1,p2) ++ PlusN(10,1)