下面是对accumulator模块的具体实现进行说明。
1、Accumulator
类AccumulatorExample,需要输入opcodes和n参数,里面使用new创建AccumulatorExampleModuleImp的对象。
class AccumulatorExample(opcodes: OpcodeSet, val n: Int = 4)(implicit p: Parameters) extends LazyRoCC(opcodes) {
override lazy val module = new AccumulatorExampleModuleImp(this)
}
class AccumulatorExampleModuleImp(outer: AccumulatorExample)(implicit p: Parameters) extends LazyRoCCModuleImp(outer)
with HasCoreParameters {
val regfile = Mem(outer.n, UInt(width = xLen))
val busy = Reg(init = Vec.fill(outer.n){
Bool(false)})
val cmd = Queue(io.cmd)
val funct = cmd.bits.inst.funct
val addr = cmd.bits.rs2(log2Up(outer.n)-1,0)
val doWrite = funct === UInt(0)
val doRead = funct === UInt(1)
val doLoad = funct === UInt(2)
val doAccum = funct === UInt(3)
val memRespTag = io.mem.resp.bits.tag(log2Up(outer.n)-1,0)
// datapath
val addend = cmd.bits.rs1
val accum = regfile(addr)
val wdata = Mux(doWrite, addend, accum + addend)
when (cmd.fire() && (doWrite || doAccum)) {
regfile(addr) := wdata
}
when (io.mem.resp.valid) {
regfile(memRespTag) :=

本文详细介绍了Accumulator模块的设计与实现,包括其Scala代码解析、RTL级代码修改及仿真验证过程,帮助读者理解该模块的功能及其实现细节。
最低0.47元/天 解锁文章
3628

被折叠的 条评论
为什么被折叠?



