FPGA開発日記

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

Matrix Schedulerの論文読み直し (3. Picker)

自作CPUの命令発行スケジューラをMatrix Schedulerに置き換えたくて、論文を読み直している。 Matrix Schedulerは行列のサイズが、命令ウィンドウの数だけ必要 (ROB 32エントリ x 5命令だと160x160くらいの行列が必要?) というのが基本だと思っていて、これ…

Matrix Schedulerの論文読み直し (2. Issue Wakeup Matrix)

自作CPUの命令発行スケジューラをMatrix Schedulerに置き換えたくて、論文を読み直している。 Matrix Schedulerは行列のサイズが、命令ウィンドウの数だけ必要 (ROB 32エントリ x 5命令だと160x160くらいの行列が必要?) というのが基本だと思っていて、これ…

Matrix Schedulerの論文読み直し (1. Issue Wakeup Matrix)

自作CPUの命令発行スケジューラをMatrix Schedulerに置き換えたくて、論文を読み直している。 Matrix Schedulerは行列のサイズが、命令ウィンドウの数だけ必要 (ROB 32エントリ x 5命令だと160x160くらいの行列が必要?) というのが基本だと思っていて、これ…

自作CPUの各種コンフィグレーションでVivado論理合成試行

自作CPUで、いくつかのコンフィグレーションでVivadoの論理合成を試してみている。 コンフィグレーションの数自体は50種類くらいあるのだが、とりあえず論理合成の終わったものだけでグラフを作ってみた。 ちなみに、タイミングの設定方法は、なぜか制約が効…

自作CPUの割込みコントローラとISS一致検証タイミングの検討

自作CPUに対して割込みコントローラの実装をしているが、検証環境との調整でいくつか悩んでいる。 主に、CLINTなどの割込みコントローラの動作と、検証用シミュレータSpikeとのタイミングを合わせる方法だ。 何が問題か? CLINTが割り込みを挿入しても、次の…

RISC-VのCore Local Interrupt (CLINT)の仕様について調査 (3. CLINTのテストケースデバッグ)

自作CPUでのCLINTの実装をやりたくて、仕様を調査している。 とりえあずテストケースが完成したのでRTLシミュレーションで動かしてみているのだが、いくつか考えなければならないことがある。 まず、mtimeレジスタやメモリマップされた領域をアクセスしたと…

RISC-VのCore Local Interrupt (CLINT)の仕様について調査 (2. CLINTのテストケース作成)

自作CPUでのCLINTの実装をやりたくて、仕様を調査している。 テストケースを動かしてみたくて、いくつか調査していた。 とりあえずこちらのテストケースを移植してみることにした。かなりの数のincludeファイルが必要で、必要な部分だけ切り出している。 git…

rv8を解析してサイクル精度シミュレータSniperのログ表示を見やすくする

rv8はRISC-VのシミュレータやJITの機能を持つ豊富なツール群だ。命令デコーダも搭載されており、Sniperもrv8のデコーダ機能を使って命令デコードを行っている。 が、実はこの機能が少しややこしい。正しく命令追加をしようとすると、rv8の中に仕込まれている…

サイクル精度シミュレータSniperにおけるサイクル計算の方法調査

msyksphinz.hatenablog.com 前回のレジスタアクセスに応じてベクトル命令を分解する作業は、よく考えたら演算命令にも導入しなければならないのだった。 基本的には考え方は同じで、レジスタ書き込みを行った回数だけ命令を複製するので大丈夫だ。 std::vect…

RISC-VのアウトオブオーダCPUコアBOOMのMSHRを解き明かしたい

必要に迫られてRISC-VのアウトオブオーダプロセッサBOOMのMSHR周りの動作を見ていたのだが、どうにもChiselは柔軟に書けすぎて何が起きているのかよく掴めない。 分かるのはMSHRは2エントリ用意されているということ。これで間に合う? あと、MSHRはミスが発…

サイクル精度シミュレータSniperにおけるサイクル計算の方法調査

Instruction情報について sniper/common/performance_model/instruction.h class Instruction { public: Instruction(InstructionType type, OperandList &operands); Instruction(InstructionType type); virtual ~Instruction() { }; virtual SubsecondTim…

RISC-VのLinuxブート環境をbuildrootで構築する (12. initrdの導入)

RISC-VのLinuxブート環境を構築したので、次にこれをRTL環境で実行している。Linuxカーネルのブートはうまくいきそうなので、次にルートファイルシステムの読み込みに挑戦する。つまりrootfsの構築だ。 Initrdを導入して、ついにrootfsからファイルを取得す…

RISC-VのCore Local Interrupt (CLINT)の仕様について調査

自作CPUでのCLINTの実装をやりたくて、仕様を調査している。 一つは以下のドキュメントを確認している。 chromitem-soc.readthedocs.io 定義しないといけないレジスタは、MSIP, MTIME, MTIMECMPだ。 まずはソフトウェア割込みに関するレジスタはMSIPで、 Mac…

RISC-VブートのためのSpikeでの検証環境について (2. Linuxのブート環境を構築)

SpikeでBuildbootで生成したLinuxをブートするにあたり、Spikeでシミュレーションして動作を確認している。 SpikeでLinuxのブートを再現するためにはどうすればよいのか、調査している。 基本的に、SpikeにOpenSBIでのブートローダ、カーネル、rootfsを指定…

自作CPUのリグレッションテストをGitHub Actionsで行うための手法の調査 (2. 環境の更新)

自作CPUのリグレッションテストやCIをGitHub上で行いたくて、いくつか手法を調査している。 msyksphinz.hatenablog.com いくつかやり方を教えてもらって、結局以下のように落ち着いた。 .github/workflows/で記述しているrun-onはデフォルトで良い。containe…

WSL2でディスクが無くなった時の対処法 (DISKPARTでの削除方法)

どうも昔から疑問だったのが、WSL2上でdfコマンドで確認した空き容量と、Windowsのエクスプローラで確認するディスクの空き領域が異なっており、理由がわからんかった。 いよいよWindows側のディスク使用量が尽きてきたので、腰を据えて調べていたのだが、ど…

RISC-VのLinuxブート環境をbuildrootで構築する (11. initrdの導入)

RISC-VのLinuxブート環境を構築したので、次にこれをRTL環境で実行している。Linuxカーネルのブートはうまくいきそうなので、次にルートファイルシステムの読み込みに挑戦する。つまりrootfsの構築だ。 まずはSpikeで同じことができる必要がある。Spikeでini…

サイクル精度シミュレータSniperにおけるサイクル精度の調査

div命令のトレースを表示させてみると、Issue後に時間がかかっているのではなくて、Dispatchをずっと待っているような状態に見えている。 divのレイテンシ計算部分、これがgetInstructionLatency(68) = 1になっているのがそもそもおかしい。 disassembly : d…

自作CPUのリグレッションテストをGitHub Actionsで行うための手法の調査

自作CPUのリグレッションテストやCIをGitHub上で行いたくて、いくつか手法を調査している。 1つの手法としては、Dockerfileを使ってリグレッション環境を構築する。Dockerイメージ上にRISC-VツールチェインとVerilatorをインストールしておく。これをDockerH…

Andes TechnologyのAX65 RISC-Vアウトオブオーダプロセッサ

Andesが発表したAX65 RISC-Vアウトオブオーダプロセッサについて。 https://www.andestech.com/en/2022/11/02/andes-technology-unveils-the-andescore-ax60-series-an-out-of-order-superscalar-multicore-risc-v-processor-family/ 4ウェイスーパスカラア…

RISC-VのLinuxブート環境をbuildrootで構築する (10. RMW命令周辺の修正)

RISC-VのLinuxブート環境を構築したので、次にこれをRTL環境で実行している。 別のコンフィグレーションで実行するとLinuxのブート途中で止まってしまった。これはLR/SCの更新論理がLSUのパイプラインの別々のところにあることによるものだった。 LSU0のLR/S…

RISC-VのLinuxブート環境をbuildrootで構築する (9. デバッグとLinuxブート成功)

RISC-VのLinuxブート環境を構築したので、次にこれをRTL環境で実行している。 いくつかデバッグして、最終的にLinuxブートに成功した。最終的にKernel Panicで終了したが、これはrootfsがつながっていないことによるらしい。 ここから先どうやって環境構築す…

RISC-V OoOコアであるBOOMのChicken Bitを使うための試行

RISC-VのOut-of-orderedコアであるBOOMの詳細を少し調べていたのだが、Chicken Bitというのがある。 どうもアウトオブオーダ実行を止めることができる機能らしい。 と思ったら、あれ?違うかな。完全にPipelineをクリアしながら進めるのか。じゃあInOrderよ…

サイクル精度シミュレータSniperでLoad命令のレイテンシを調査する

サイクル精度シミュレータSniperは、トレースファイルをベースとしたサイクル精度解析シミュレータだ。 RISC-Vのサポートにおいては、SpikeからSIFTファイルを生成し、それをSniperに加えることでサイクル計算を行う。 In-orderモードでパイプラインを解析す…

サイクル精度シミュレータSniperでRegion of Interestの領域をベンチマーク側から設定する方法

サイクル精度シミュレータSniperは、トレースファイルをベースとしたサイクル精度解析シミュレータだ。 RISC-Vのサポートにおいては、SpikeからSIFTファイルを生成し、それをSniperに加えることでサイクル計算を行う。 特定の領域のみのサイクル情報を取得し…

サイクル精度シミュレータSniperでIn-order / Out-of-orderモードでサイクル数の変化を観測する

サイクル精度シミュレータSniperは、トレースファイルをベースとしたサイクル精度解析シミュレータだ。 RISC-Vのサポートにおいては、SpikeからSIFTファイルを生成し、それをSniperに加えることでサイクル計算を行う。 いろいろ設定を見てみると、In-orderモ…

RISC-VのFPU命令がIllegal命令例外を発生した場合に何を確認すべきか

まあ自分用のメモというか、失敗記録なのだけれども。 例えば、以下のfcvt命令が急に命令例外を出した。SpikeのConfigurationはRV64GCにしているので間違いない。どこを確認すべきか? core 0: 3 0x0000000080000e52 (0x20278bd3) f23 0xffffffff5f800000 co…

RISC-V Vectorized Bencmark Suiteのコンパイルとシミュレーション方法

RiVec、つまりRISC-V Vectorized Bencmark SuiteはベンチマークスイートをRISC-Vベクトル向けに移植したベンチマークスイートだ。 メインリポジトリのRiVecはバージョンが古くてRVV1.0のintrinsicではコンパイルすることができない。 Pull Requsetを観察して…

RISC-Vのランダムテストジェネレータ AAPGを試す (5. FPUの命令系統をチェックする)

AAPGを久しぶりに触っている。久しぶりにテストパタンを動かして問題ないことを確認したので、もうちょっと命令範囲を拡張することにした。 https://gitlab.com/shaktiproject/tools/aapg FPU系の命令でバグがちょいちょい見つかっている。riscv-testsでカバ…

RISC-Vのランダムテストジェネレータ AAPGを試す (4. RISC-V命令拡張を試す)

AAPGを久しぶりに触っている。久しぶりにテストパタンを動かして問題ないことを確認したので、もうちょっと命令範囲を拡張することにした。 https://gitlab.com/shaktiproject/tools/aapg 現時点ではAAPGはFPU/RMW命令を生成するようになっていない。config.…