如何在凿子的聚合内存中使用掩码

  • 本文关键字:内存 掩码 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[Bol]

给出以下错误:

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

我做了一些搜索,发现只有当内存由Vec定义时,才能使用掩码。

有什么解决方案可以让它发挥作用?

如前所述,只有当内存的数据类型为Vec时,才能使用mask

您没有描述您希望mask与接口的确切对应方式,但我假设您会有一个大小为3的Vecabc各有一位。

最简单的解决方案是只使用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)

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

val w = 4
val memType = Vec(3, UInt(w.W))
val intfType = new Interface(w)
val mem = Mem(16, memType)
mem.write(io.addr, inter.asTypeOf(memType), mask)
val read: Interface = mem.read(io.addr).asTypeOf(intfType)

最新更新