2020-01-01から1ヶ月間の記事一覧
Digital Design with Chiselはハードウェア記述言語Chiselについて書かれた解説書だ。 英語で書かれてはいるがおそらく世界で最初に出版されたChiselに関する技術書で、Chisel初心者にとって分かりやすく詳しく書かれている。 msyksphinz.hatenablog.com 去…
Bit Manipulation 仕様書から抜粋 RISC-Vの命令エンコーディングのなかで、Bit-Manipulationはある程度仕様が固まってきている。 命令フォーマットは以下のドキュメントに記載されている。 github.com これをひたすら自作シミュレータの命令デコードJSONファ…
自作RISC-VシミュレータにBit-Manipulationの機能を実装した。すべてのテストセットがPasssすることを確認した。 github.com Bit-Manipulationの機能は、仕様書November 30, 2019を参考にした。 github.com テストを含めてツールセットの準備はすべてこのris…
Diplomacyを使ったバスの設計では、Chiselの機能を使って設計段階で様々な問題を事前にチェックすることができる。例えば、スレーブノード(Managerノード)のアドレスマップが被っているかどうかをチェックすることができる。 例えば以下のデザインで、TLRAM…
おそらく日本語で唯一ともいえるChiselだけを扱った書籍「Chiselを始めたい人に読んで欲しい本」を購入しました。 ここまでChiselについて集中的に扱っている書籍は私も見たことが無くて、英語だと"Digital Design with Chisel"くらいだと思う。 github.com …
次に作るのは、TLXbarを使って2つのスレーブを使ったデザインだ。2つのスレーブを接続することで、例えば2つのRAMを使ってスレーブに接続できるようになる。 ターゲット回路 例えば、以下のようなデザインを作成した。 class TLTwoRAM(ramBeatBytes: Int, tx…
前回までのデザインでは、Fuzzerと呼ばれるランダムテストパタンを使っていたが、これでは思うように制御ができない。いろいろと調べているとTLPatternPusherを使うと制御できそうだ。この使い方を調べてみよう。 TLPatternPusherとは TLPatternPusherはTile…
TileLinkを使ったDiplomacyのデザイン開発の続き、次は多少デザインを改造して、1つのマスター、1つのスレーブという形式から、2つのスレーブ、1つのマスターになるように改造する。 2つのマスターを使ったデザイン このようなデザインを作るためには、まず…
前回、Diplomacyを使ったデザインを作成し、Verilogの生成まで完了した。次に、RTLシミュレーションを行うための環境を整えていく。 RTLシミュレーションにはVerilatorを使用する。VerilatorはRocket-Chipの環境を使用する。 Rocket-ChipにはVerilatorを自動…
TileLinkの生成フローについて調査を進めている。まずはTileLinkを使った独自のデザインを生成する環境を整えていく。 class TLOriginalRAMSimple(ramBeatBytes: Int, txns: Int)(implicit p: Parameters) extends LazyModule { val fuzz = LazyModule(new T…
TileLinkを使ったデザインを作っていきたい。Diplomacyについて勉強を進めていくなかで、やはり自分でデザインを作ってどの程度コントロールできるのか確認していく。オリジナルのデザインを作り上げていこう。 まず理解しておかなければならないのは、Diplo…
前回の続き。 Chipyardのリファレンスは比較的詳しく書いてあると思うので、この資料を読みながらDiplomacyの勉強をしていこうと思う。 chipyard.readthedocs.io 今回はDiplomacyがサポートするウィジェットについて。AXI4とTileLinkについて様々なウィジェ…
前回の続き。 Chipyardのリファレンスは比較的詳しく書いてあると思うので、この資料を読みながらDiplomacyの勉強をしていこうと思う。 chipyard.readthedocs.io 今回はDiplomacyがサポートするウィジェットについて。AXI4とTileLinkについて様々なウィジェ…
$ 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.…
前回まででループ展開の問題に対してある程度解決の目途が立った。しかしまだ調整できていない部分がある。 ExpandWhesによりデフォルト値が挿入されるのだが、これはなぜかというとポートであるoutと記述とout.a[0], out.a[1], out.a[2], out.a[3]がずれて…
前回の実装で、配列に関する実装は以下のようになっていた。以下のFIRコードをコンパイルすると、Verilogファイルが生成されるのだが、 module VecBundle9 : input in: { a : { b : { c : UInt<8>[4] } [8] } [16] }[32] input sel1: UInt<5> input sel2: UI…
前回までで多次元構造体配列について、とりあえずエラーが出ずにVerilogが生成されるようになったが、生成されたSystemVerilogのコードは明らかにおかしい。 circuit VecBundle1 : module VecBundle9 : input in: { a : { b : { c : UInt<8>[4] } [8] } [16]…
TileLinkはDiplomacyという方式を使って実装されており、それを理解するのは大変だ。実際に触ってみるのが一番良い気がする。 という訳で、RocketChipの中でTileLinkのユニットテストを行っているデザインを抽出して実行してみた。 使用したのは、RocketChip…
前回の続き。 Chipyardのリファレンスは比較的詳しく書いてあると思うので、この資料を読みながらDiplomacyの勉強をしていこうと思う。 chipyard.readthedocs.io Diplomacyコネクタ Diplomacyのグラフは互いにエッジを使って接続されている。Diplomacyのライ…
https://msyksphinz-self.github.io/riscv-v-spec-japanese/html/index.html 結構昔にRISC-V Vector Extensionの仕様を日本語化したものを公開していたのだが、公開して移行全くアップデートしていなかったので最新仕様に対応すべく修正を行った。 前回の公…
前回の続き。 Chipyardのリファレンスは比較的詳しく書いてあると思うので、この資料を読みながらDiplomacyの勉強をしていこうと思う。 chipyard.readthedocs.io 9.1.4. 識別ノード 識別ノード これまでのノードは入力もしくは出力が定義されていたが、識別…
SiFive社のCPUおよびRocketChipには、バスとしてTileLinkおよびDiplomacyが使用されている。 TileLinkはバスプロトコルなので良いとして、Diplomacyの理解は非常に難解だ。私もまだ完全に理解できていない。 Chipyardのリファレンスは比較的詳しく書いてある…
量子コンピュータに関する本は久しぶりに読んだ。最近量子コンピュータ関係はあまり手を付けることができていなかったので復習の意味を込めて読了。 読み物として非常に面白かった。 量子コンピュータの発展の歴史と、その基礎的な技術と考え方について初心…
VerilatorはVerilogをコンパイルしてシミュレーションするためのツールだが、波形ログとしてはVCDやFSTなどを出力することができる。VCDはかなり昔から使われている波形保存のためのフォーマット、FSTはVCDと違って圧縮されたより高速アクセスを実現するため…
前回までの多次元構造体の処理を見直して、もう少し簡単になるんじゃないかということで作り直した。基本的な考え方は以下の通りだ。 SubField(構造体のメンバへのアクセス)が発生すると、WSubFieldの構造を取り除き、WRefと足し込む名前(ex.name)を記憶して…
前回、多次元配列をそのままChiselで扱うためにはどうすればよいか考えたが、さらにまだ考えないといけないことがある。さらに、以下のような構文について考えた。 circuit VecBundle2 : module VecBundle2 : input in: { a : { b : UInt<8>[2] } [3] }[4] i…
前回、多次元配列をそのままChiselで扱うためにはどうすればよいか考えたが、さらにまだ考えないといけないことがある。これに、構造体が入ってきた場合はどうするか、ということだ。つまり、以下のようなコードを考える。 circuit VecBundle2 : module VecB…
FIRRTLの変換フローについて調査した。ソースコードを読みながら各Passが何を実行しているのかを確認していく。 実行方法としては、 ./utils/bin/firrtl -td regress -i ./regress/simple_test.fir -X sverilog -ll trace 2>&1 | tee simple_test.log として…
FIRRTLのLowerTypeで使われるExpression, Statementの種類について纏めておく。 src/main/scala/firrtl/passes/LowerTypes.scala src/main/scala/firrtl/ir/IR.scala github.com 特に迷ったのは、WSubIndexとWSubAccessの違い。WSubIndexはインデックスが固…
Scalaにはval型とvar型という2種類の型の種類が存在する。var型は再割り当て可能, val型は再割り当て不可能な型というもので、要するに、 var型 : 処理の中で何度も書き換えができる。 val型 : 処理の中で一度しか書き換えることができない。 というものだ。…