如何在chisel中的聚合内存中使用掩码?

问题描述

我正在尝试在 chisel 中使用聚合内存。

在 github 中推荐,https://github.com/ucb-bar/chisel3-wiki/blob/master/Chisel-Memories.md

我的代码如下所示:

class Interface(val w:Int) extends Bundle{
  val a: UInt = UInt(w.W)
  val b: UInt = UInt(w.W)
  val c: UInt = UInt(w.W)
}

val mem = Mem(16,new Interface(4))

然后我使用下面的掩码:

mem.write(io.addr,inter,mask)

其中'inter'的类型是Interface,'mask'的类型是Vec[Bool]

出现以下错误

Cannot prove that mytest.Interface <:< chisel3.Vec[_].

搜索了一下,发现只有当内存由Vec定义时才能使用mask。

有什么解决方案可以使这项工作正常进行吗?

解决方法

正如您所指出的,mask 只能在内存的数据类型为 Vec 时使用。

您没有描述您希望 mask 如何与接口对应,但我假设您会有一个大小为 3 的 Vec,每个 {{ 1}}、ab

最简单的解决方案是使用 c

Vec(3,UInt(4.W))

如果您想读写,就好像它实际上是由 val mem = Mem(16,Vec(3,UInt(4.W))) 组成的,您可以转换:

Interface

这些转换有点冗长,您可以创建类型别名以使代码更简洁和可维护:

mem.write(io.addr,inter.asTypeOf(Vec(3,UInt(4.W)),mask)