问题描述
我试图写一个缓存,所以创建了一个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,它们选择了您感兴趣的银行。这可以分别控制读写。
我希望这会有所帮助,这是一个好而棘手的问题。