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

lizhi

我正在尝试在 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[_].

查了下,发现mask只能在Vec定义内存的情况下使用。

有什么解决方案可以使这项工作?

杰克·柯尼格

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

你没有描述你想要的究竟是如何mask对应于接口,但我假设你将有一个Vec大小为3,每个位对应一个abc

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章