前回、せっかくOCP PusherとOCP SRAMを作って接続してみたのだがなぜかOCP SRAMが途中で消されてしまいきちんとシミュレーションすることができていなかった。
FIR上ではマスターもスレーブも生成されているようなので最適化で消されている。最適化で消されているということは何らかの不具合で接続すべきところが接続されていないということだ。
色々と調査をしていると、どうもPusher側の実装を間違えていたことに気が付いた。Pusher側のData Read(Response)コマンドを扱いを間違えてコマンドバスを通じてデータを発行するように実装していたようだ。Responseバスを使うように変更すると正しく生成されるようになってきた。よしよし。
trait Pattern { def address: BigInt def size: Int def bits(edge: OCPEdgeOut): (Bool, OCPBundleCmd) def write_data(edge: OCPEdgeOut): (Bool, OCPBundleData) def dataIn: Option[BigInt] = None require ((address & ((BigInt(1) << size) - 1)) == 0) } case class WritePattern(address: BigInt, size: Int, data: BigInt) extends Pattern { require (0 <= data && data < (BigInt(1) << (8 << size))) def bits (edge: OCPEdgeOut) = edge.Write(0.U, address.U) def write_data (edge: OCPEdgeOut) = edge.WriteData(0.U, data.U) } case class ReadPattern(address: BigInt, size: Int) extends Pattern { def bits(edge: OCPEdgeOut) = edge.Read(0.U, address.U) def write_data (edge: OCPEdgeOut) = edge.WriteData(0.U, 0.U) } case class ReadExpectPattern(address: BigInt, size: Int, data: BigInt) extends Pattern { def bits(edge: OCPEdgeOut) = edge.Read(0.U, address.U) def write_data (edge: OCPEdgeOut) = edge.WriteData(0.U, 0.U) override def dataIn = Some(data) }
コマンドチャネルとデータチャネルはMasterとして動作し、レスポンスチャネルはスレーブとして動作する。
val (plegal, pbits) = pattern.map(_.bits(edgeOut)).unzip val (wlegal, wbits) = pattern.map(_.write_data(edgeOut)).unzip assert (end || plegal(step), s"Pattern pusher ${name} tried to push an illegal request") cmd.valid := io.run && ready && !end cmd.bits := pbits(step) data.valid := io.run && (cmd.bits.mcmd === OCPMessages.Write) && ready && !end data.bits := wbits(step)
昨日とグラフ的には全く一緒だな... 波形を確認してみる。
何となく動いてそうな...って全然正しく動いていない気がするぞ。デバッグしていこう。