chisel - 简单的凿子双端口内存读取端口问题

标签 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))

上面的代码编译没有问题。但如果 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 的仿真路径。如果您需要保留一些值(value),我建议您添加一个寄存器,就像这样。

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
  }

关于chisel - 简单的凿子双端口内存读取端口问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61764790/

相关文章:

chisel - 将寄存器中的值与 int 进行比较

scala - 引用未完全初始化

chisel - Chisel/FIRRTL 工具链是否进行 bool 表达式优化?

scala - 在 Chisel 中使用 Vec[Mem] 会很好

scala - 类是抽象的;无法在凿子上实例化错误

chisel - chisel 中的 systemverilog 联合类型

scala - Scala/Chisel 中的函数循环

chisel - 解复用器 : Unconnected Wires/firrtl error

scala - Chisel 既不为 verilog 也不为 C++ 合成

Chisel 代码转换为 Verilog/C++