FPGA開発日記

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

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

Verilatorのコンパイルフローを観察する (2. 順序回路を生成するまで)

クロックデザインをどのように設計しているのか見てみることにした。以下のようなVerilogファイルをコンパイルして生成されるファイルを観察する。 simple_ff.sv module simple_ff ( input logic clk, input logic [ 4: 0] in, output logic [ 4: 0] out ); …

VerilatorのコンパイルバックエンドをClang+LLVMに変更する

VerilatorはSystem Verilog回路を読み込みフロントエンドで処理したのちC++を出力する。 出力したC++ファイルをコンパイルして実際のバイナリに変換するのがバックエンドだが、この時のコンパイラは基本的に自由に指定することができる。 自作CPUのデザイン…

Verilatorのコンパイルフローを観察する (1. 組み合わせ回路を生成するまで)

少し気になってVerilatorの中味を調査している。VerilatorはSystem Verilogのファイルを読み込んでそれをC++に変換しシミュレーションするためのツールだが、VerilogのファイルがどのようなC++ファイルに変換されているのか気になったので見てみることにした…

順不同に格納されたエントリの順番を保持するAge Matrix回路について (SystemVerilogで書いてみる)

Age Matrixの続き。理解のために実際に自分でも書いてみることにした。 モジュールとしては SIZEエントリを保持するバッファを作ってみた。 push Valid Pushする場所を示すインデックス(OH) Pushするデータ pop Valid Popする場所を示すインデックス(OH) log…

順不同に格納されたエントリの順番を保持するAge Matrix回路について

とある事情でAge Matrix回路について調べていた。 存在は何となく知っていたし、エントリのLiveness管理に必要だという理解はあったものの、どういう回路で動いているのか全く理解していなかったのでこの際頑張って勉強してみることにした。 そもそもの目的…

独自RISC-V CPUコアの実装 (VerilatorのFST出力の切り替えオプション実装)

自作RISC-Vコアを作り始めてしばらく経っているが、リグレッションテストのときは波形の取得を行わないように変更したい。 デフォルトでは波形を出力する様になっているのだがこれをオプションで変更しよう。 まずはVerilatorのC++実装に-dオプションを追加…

RISC-Vが32ビットと64ビットの仕様を明確に分離するのは何故なのか

RISC-V ISAマニュアルの最初の方を読んでいて、小噺的に書いてあったのを読んでちょっと面白そうと思った、というか自分でもまだイメージが上手くできていない部分があるのでメモしてみる。 github.com RISC-Vでは32ビットと64ビットのモードを明確に分離し…

XuantieのRISC-V Vector向けリポジトリを試す (OpenBLASをベアメタルで動かす試行1)

OpenBLASのコンパイルをベアメタルで実行したいのだが、かなり壁があるようだ。メモリアクセスに関する関数がベアメタルだと上手く行かないので、その辺を何とかごまかす必要がある。 Pthreadのサポートなども使えないので、その辺を取り除いて試行している…

XuantieのRISC-V Vector向けリポジトリを試す

OpenBLASのコンパイルにはこのページで参照していたXuantiue向けのRISC-V GCCが必要となる。 msyksphinz.hatenablog.com このリポジトリに格納されているGCCを使って、OpenBLASのLinux版は一応コンパイルできる。 make HOSTCC=gcc TARGET=C910V CC=riscv64-u…

RISC-V Testに実装されているページテーブルの実装を調査する (3. 仮想アドレスからのジャンプを調査する)

riscv-testsには、もう一つ、vm.cにevict()という関数が用意されている。evict()はどうもECALLが呼び出されたときに実行されるようだ。ECALLはテストパタンが終了したときに呼ばれるので、最後の処理に使用されるようだ。 void handle_trap(trapframe_t* tf)…

RISC-V Testに実装されているページテーブルの実装を調査する (2. 仮想アドレスからのジャンプを調査する)

pop_tf()によるジャンプで、仮想アドレスで言う所の0x2ac8へのジャンプとなる。これによりユーザモードに移るわけだが、この時のアドレス計算を見てみよう。ジャンプ先は0x2ac8(仮想アドレス)なので、以下のような計算となる。 SATPが0x8000000000080004な…

RISC-V Testに実装されているページテーブルの実装を調査する

ハイパーバイザーの勉強をしている中で、2段ページテーブルの実装の中でそもそも私は普通のスーパーバイザーでのページテーブルの仕組みをしっかり理解できていないことに気が付いた。 ここでは、riscv_testsに実装されているページテーブルの実装と仮想アド…

Vitis-HLSのLLVMフロントエンドを試す (3. FPGAディレクトリを確認)

FPGA向けのバックエンド実装は以下に含まれていた(HLS的な名前なのかと思っていたので、FPGAというディレクトリにしばらく気が付かなかった)。 github.com ディレクトリ構成を確認すると以下のようだった。 tree lib/Target/FPGA lib/Target/FPGA |-- CMakeL…

XuantieのRISC-V Vector向けリポジトリを試す

github.com XuantieのRISC-V Vector Extensionの環境は公開されており、いくつかのテストパタンとコンパイル用のGCCが用意されている。 いくつか調査していたのだが、どうもOpenBLASとかのコンパイルもこの環境で構築が必要らしい。 github.com 基本的に上記…

Vitis-HLSのLLVMフロントエンドを試す (2. clangのコンパイルフローを確認する)

Vitis-HLSのフローにClangが組み込まれているということで、もう少し細かく挙動を確認したい。まず、元になるC++のソースコードがどのように変更されていくのかを確認する。 HLS/vitis_hls_examples/override_llvm_flow_demo/proj/solution1/.autopilot/db/a…

Vitis-HLSのLLVMフロントエンドを試す

XilinxのVitits-HLSのフロントエンドがオープンソースとして公開された。正直Vitis-HLSはその存在も目的も全く知らなかったのだが、フロントエンドがLLVMで、その実装が公開されたと知り、LLVM探検隊団員として調査しないわけにはいかないだろうということで…

Linux Foundation の Free RISC-V Online Courseをやり始めた (3. CPUの設計)

Free RISC-V Online Course の第3日目。今日からRISC-Vの回路設計。 RISC-V CPUの設計と言っても、見てみるとパイプライン無しの1サイクル設計だった。 パイプラインが無いので、フェッチからライトバックまでを1サイクルの中に詰め込んでいくわけだが、前述…

自作RISC-V CPUコアのVivado論理合成環境構築

自作CPUコアの合成環境を構築しておく。すべてのシミュレーションが完了してから合成試行するのでは遅い気がするので、今のうちに構築しておこう。 以下のようなTclを構築してく。まだ制約ファイルとかは追加していない。とりあえず論理合成がPASSすることを…

RTLシミュレーションにおいて波形をダンプする以外にデバッグする方法はあるか(2. 情報を絞る)

RTLシミュレーションにおいて、波形ダンプはとにかくディスク容量を食う。VCSなどが使用するFSDBはともかく、VCDとかで長期間シミュレーションをするととんでもないサイズのVCDファイルが生成されてしまい波形ビューアへのロードも時間がかかる。 という訳で…

RTLシミュレーションにおいて波形をダンプする以外にデバッグする方法はあるか

RTLシミュレーションにおいて、波形ダンプはとにかくディスク容量を食う。VCSなどが使用するFSDBはともかく、VCDとかで長期間シミュレーションをするととんでもないサイズのVCDファイルが生成されてしまい波形ビューアへのロードも時間がかかる。 なるべく波…

Linux Foundation の Free RISC-V Online Courseをやり始めた (2. 論理回路設計)

Free RISC-V Online Course の第2日目。今日はデジタル回路。組み合わせ回路と順序回路をTL-Verilogで実装した。 何となくVerilogと文法が違うので少し戸惑う。順序回路は、レジスタを宣言するのではなくて、この信号から何サイクル後、という表現方式らしい…

LLVM12でのAPI変更分を確認

LLVMのバージョン12に向けてリポジトリではブランチが切られている。私の自作LLVMバックエンド分は現在LLVM11をベースとしているが、LLVM12に乗せ換えることによりどの程度の差分が発生するのかを確認した。 LLVMのバックエンドターゲットの登録方法が変わっ…

Linux Foundation の Free RISC-V Online Courseをやり始めた

結論から言うと課題をこなすためには無料ではなく課金が必要だった。なんじゃそりゃ! Linux FoudationがFreeのRISC-Vオンライントレーニングコースを2つリリースしたというので、どんなもんかと思ってやってみることにした。リリースされたコースは: Intro…

Google RISC-V DVをVivado Simulatorで動かす方法はあるか?

Vivado Simulator は 2019.2 から UVM をサポートしているらしい。つまり、GoogleのRISC-Vランダムパタンジェネレータのriscv-dvはVivadoで使うことができるのだろうか?オフィシャルにはサポートはされていないが、コマンドラインをいろいろ変えることで使…

RISC-V ハイパーバイザー拡張の勉強 (rvvisorの実装を読む)

RISC-Vのハイパーバイザー実装、いろいろ既存の実装を眺めているが、以下の実装がかなり読みやすく実装されているように感じたので中身を眺めてみることにした。 github.com RISC-VでCPU実験を攻略された方の実装だが、しかしこれだけのコーディングを短期間…

RISC-V ハイパーバイザー拡張の勉強 (LinuxとOpenSBIのハイパーバイザー対応を確認する1)

ハイパーバイザーについて、OpenSBIとLinux側の実装を読んでみる。OpenSBI側のリポジトリにはLinuxカーネルのリポジトリが含まれており、RISC-VのKVM開発用のブランチを指しているようだった。Linux上でのKVMの立ち上げについては全くド素人だが、何となくソ…

T-HeadのRISC-V Androidのビルドをトレースしてみる

中国のAlibabaグループの半導体を司る、T-HeadがAndroidをRISC-Vに移植したことを発表し、そのソースコードをGitHub上に公開した。 やり方は一応簡単なはずなので、再現してみることにした。 github.com 一応断っておくと、非常に多くのディスク、CPU、メモ…

QuestaSimで配列型のシミュレーション波形取得方法

最近System VerilogのシミュレーションでQuestaSimを使うことが多くなったが、デフォルトで波形を出力させようとすると配列形式の信号の記録が取られていなくて非常に不便だった。 私の場合はvsim起動時に以下のようなオプションで実行していた。 vsim -c -d…

RISC-V ハイパーバイザー拡張の勉強 (ハイパーバイザー向けに新設されたレジスタの実装を確認する)

Spikeの実装を読みながらハイパーバイザー向けのレジスタ実装を確認する。 ハイパーバイザーステータスレジスタ (hstatus) VSモードでのゲストの例外動作および制御の記録を行っている。 命令での使用:ハイパーバイザーメモリアクセス命令において、HSTATUS…

RISC-Vのハイパーバイザー拡張の仕様書を(ほぼ)日本語化したので公開する

RISC-Vのハイパーバイザー拡張の仕様がかなり固まってきた。現在は0.6.1が公開されている。 Hypervisor Extension, Version 0.6.1 github.com とりあえず、上記の資料を読みながらちまちまと日本語化してみた。これは別に営利目的などではなく、完全に自分の…