chisel - 简单凿子双口内存读口问题
问题描述
我正在尝试为 verilog 生成做关于凿子的基本教程,我正在尝试构建一个双端口内存:
import chisel3._
import chisel3.stage.ChiselStage
class Memo extends Module {
val io = IO(new Bundle {
val wen = Input(Bool())
val wrAddr = Input(UInt(8.W))
val wrData = Input(UInt(8.W))
val ren = Input(Bool())
val rdAddr = Input(UInt(8.W))
val rdData = Output(UInt(8.W))
})
val mem = Mem(256, UInt(8.W))
when(io.wen) {
mem(io.wrAddr) := io.wrData
}
io.rdData := 0.U
when(io.ren) {
io.rdData := mem(io.rdAddr)
}
}
println((new ChiselStage).emitVerilog(new Memo))
上面的代码编译没有问题。但我想将rdData
值保持为旧值 if ren = 0
。为此,我评论了一行io.rdData := 0.U
,我得到了错误:
Errors: 1: in the following tutorials
Tutorial Memo: exception @[:@6.4] : [module Memo] Reference io is not fully initialized.
@[Memo.scala 31:15:@15.6] : io.rdData <= mux(io.ren, mem._T_20.data, VOID) @[Memo.scala 31:15:@15.6]
我该如何解决?如何在 rdData 上保存以前的值?还有错误消息是什么意思,io 没有初始化?
解决方案
未初始化的错误意味着可能存在从未分配过线 io.rdData 的模拟路径。如果您需要保留某个值,我建议您添加一个寄存器,类似这样。
val mem = Mem(256, UInt(8.W))
when(io.wen) {
mem(io.wrAddr) := io.wrData
}
val lastValue = RegInit(0.U(8.W))
io.rdData := 0.U
when(io.ren) {
io.rdData := mem(io.rdAddr)
lastValue := io.rdData
}.otherwise {
io.rdData := lastValue
}
推荐阅读
- reactjs - 反应中功能组件内的导出功能
- directory - 自动为某个文件夹中的新文件夹创建子文件夹
- google-analytics - GA4 中的登录状态跟踪
- python - 如何从 s3 导入 stl 文件以进行 numpy stl 属性评估?
- reactjs - CoreUI:尝试 npm install 下载的免费版 CoreUI 来尝试仪表板
- gatsby - 盖茨比。Gatsby-plugin-intl 和 framer 运动 AnimatePresence 问题
- time-series - 需要协助查找用于时间序列分解 STL 的 Fortan 代码
- environment-variables - 如何总是逃避用户的输入?
- node.js - Node.js localhost to live server
- flutter - How to deal with different countdown in listview