Diplomacyを使ってOCPバスを作成している。OCP SRAMの動作を確認しているが、どうも上手く動いていないようだ。Diplomacyの構成を確認している。SRAMは1サイクル後にReadデータが出てくるので、それに合わせてパイプを調整した。
val d_raw_data = Wire(Vec(4, UInt(8.W))) dontTouch(d_raw_data) val w_mem_read = in.cmd.fire() && in.cmd.bits.mcmd === OCPMessages.Read d_raw_data := mem.read(in.cmd.bits.address, w_mem_read) val r_resp_valid = Reg(Bool()) val r_resp_bits_tagId = Reg(UInt())
データは1サイクル後に出てくるのでそのまま接続するが、resp_valid
とresp_tagId
がその分1サイクル遅延を挿入している。
when (w_mem_read) { r_resp_valid := true.B r_resp_bits_tagId := in.cmd.bits.tagId } .otherwise { r_resp_valid := false.B r_resp_bits_tagId := 0.U } in.resp.valid := r_resp_valid in.resp.bits.data := Cat(d_raw_data.reverse) in.resp.bits.tagId := r_resp_bits_tagId
あとは、PatternPusher側でReadリクエストを出しているときはflight
信号をAssertして、その間は次のコマンドを出さないように調整した。
when ((cmd.fire() && cmd.bits.mcmd === OCPMessages.Write) || data.fire() || resp.fire() ) { step := step + UInt(1) } when (cmd.fire() && cmd.bits.mcmd === OCPMessages.Read) { flight := true.B } when (resp.fire()) { flight := false.B } ... cmd.valid := pvalid(step) && io.run && !flight && ready && !end cmd.bits := pbits(step) data.valid := wvalid(step) && io.run && ready && !end data.bits := wbits(step)
この状態でシミュレーションを行った。ちゃんと動作しているようだ。ここまでは良し。次に、機能の拡張や部品の追加を行っていく。