【问题标题】:Generate dynamic bundle生成动态捆绑包
【发布时间】:2021-11-05 06:41:17
【问题描述】:

在我的项目中,我有许多不同的自定义 Bundle。 它们可以完全不同。 比如这些:

class MyBundle extends Bundle {
  val v1 = UInt(8.W)
  val v2 = Bool()
  val v3 = UInt(4.W)
}

class MyBundle2 extends Bundle {
  val v4 = UInt(18.W)
  val v5 = UInt(2.W)
}

...

我希望能够为所有这些操作生成相应的 Bundle,而不是手动创建新的 Bundle 来执行每个操作。 所以对于 MyBundle,我想做:

// Must be generated for each Bundle
class MyGenBundle extends Bundle {
  val v1 = UInt(log2Ceil(8 + 1).W) // width = MyBundle.v1 width + 1
  val v2 = UInt(log2Ceil(1 + 1).W) // width = MyBundle.v2 width + 1
  val v3 = UInt(log2Ceil(4 + 1).W) // width = MyBundle.v3 width + 1
}

class MyModule extends Module {
  ...
  ...
  val w_b = Wire(new MyBundle())
  val w_gb = Wire(new MyGenBundle())

  // Must be automated for each Bundle
  w_gb.v1 := PopCount(w_b.v1)
  w_gb.v2 := PopCount(w_b.v2)
  w_gb.v3 := PopCount(w_b.v3)
}

我的目标是从MyBundle自动生成MyGenBundle(或直接在MyModule中类似),并在MyModule中执行strong> 对所有信号进行相同的操作。 这也意味着我需要动态处理每个 Bundle 中的所有信号。 最后,我认为解决方案可以有以下形式:

val w_b = Wire(new MyBundle())
val w_gb = Wire(new AutoGenBundle(new MyBundle())) // AutoGenBundle generates a Bundle from parameter

val v_sig = Seq(v1, v1, v3)                        // Can be recovered automatically 
                                                   // from w_b.elements I think
foreach (s <- v_sig) {
  w_gb."s" := PopCount(w_b."s")                    // Here "s" the dynamic name of the signal
}                                                  // But how in the real case ?

在 Chisel/Scala 中这在技术上可行吗? 如果有,您有什么实施的想法吗?

【问题讨论】:

    标签: chisel


    【解决方案1】:

    基本解决方案是为 GenericBundle 使用 MixedVec 凿子类型

    class MyBundle extends Bundle {
      val v1 = UInt(8.W)
      val v2 = Bool()
      val v3 = UInt(4.W)
    }
    
    class GenericBundle[T <: Bundle](data: T) extends Bundle {
      val v = MixedVec(data.elements.values.map(x => UInt(log2Ceil(x.getWidth + 1).W)).toList)
    
      def popCount(data: T): Unit = {
        data.elements.values.zip(v).foreach { case (left, right) =>
          right := PopCount(left.asUInt())
        }
      }
    }
    
    class MyModule extends MultiIOModule {
      val w_b = IO(Input(new MyBundle))
      val w_gb = IO(Output(new GenericBundle(w_b)))
    
      w_gb.popCount(w_b)
    }
    
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-10-19
      • 1970-01-01
      • 1970-01-01
      • 2014-12-23
      • 2017-11-20
      • 1970-01-01
      • 2018-01-09
      • 2013-05-03
      相关资源
      最近更新 更多