FPGA開発日記

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

2020-01-01から1ヶ月間の記事一覧

Digital Design with ChiselのSecond Editionが正式発行

Digital Design with Chiselはハードウェア記述言語Chiselについて書かれた解説書だ。 英語で書かれてはいるがおそらく世界で最初に出版されたChiselに関する技術書で、Chisel初心者にとって分かりやすく詳しく書かれている。 msyksphinz.hatenablog.com 去…

RISC-V Bit-Manipulation命令を自作RISC-Vシミュレータに実装解説 (1. 命令デコーダの実装)

Bit Manipulation 仕様書から抜粋 RISC-Vの命令エンコーディングのなかで、Bit-Manipulationはある程度仕様が固まってきている。 命令フォーマットは以下のドキュメントに記載されている。 github.com これをひたすら自作シミュレータの命令デコードJSONファ…

自作RISC-VシミュレータにBitManipulation命令拡張を実装した

自作RISC-VシミュレータにBit-Manipulationの機能を実装した。すべてのテストセットがPasssすることを確認した。 github.com Bit-Manipulationの機能は、仕様書November 30, 2019を参考にした。 github.com テストを含めてツールセットの準備はすべてこのris…

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

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

「Chiselを始めたい人に読んで欲しい本」を購入しました

おそらく日本語で唯一ともいえるChiselだけを扱った書籍「Chiselを始めたい人に読んで欲しい本」を購入しました。 ここまでChiselについて集中的に扱っている書籍は私も見たことが無くて、英語だと"Digital Design with Chisel"くらいだと思う。 github.com …

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.…

FIRRTLに入門する (23. 多次元配列の出力時のループ展開の調整(2))

前回まででループ展開の問題に対してある程度解決の目途が立った。しかしまだ調整できていない部分がある。 ExpandWhesによりデフォルト値が挿入されるのだが、これはなぜかというとポートであるoutと記述とout.a[0], out.a[1], out.a[2], out.a[3]がずれて…

FIRRTLに入門する (23. 多次元配列の出力時のループ展開の調整)

前回の実装で、配列に関する実装は以下のようになっていた。以下のFIRコードをコンパイルすると、Verilogファイルが生成されるのだが、 module VecBundle9 : input in: { a : { b : { c : UInt<8>[4] } [8] } [16] }[32] input sel1: UInt<5> input sel2: UI…

FIRRTLに入門する (22. 多次元配列の構造体に関するSystemVerilog出力の修正)

前回までで多次元構造体配列について、とりあえずエラーが出ずにVerilogが生成されるようになったが、生成されたSystemVerilogのコードは明らかにおかしい。 circuit VecBundle1 : module VecBundle9 : input in: { a : { b : { c : UInt<8>[4] } [8] } [16]…

TileLinkのDiplomacyを使った実際のデザインを試してみる

TileLinkはDiplomacyという方式を使って実装されており、それを理解するのは大変だ。実際に触ってみるのが一番良い気がする。 という訳で、RocketChipの中でTileLinkのユニットテストを行っているデザインを抽出して実行してみた。 使用したのは、RocketChip…

TileLinkの勉強 (3. Chipyardのリファレンスを読む)

前回の続き。 Chipyardのリファレンスは比較的詳しく書いてあると思うので、この資料を読みながらDiplomacyの勉強をしていこうと思う。 chipyard.readthedocs.io Diplomacyコネクタ Diplomacyのグラフは互いにエッジを使って接続されている。Diplomacyのライ…

RISC-Vのベクトル拡張命令の仕様書日本語版を最新仕様v0.8にアップデートした

https://msyksphinz-self.github.io/riscv-v-spec-japanese/html/index.html 結構昔にRISC-V Vector Extensionの仕様を日本語化したものを公開していたのだが、公開して移行全くアップデートしていなかったので最新仕様に対応すべく修正を行った。 前回の公…

TileLinkの勉強 (2. Chipyardのリファレンスを読む)

前回の続き。 Chipyardのリファレンスは比較的詳しく書いてあると思うので、この資料を読みながらDiplomacyの勉強をしていこうと思う。 chipyard.readthedocs.io 9.1.4. 識別ノード 識別ノード これまでのノードは入力もしくは出力が定義されていたが、識別…

TileLinkの勉強 (1. Chipyardのリファレンスを読む)

SiFive社のCPUおよびRocketChipには、バスとしてTileLinkおよびDiplomacyが使用されている。 TileLinkはバスプロトコルなので良いとして、Diplomacyの理解は非常に難解だ。私もまだ完全に理解できていない。 Chipyardのリファレンスは比較的詳しく書いてある…

「驚異の量子コンピュータ 宇宙最強マシンへの挑戦」を読んだ

量子コンピュータに関する本は久しぶりに読んだ。最近量子コンピュータ関係はあまり手を付けることができていなかったので復習の意味を込めて読了。 読み物として非常に面白かった。 量子コンピュータの発展の歴史と、その基礎的な技術と考え方について初心…

XMLとStemsを使ってVerilatorのRTLシミュレーション結果をGtkWaveでアノテーション表示する方法

VerilatorはVerilogをコンパイルしてシミュレーションするためのツールだが、波形ログとしてはVCDやFSTなどを出力することができる。VCDはかなり昔から使われている波形保存のためのフォーマット、FSTはVCDと違って圧縮されたより高速アクセスを実現するため…

FIRRTLに入門する (21. 多次元配列及び構造体に関する処理の検討(3))

前回までの多次元構造体の処理を見直して、もう少し簡単になるんじゃないかということで作り直した。基本的な考え方は以下の通りだ。 SubField(構造体のメンバへのアクセス)が発生すると、WSubFieldの構造を取り除き、WRefと足し込む名前(ex.name)を記憶して…

FIRRTLに入門する (20. 多次元配列及び構造体に関する処理の検討(2))

前回、多次元配列をそのままChiselで扱うためにはどうすればよいか考えたが、さらにまだ考えないといけないことがある。さらに、以下のような構文について考えた。 circuit VecBundle2 : module VecBundle2 : input in: { a : { b : UInt<8>[2] } [3] }[4] i…

FIRRTLに入門する (19. 多次元配列及び構造体に関する処理の検討)

前回、多次元配列をそのままChiselで扱うためにはどうすればよいか考えたが、さらにまだ考えないといけないことがある。これに、構造体が入ってきた場合はどうするか、ということだ。つまり、以下のようなコードを考える。 circuit VecBundle2 : module VecB…

FIRRTLのSystemVerilog変換までのフローを調査する。

FIRRTLの変換フローについて調査した。ソースコードを読みながら各Passが何を実行しているのかを確認していく。 実行方法としては、 ./utils/bin/firrtl -td regress -i ./regress/simple_test.fir -X sverilog -ll trace 2>&1 | tee simple_test.log として…

FIRRTLのFIRノード種類一覧

FIRRTLのLowerTypeで使われるExpression, Statementの種類について纏めておく。 src/main/scala/firrtl/passes/LowerTypes.scala src/main/scala/firrtl/ir/IR.scala github.com 特に迷ったのは、WSubIndexとWSubAccessの違い。WSubIndexはインデックスが固…

Scalaのvar型を使用したChiselの記述量削減テクニック

Scalaにはval型とvar型という2種類の型の種類が存在する。var型は再割り当て可能, val型は再割り当て不可能な型というもので、要するに、 var型 : 処理の中で何度も書き換えができる。 val型 : 処理の中で一度しか書き換えることができない。 というものだ。…