FPGA開発日記

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

Chisel

Diplomacyを使ってOCPバスを作成する(15. Xbarの理解2)

TileLinkのXbarの仕組みを引き続き解析している。requestAIOの解析の続き。縦方向がマスター側、横方向がスレーブ側である。下記の図において、A(n, m)=1の場合はマスターnがマスターmにリクエスト要求を出していることを意味する。 A(n,m) = 1 : マスターn…

Diplomacyを使ってOCPバスを作成する(14. Xbarの理解)

DiplomacyのXbarについて理解を深めるためにソースコードを読んでみよう。とりまOCPの実装をしたいのだが、何せ内部を理解しないとどうも改造できそうにない気がしてきた。どうにかしてソースコードを理解しなければ。 NexusNodeについて NexusNodeは複数のS…

Diplomacyを使ってOCPバスを作成する(13. Xbarの作成を行う2)

Diplomacyを使ったOCPプロトコルの作成、Xbarをもう少し拡張させてみよう。複数のマスターに対して1つのスレーブを接続する。 val pusher1 = LazyModule(new OCPPatternPusher("pat1", Seq( new WriteReqPattern (0, 0x100, 0x2), new WriteDataPattern (0, …

Diplomacyを使ってOCPバスを作成する(12. Xbarの作成を行う)

Diplomacyを使ったOCPプロトコルの作成、次にXbarの作成を行う。Xbarというのはクロスバで、複数のマスターとスレーブを接続する。まずは1マスターから複数スレーブに向けて接続する回路を作成する。 Diplomacyのクロスバの考え方はこうだ。まずはすべてのマ…

Diplomacyを使ってOCPバスを作成する(11. インタフェースのデバッグ)

Diplomacyを使ったOCPプロトコルの作成、Bufferのデバッグを行っているが、どうも良く分からないところがある。 例えばBufferのインタフェースにQueueを挿入せずにそのまま接続しようとした場合、以下のようなエラーが発生してしまう。 val ram0 = LazyModul…

Diplomacyを使ってOCPバスを作成する (10. OCP Bufferの動作確認)

Diplomacyを使って独自OCPバスの作成を行っているのだが、どうも上手く行かない。いきなりXbarを作るのはさすがに難易度が高かったか。とりあえずまずはBufferだけを作って動作を確認する。 Bufferは、単純に信号を右から左に渡すだけの機能だ。ただ渡すだけ…

Diplomacyを使ってOCPバスを作成する (9. Xbarの作成)

Diplomacyを使ってOCPバスを作成するプロジェクト、次はクロスバーを作成してみよう。クロスバーは2つ以上のスレーブノードを接続してバスをスプリットする。 val ram0 = LazyModule(new OCPRAM(AddressSet(0x000, 0x3ff))) val ram1 = LazyModule(new OCPRA…

Diplomacyを使ってOCPバスを作成する (8. PatternPusherの改良)

前回はDiplomacyを使ったOCPバスの作成で、Bundleを作成してValid/Readyの信号をCmd/Readyに変換した。次はこれに基づいてテスト環境を構築する。テスト環境ではまずはPatternPusherを使ってコマンドを挿入する。まずはPatternPusherを改造しなければ始まら…

Diplomacyを使ってOCPバスを作成する(7. Bundleの改善)

これまでDiplomacyを使ってOCPバスを作ってきたが、まだ改善したいところがある。まずは OCPバスなのにコマンドチャネルにValid信号がある。 各種コマンドをサポートしていきたい。 特にValid信号は大きな問題だ。OCPはCommand ⇔ Ready信号のハンドシェーク…

Diplomacyを使ってOCPバスを作成する(6. Delayerの実装)

Diplomacyを使ってOCPバスを作成している。OCP SRAMの動作を確認しつつ、OCPのDelayerを実装しようと思う。DelayerというのはバスのReady信号を遅らせて、信号を遅らせてバスの問題を検出するための機能だ。 TileLinkのDelayerはすでに実装されている。これ…

Diplomacyを使ってOCPバスを作成する(5. OCP SRAMのデバッグ)

Diplomacyを使ってOCPバスを作成している。OCP SRAMの動作を確認しているが、どうも上手く動いていないようだ。Diplomacyの構成を確認している。SRAMは1サイクル後にReadデータが出てくるので、それに合わせてパイプを調整した。 val d_raw_data = Wire(Vec(…

OCP Pattern PusherのデバッグとOCP コマンド発行のためのクラスの確認

OCP Pattern Pusherのデバッグをしながら、Diplomacyの構築に必要なクラスの構成について見ていこう。 OCP Pattern PusherではDiplomacyのノードが定義され、出力ノードに対してコマンドが発行されている。 TileLinkのDiplomacyノード構成 上記の図ではTileL…

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

前回、せっかくOCP PusherとOCP SRAMを作って接続してみたのだがなぜかOCP SRAMが途中で消されてしまいきちんとシミュレーションすることができていなかった。 FIR上ではマスターもスレーブも生成されているようなので最適化で消されている。最適化で消され…

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

Diplomacyを使ってOCPのバスを作成するプロジェクト。PatternPusherウィジェットの次はSRAMを作成する。SRAMを定義することでクライアントとマネージャの両方を定義することで、やっと回路を構築することができるようになる。OCPのSRAMを定義してみよう。 SR…

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

Diplomacyを使ってOCPのバスを作成するプロジェクト。 バスの定義があってもまずはウィジェットが無いと始まらない。 OCPウィジェットのPatternPusherを作成する。 PatternPusherはOCPのマスター(OCPClientNode)として働く。TileLinkにもPatternPusherがある…

Diplomacyを使ってOCPバスを作成する方法の検討

DiplomacyにはTileLinkのウィジェット、AMBA(AXI4, APB, AHB)のウィジェットがあり、これらを自由に組み合わせてタイルを構成することができる。これがDiplomacyのメリットであり、これらの部品を使ってアジャイルにSoCバスを構成することができる。 これま…

Diplomacyを使ってAXI4スレーブを接続する回路を作成する

Diplomacyのマスターとスレーブを作れるようになったので、次はAXI4を使ってみる。Diplomacyの部品にはAXI4の部品もそろっており、それ以外にもAHB、APBのDiplomacyの部品も用意されている。 rocketchip/src/main/scala ├── amba │ ├── ahb │ ├── apb │ └── …

Diplomacyを使って独自のTileLinkマスターノードを作成してみる

Diplomacyのスレーブノードに続いて、今度はマスターノードを作成してみる。マスターノードには以下の機能を持たせようと思う。 アドレスをインクリメントさせながら特定のデータを16回書き込むリクエストを発行する。 アドレスを元に戻す。 アドレスをイン…

Diplomacyを使って独自のTileLinkスレーブノードを作成してみる

ここらで、Diplomacyを使った独自のTileLinkスレーブノードを作成してみよう。作成するのはTileLinkのスレーブノードで、書き込みを行うとそのデータの分だけ加算するレジスタを持つ。とりあえずRTLを生成できるように持って行きたい。 作成するノード形態と…

TileLinkのDiplomacyデザインの解析 (2. TileLinkのSourceIdの計算方法について)

Diplomacyを使ったデザインでは、クロスバーを使って自由にバスを構成することができる。この場合のバスのIDは自動的に計算されるようになっている。例えば、クロスバーに対して4つのマスターが接続される場合、そしてそのマスターのIDのビット幅が最大で3ビ…

TileLinkのDiplomacyデザインの解析 (1. AddressDecoderによるアドレス重複チェック)

Diplomacyを使ったバスの設計では、Chiselの機能を使って設計段階で様々な問題を事前にチェックすることができる。例えば、スレーブノード(Managerノード)のアドレスマップが被っているかどうかをチェックすることができる。 例えば以下のデザインで、TLRAM…

TileLinkのDiplomacyを使った実際のデザインを試してみる (7. TLXbarによる複数のスレーブを使ったデザイン)

次に作るのは、TLXbarを使って2つのスレーブを使ったデザインだ。2つのスレーブを接続することで、例えば2つのRAMを使ってスレーブに接続できるようになる。 ターゲット回路 例えば、以下のようなデザインを作成した。 class TLTwoRAM(ramBeatBytes: Int, tx…

TileLinkのDiplomacyを使った実際のデザインを試してみる (6. TLPatternPusherを使ったテストベンチの作成)

前回までのデザインでは、Fuzzerと呼ばれるランダムテストパタンを使っていたが、これでは思うように制御ができない。いろいろと調べているとTLPatternPusherを使うと制御できそうだ。この使い方を調べてみよう。 TLPatternPusherとは TLPatternPusherはTile…

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

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

TileLinkのDiplomacyを使った実際のデザインを試してみる (4. TileLinkのDiplomacyデザインをRTLシミュレーションする環境を整える)

前回、Diplomacyを使ったデザインを作成し、Verilogの生成まで完了した。次に、RTLシミュレーションを行うための環境を整えていく。 RTLシミュレーションにはVerilatorを使用する。VerilatorはRocket-Chipの環境を使用する。 Rocket-ChipにはVerilatorを自動…

TileLinkのDiplomacyを使った実際のデザインを試してみる (3. Diplomacyを使ってバスシステムのカスタマイズにトライ)

TileLinkの生成フローについて調査を進めている。まずはTileLinkを使った独自のデザインを生成する環境を整えていく。 class TLOriginalRAMSimple(ramBeatBytes: Int, txns: Int)(implicit p: Parameters) extends LazyModule { val fuzz = LazyModule(new T…

TileLinkのDiplomacyを使った実際のデザインを試してみる (2. オリジナルのデザインを作り込む)

TileLinkを使ったデザインを作っていきたい。Diplomacyについて勉強を進めていくなかで、やはり自分でデザインを作ってどの程度コントロールできるのか確認していく。オリジナルのデザインを作り上げていこう。 まず理解しておかなければならないのは、Diplo…

TileLinkの勉強 (5. Diplomacyがサポートするウィジェットについて(2))

前回の続き。 Chipyardのリファレンスは比較的詳しく書いてあると思うので、この資料を読みながらDiplomacyの勉強をしていこうと思う。 chipyard.readthedocs.io 今回はDiplomacyがサポートするウィジェットについて。AXI4とTileLinkについて様々なウィジェ…

TileLinkの勉強 (4. Diplomacyがサポートするウィジェットについて)

前回の続き。 Chipyardのリファレンスは比較的詳しく書いてあると思うので、この資料を読みながらDiplomacyの勉強をしていこうと思う。 chipyard.readthedocs.io 今回はDiplomacyがサポートするウィジェットについて。AXI4とTileLinkについて様々なウィジェ…

FIRRTLに入門する (24. FIRRTLにおけるメモリの生成を調査する)

$ sbt assembly && ./utils/bin/firrtl -td regress -i ./regress/ICache.fir -X sverilog -ll trace 2>&1 | tee ICache.log ======== Starting Transform CheckInitialization$ ======== Exception in thread "main" firrtl.passes.PassExceptions: firrtl.…