FPGA開発日記

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

TileLinkのDiplomacyを使った実際のデザインを試してみる (5. TLXbarを使ったデザインを試す)

TileLinkを使ったDiplomacyのデザイン開発の続き、次は多少デザインを改造して、1つのマスター、1つのスレーブという形式から、2つのスレーブ、1つのマスターになるように改造する。

f:id:msyksphinz:20200102214205p:plain
2つのマスターを使ったデザイン

このようなデザインを作るためには、まずはTLXbarをインスタンス化する。そのあとにTLXbarに対してノードを接続するだけで完成するのだ。

  val fuzz1  = LazyModule(new TLFuzzer(txns))
  val fuzz2  = LazyModule(new TLFuzzer(txns))
  val model1 = LazyModule(new TLRAMModel("SRAMSimple"))
  val model2 = LazyModule(new TLRAMModel("SRAMSimple"))
  val ram    = LazyModule(new TLRAM(AddressSet(0x0, 0x3ff), beatBytes = ramBeatBytes))
  val xbar   = LazyModule(new TLXbar)
  xbar.node := TLDelayer(0.25) := model1.node := fuzz1.node
  xbar.node := TLDelayer(0.25) := model2.node := fuzz2.node

  ram.node := xbar.node

上記のように接続するだけで、RAMに対する2つのマスターの接続が完成する。

この:=演算子は、Chiselで使われる普通の演算子ではなく、Diplomacyのノードを接続するための演算子だ。これは以下のサイトを見れば分かる。

chipyard.readthedocs.io

このデザインからVerilogを生成してみた。あとはGraphMLを接続してノードの接続関係を確認する。

f:id:msyksphinz:20200102214307p:plain
2つのマスターを使ったデザインをGraphMLで表現する

次にこれをシミュレーションした。シミュレーションは一応正常終了している。IDの制御は上手く行っているようだ。

make tilelink
make[1]: Leaving directory '/home/msyksphinz/work/riscv/chisel-development/chisel-hw/generated-src-debug/freechips.rocketchip.unittest.TLOriginalUnitTestConfig'
./tilelink
Count = 1000
Count = 2000
Count = 3000
Count = 4000
Count = 5000
Count = 6000
Count = 7000

シミュレーション結果を確認した。

f:id:msyksphinz:20200102214418p:plain
2つのマスターを使ったデザインでRTLシミュレーションを実行する。

TLXBarを挿入することにより、IDが5ビットから6ビットに拡張されていることが確認できる。