微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用UInt在Seq中获取物品

如何解决使用UInt在Seq中获取物品

我试图写一个缓存,所以创建了一个Seq类型的Mem,因为我想同时访问一组缓存中的所有元素。

val MetaMem = Seq.fill(nWays) (Mem((nSets),new MetaData))

然后我要像下面这样建立索引:

   MetaMem(way).write(set,MD)

但是,因为在我的代码中方式是UInt,而seq只接受Int进行索引,所以会导致编译错误。 有人对如何解决此问题有任何建议吗? 非常感谢

解决方法

通常,要使用UInt中的动态值访问硬件元素,必须使用Vec。在这种情况下,最简单的方法是通过使用Vec创建VecInit来实现,Vec定义了Vec并连接元素。

但是,内存不是数据的子类(VecInit / /** Simulate a VecLike bank of memories */ class MemBank(val banks: Int,val bankDepth: Int) extends MultiIOModule { val bank = IO(Input(UInt(16.W))) val address = IO(Input(UInt(16.W))) val isRead = IO(Input(Bool())) val inputValue = IO(Input(UInt(32.W))) val outputValue = IO(Output(UInt(32.W))) val mems = Seq.fill(banks) { Mem(bankDepth,UInt(32.W)) } outputValue := DontCare when(isRead) { (0 until banks).foldLeft(when(false.B) {}) { case (whenContext,bankIndex) => whenContext.elsewhen(bank === bankIndex.U) { outputValue := mems(bankIndex)(address) } } }.otherwise { (0 until banks).foldLeft(when(false.B) {}) { case (whenContext,bankIndex) => whenContext.elsewhen(bank === bankIndex.U) { mems(bankIndex)(address) := inputValue } } } } 要求的)。 这是一个简单的简单示例,它创建了一个存储库并提供对它们的读/写访问权限。

class MemBankTest extends FreeSpec with ChiselScalatestTester {

  "MemBankSimulation should work" in {
    test(new MemBank(banks = 3,bankDepth = 3)) { dut =>
      // write values into memory
      dut.isRead.poke(false.B)
      for (bank <- 0 until dut.banks) {
        for (address <- 0 until dut.bankDepth) {
          dut.clock.step()
          dut.bank.poke(bank.U)
          dut.address.poke(address.U)
          dut.inputValue.poke((bank * 1000 + address).U)
        }
      }

      // read values out of memory banks
      dut.isRead.poke(true.B)
      for (bank <- 0 until dut.banks) {
        for (address <- 0 until dut.bankDepth) {
          dut.clock.step()
          dut.bank.poke(bank.U)
          dut.address.poke(address.U)
          println(f"Bank $bank%3d at address $address%3d contains ${dut.outputValue.peek().litValue()}%6d")
        }
      }
    }
  }
}

这是一个可以使用此模块进行演示的UnitTest

Seq

还有许多其他方法可以做到这一点,我鼓励您查看其他凿子项目,例如火箭芯片,以了解如何处理多个记忆。 最好还是看看这种方法是如何工作的。它创建了Mem中的Mux,但是它使用foldLeft(一种非常有用的方法)来创建一组<!DOCTYPE html> <html lang="en"> <head> <title>TextArea</title> </head> <body> <label for="txtarea">Input</label> <input type="text" id="txtarea" size="30" onchange="setText(this.value)"/> <p>Content Value</p> <label id="lbl_content"></label> </body> <script> let lbl = document.getElementById("lbl_content"); function setText(value) { lbl.innerHTML = value; } </script> </html> es,它们选择了您感兴趣的银行。这可以分别控制读写。 我希望这会有所帮助,这是一个好而棘手的问题。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。