如何在I / O端口中使用chisel3.experimental.ChiselEnum?

时间:2019-03-30 14:57:10

标签: scala enums chisel

考虑以下代码:

import chisel3.experimental.ChiselEnum

object MyEnum extends ChiselEnum {
  val A, B = Value
}

class UseEnumIO extends Module {
  val io = IO(new Bundle {
    val in = Input(UInt(1.W))
    val out = Output(Bool())
  })

  io.out := MuxLookup(io.in, false.B, Array(
    MyEnum.A -> true.B,
    MyEnum.B -> true.B
  ))
}

我需要使用一个IO端口,该端口应该是ChiselEnum中的MuxLookup对象。

这是我从SBT收到的错误消息:

[error]  found   : scala.collection.mutable.WrappedArray[(MyEnum.Type, chisel3.core.Bool)]

Scala推断出[S <: chisel3.UInt,T <: chisel3.Data]

我还尝试了val in = Input(MyEnum.Type),这给了我一个更严重的错误。

val defaultVersions = Map(
  "chisel3" -> "3.2-SNAPSHOT
)

2 个答案:

答案 0 :(得分:2)

我不太确定为什么这行不通,但是以下解决方法可能会有所帮助。 试试

  io.out := MuxLookup(io.in, false.B, Seq(
    MyEnum.A.asUInt -> true.B,
    MyEnum.B.asUInt -> true.B
  ))

这似乎对我有用。 我将继续寻找更明显的简单语法不起作用的原因。

答案 1 :(得分:2)

MuxLookup需要选择器的UInt(或Bools)。来自API docs

def apply[S <: UInt, T <: Data](key: S, default: T, mapping: Seq[(S, T)]): T

这可能是一个疏忽,MuxLookupChiselEnum早了很多时间,因此没有考虑到这一点,我有filed an issue支持此用例。同时,您可以使用Chick的解决方法。