FPGA開発日記

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

2022-01-01から1年間の記事一覧

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

RISC-V VectorのAuto Vectorizationが生成するアセンブリコードを読み解く (Memory Copy)

RISC-Vベクトル命令の自動生成がかなりサマになってきた、という話を聞いたので、GCCのAutoVectorizationを見てみることにした。 使用したのは、RVVに対応したRISC-V GCCだ。 $ riscv64-unknown-elf-gcc --version riscv64-unknown-elf-gcc () 12.0.1 202205…

RISC-V Vector intrinsicのサンプルアプリケーションを解析する

RISC-V Vector Intrinsicのドキュメントでは、サンプルアプリケーションがいくつか格納されている。 https://github.com/riscv-non-isa/rvv-intrinsic-doc/tree/master/examples それぞれのアプリケーションにおいて、どのようにベクトル命令が使用されてい…

Googleのセキュリティにフォーカスした「KataOS」を触ってみる

Googleのリリースしたセキュリティを重視したオペレーティングシステムのKataOS、RISC-Vも視野に入れているということで面白そうなのでチェックしてみることにした。 https://opensource.googleblog.com/2022/10/announcing-kataos-and-sparrow.html まず、K…