FPGA開発日記

カテゴリ別記事インデックス https://msyksphinz.github.io/github_pages , English Version https://fpgadevdiary.hatenadiary.com/

Diplomacyを使ってOCPバスを作成する方法の検討(4. OCP Pusherの生成)

前回、せっかく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)
f:id:msyksphinz:20200122232209p:plain

昨日とグラフ的には全く一緒だな... 波形を確認してみる。

f:id:msyksphinz:20200122232238p:plain
OCP Diplomacyのシミュレーション結果。何かがおかしい。

何となく動いてそうな...って全然正しく動いていない気がするぞ。デバッグしていこう。