【发布时间】:2021-08-30 20:23:12
【问题描述】:
我在火箭芯片中添加了一个设备,它有控制和状态寄存器,还有一个内部 ram。为了能够使用软件访问它,我已通过以下方式将其添加到 regmap() 中:
val mem = Module(new SinglePortMemory(32,128, 7))
// init //
mem.io.re := false.B
mem.io.we := false.B
mem.io.addr := 0.U
mem.io.din := 0.S
val dout = RegNext(mem.io.dout)
regmap((
Seq(
0x0 -> Seq(RegField(1,enable,RegFieldDesc("enable","This bit enable my device")))
++ Seq.tabulate(128) {j =>
(0x50 + (j*4)) -> Seq(RegField(32,
RegReadFn(ready => {
when(ready) {
mem.io.addr := j.asUInt
mem.io.re := true.B
}
(true.B,dout.asUInt)
}),
RegWriteFn((valid,data) => {
when(valid) {
mem.io.addr := j.asUInt
mem.io.we := true.B
mem.io.din := data.asSInt
}
true.B
}),
RegFieldDesc(s"mem_${j}","")
))}
):_*)
现在这可行,但我不确定这是否是最好的方法(我的意思是向 regmap 添加内存)。有人可以就不同/更好的方法提出建议吗?
【问题讨论】:
-
你检查过凿子的 SyncReadMem 构造吗?
-
是的,我有,上面的代码 sn-p 中没有显示,但我确实使用它。它在 SinglePortMemory() 内存模块中使用。
标签: chisel rocket-chip