FPGA開発日記

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

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

RISC-VのPLICのためのテストケースを作って、Spikeとの一致検証環境を構築する

msyksphinz.hatenablog.com msyksphinz.hatenablog.com msyksphinz.hatenablog.com 前回までで、Spikeを解析した結果PLICのメモリマップを確保する必要があること、そして、PLICの簡単なデバイスを作成してSpikeに登録してやる必要があることが分かった。 と…

自作CPUにMatrix Schedulerを導入した場合の変更量について考える

まあいつかの段階で自作CPUのスケジューラを変更しようと思っているのだが、これをどのようにしようかいろいろ思いを巡らせている。 アウトオブオーダのフロントエンドはあまり得意ではないので、どうやって作ればいいのか悩んでいる。 現在の実装 Issue Uni…

RISC-VのPLICのためのテストケースを作って、Spikeの挙動を解析する

msyksphinz.hatenablog.com msyksphinz.hatenablog.com 前回まででPLICについては結構仕様を勉強して、じゃあ次にRTLを作ってみて、テストしてみようということになったのだが、 とりあえず簡単なテストを動かしてみたい。PLICのメモリマップは0xc00_0000な…

DIGITAL ELECTRONICS NOTESをやってみる (3. グレイコード)

以下のデジタル回路の問題をやってみる。続き。 lancamentomerlo.my.canva.site Q: グレイコード11001をバイナリコードに変換してください。 やり方としては、まずMSBの1を保持し、上位ビットから順番に次のビットとのXORを取っていく。 4 3 2 1 0 // bit-po…

DIGITAL ELECTRONICS NOTESをやってみる (2. 符号に関するクイズ)

以下のデジタル回路の問題をやってみる。続き。 lancamentomerlo.my.canva.site パリティビットとはどのようなもので、どのように計算されるのか? パリティビットは、2進コードの文字列の末尾に付加されるビットで、文字列中の値「1」を持つビットの数が偶…

「プログラマーのためのCPU入門」を買いました

面白そうなので買ってみました。物理本は送料が意外と高かったので電子書籍版を買いました。 https://www.lambdanote.com/products/cpu プログラマーのためのCPU入門 ― CPUは如何にしてソフトウェアを高速に実行するかwww.lambdanote.com ざっくりと眺めまし…

サイクル精度シミュレータSniperでRegion of Interest(ROI)を設定するための手法の調査

サイクル精度シミュレータSniperでは、計測範囲を指定する用語としてROI(Region of Interest)というものがある。 通常、サイクル数などはこの範囲を計測するのだが、これを取得する方法はいくつかあって、Sniperは基本的にC言語用のマクロを用意している。 g…

RISC-VのPlatform Level Interrupt Controller(PLIC)の構造について (2. 仕様書を読み解く)

以下のPLICのオープンソース実装を使って自作CPUに接続していたのだが、どうもメモリマップが違う気がする。 かなり古い実装なので、現在の仕様と違うのはやむなしか... github.com なんか結局は自分で実装しなければならないような気がしているので、一生懸…

RISC-VのPlatform Level Interrupt Controller(PLIC)の構造について (1. 仕様書を読み解く)

以下のPLICのオープンソース実装を使って自作CPUに接続していたのだが、どうもメモリマップが違う気がする。 かなり古い実装なので、現在の仕様と違うのはやむなしか... github.com なんか結局は自分で実装しなければならないような気がしているので、一生懸…

LiteXによるSoC環境構築を試行する (PLICの接続作業)

PLICの接続について、ひたすらバスをつなげて実装している。とりあえずコンパイルが通るようになったが、 まだシミュレーションが止まってしまうので、波形を見て要解析だな... [serial2console] loaded (0x55e25615cef0) [gmii_ethernet] loaded (0x55e2561…

DIGITAL ELECTRONICS NOTESをやってみる

以下のデジタル回路の問題をやってみる。 あんまり時間がないので、DeepLで翻訳してメモしてみようかな。 lancamentomerlo.my.canva.site Q1. ある数体系から他の数体系への変換 16進数の0x3Aは10進数で何ですか? 10進数以外の数字から10進数への変換は、次…

LiteXによるSoC環境構築を試行する (シリアルコンソールの解析)

シリアルコンソールが反応しない問題、FSTを吐いているときに、前回間違ってfstのdump()を入れてしまっており 処理が非常に遅くなってしまっていた。dump()を解除するとFSTを取得しながらキーボードを叩くことができるようになった。 interruptがかからない…

LiteXによるSoC環境構築を試行する (シリアルコンソールの解析)

シリアルコンソールが反応しない問題、FSTを吐いているときに、前回間違ってfstのdump()を入れてしまっており 処理が非常に遅くなってしまっていた。dump()を解除するとFSTを取得しながらキーボードを叩くことができるようになった。 波形を取得すると、seri…

LiteXによるSoC環境構築を試行する (シリアルコンソールの解析)

シリアルコンソールが反応しない問題、FSTを吐きながらキーボードを叩こうとするとかなり遅くなった挙句、キーボードが反応しない。 これはもうちょっとデバッグの方法を考えなければならない。 一つはVCD出力にして、波形の出力をしやすくしなければ。

LiteXによるSoC環境構築を試行する (シリアルコンソールの解析)

まず、デザイン上にはシリアルコンソールとして以下のインタフェースが定義されている。 //------------------------------------------------------------------------------ // Module //---------------------------------------------------------------…

LiteXによるSoC環境構築を試行する (割込みの接続)

PLICの実装を試している。自作CPUのSoC環境にPLICをインスタンスして接続する。 PLICの実装は、どこからかオープンソースのものを取ってこようと思う。 github.com とりあえず以下のように接続する。 logic [ 7: 0] w_ie [1]; // Interrupt enable per sourc…

RISC-Vの圧縮拡張命令Zc*拡張について

fprox.blogspot.com RVC命令に追加して、新たに定義されているZc*拡張について調査する。 RISC-V Zc*拡張には、6種類の拡張命令があるらしい。 Zca: Zcf / Zcd以外の既存のRVC命令 Zcf: 既存の単精度RVCメモリアクセス命令 Zcd: 既存の倍精度RVCメモリアクセ…

sshfsにより2段階先のサーバのディスクを見る方法

要するに、~/.ssh/configに以下を追加しておく。 Host msyksphinz-ext-server HostName アクセスしたいサーバ User msyksphinz ProxyCommand ssh <「アクセスしたいサーバにアクセスするためのログインサーバ」> -W %h:%p そして、以下のコマンドでアクセス…

LiteXによるSoC環境構築を試行する (割込み挿入方法)

LiteXの続き。LiteXでどうにかBIOSを立ち上げることができるようになったが、次はキーボードの入力が受け付けられない。 これはおそらく割込みをまじめに接続していないことだろう。LiteXのほかのデザインはどうだろうか? まずはRocketの実装とVexRiscVの実…

RISC-V ベクトルプロセッサの実装論文Vitruvius+の論文を読む

RISC-Vのベクトル実装の論文を読んでいる。 https://dl.acm.org/doi/abs/10.1145/3575861 Vitruvius+というのはバルセロナスーパーコンピューティングセンターの開発しているRISC-Vベクトル拡張の実装で、初代Vitruviusの後継となる実装である。 ポイントだ…

サイクル精度シミュレータSniperのメモリリーク解析備忘録

サイクル精度シミュレータSniperを魔改造したら大量にメモリリークするようになってしまったので、それを修正した備忘録。 問題は自分の修正した部分。ベクトル命令は1命令が複数の命令に分解される可能性がある。 これを単純に実装しようとすると、命令キャ…

LiteXによるSoC環境構築を試行する (15. AXI Wrapper階層の作り直しとBIOSブート)

LiteXの続き。SoC階層に書き込みができていない問題があったのだが、これはAXIを正しく接続していなかったせいだった。 AXIのArbitrationを修正して、どうにかBIOSの立ち上がりまで来ることができた。とりあえず目標としていたコンソールの出力まで来たぞ。 …

LiteXによるSoC環境構築を試行する (14. AXI Wrapper階層の作り直し)

LiteXの続き。SoC階層に書き込みができていない問題があったのだが、これはAXIを正しく接続していなかったせいだった。 問題は、今のCPUインタフェースがAXIのようなAWとWの非同期動作をサポートしていないということ。SoC側が非同期にReadyを動かす場合、う…

RISC-V ベクトルプロセッサの実装論文Vitruvius+の論文を読む

RISC-Vのベクトル実装の論文を読んでいる。 https://dl.acm.org/doi/abs/10.1145/3575861 Vitruvius+というのはバルセロナスーパーコンピューティングセンターの開発しているRISC-Vベクトル拡張の実装で、初代Vitruviusの後継となる実装である。 ポイントだ…

RISC-V ベクトルプロセッサの実装論文Vitruvius+の論文を読む

RISC-Vのベクトル実装の論文を読んでいる。 https://dl.acm.org/doi/abs/10.1145/3575861 Vitruvius+というのはバルセロナスーパーコンピューティングセンターの開発しているRISC-Vベクトル拡張の実装で、初代Vitruviusの後継となる実装である。 ポイントだ…

LiteXによるSoC環境構築を試行する (13. LiteXのbiosブートプロセスの解析)

LiteXの続き。 UARTのアドレスに対して正しくアクセスできていないように見える。まず、.dataセクションの場所を確認すると、 Disassembly of section .data: 10000000 <s_flush_cpu_dcache>: 10000000: 0d60 .2byte 0xd60 10000002: 0000 .2byte 0x0 10000004: 4580 .2byte 0x45</s_flush_cpu_dcache>…

LiteXによるSoC環境構築を試行する (12. テストケースのデバッグ)

前回までで、PLICはCPUのシステム内に置く必要があるということが分かり、サブシステムの再実装を進めている。 具体的には、これまではTileをそのままSoCのCPUサブシステムとして見せていたのだが、これをサブシステムとして新たにラップし、PLICのモジュー…

LiteXによるSoC環境構築を試行する (11. テストケースのデバッグ)

波形をチェックしながら途中でテストケースが死んでしまう原因を調べていたのだが、どうやら不正なメモリ領域にアクセスしていたらしい。 PLICの領域を0x0C00_0000に配置していたのだが、この領域を出るとバスが反応しなくなる(というか、その場合はエラーを…

LiteXによるSoC環境構築を試行する (11. LiteXブートシーケンスの解析)

ほかの波形と見比べながら、なんとなく何が必要なのか分かってきた。 次に必要なのはメモリマップだ。メモリマップを以下のように修正した。 [ { "base": "0x0000_0000", "size": "0x0002_0000", "attr": {"R": 1, "W": 0, "X": 1, "A": 1, "C": 0}, "commen…

LiteXによるSoC環境構築を試行する (10. LiteXのAXIコンフィグレーションの変更)

ほかの波形と見比べながら、なんとなく何が必要なのか分かってきた。 現在自作CPUは簡易的なAXIで接続しているが、このためのコンフィグレーションが足りない。 いくつか修正して、AXIとしてちゃんと動作するようにした。要は、データサイズとかバーストサイ…