简单的凿子双端口内存读取端口问题
Simple chisel dual port memory Read port issue
我正在尝试做 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))
以上代码编译没有问题。但如果 ren = 0
,我想将 rdData
值保持为旧值。为此,我评论了 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
}
我正在尝试做 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))
以上代码编译没有问题。但如果 ren = 0
,我想将 rdData
值保持为旧值。为此,我评论了 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
}