FPGA開発日記

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

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

TileLinkのCache Coherencyプロトコル (6. DualCore環境でのメモリを取り合うプログラムを試す)

msyksphinz.hatenablog.com 前回のコードは、ブートローダの動きを観察するにCRTに多少の改造を加えなければならないことが分かった。 crt.S # get core id csrr a0, mhartid # 最大4コアまでを仮定する li a1, 4 1:bgeu a0, a1, 1b main()関数の中の動きは…

Verilator勉強会の資料を公開しました

2021/05/29(土)に実施されたVerilator勉強会の発表資料を公開しました。 msyksphinz.github.io 私はVerilatorで何かを作り上げたわけではないので、いろいろとソースコードを読んで試行錯誤した結果を資料としてまとめ上げたものだった。 急ピッチで作ったの…

TileLinkのCache Coherencyプロトコル (5. DualCore環境でのメモリを取り合うプログラムを試す)

DualCoreでL2キャッシュの同じラインを取り合うようなプログラムを作ってみることにする。 試してみるのはFalse Sharingのテストで、同じキャッシュラインで別の場所に別のコアが値を書き込み続け、そのキャッシュラインを複数のコアが取り合うようなコード…

TileLinkのCache Coherencyプロトコル (4. SiFive Inclusive Cache の動作を観察する)

SiFive Inclusive Cacheは複数コアからのリクエストを処理しコヒーレントを取ることのできるL2キャッシュであるが、その内部構成を見ていこうと思う。 GTKWaveで見たところ、ざっくりと以下のような階層構成になっていた。 InclusiveCacheのインタフェースと…

BOOMのTLBに関する調査 (8. TLBのSFENCE.VMA命令の取り扱い)

SonicBOOM(というかRocket-Chip全体)のTLBにおけるSFENCE.VMA命令の取り扱いについて調査した。SFENCE.VMA命令はTLBなどのアドレストランスレーションに対してフェンスを作るための命令で、命令仕様的に、SFENCE.VMA命令は指定されたレジスタオペランドに…

TileLinkのCache Coherencyプロトコル (3. TileLinkコヒーレンスプロトコルテスト用のDualCore構成生成)

Chipyardにはマルチコア構成環境が搭載されており、Rocket-Chipではマルチコア構成環境が作られている。同様にBOOMでもマルチコア構成環境を試行してみる。 BOOMのコンフィグレーションは以下のファイルに定義されている。以下のようににしてDualMediumBoomC…

TileLinkのCache Coherencyプロトコル (3. TileLinkコヒーレンスプロトコルテスト用のDualCore構成生成)

Chipyardにはマルチコア構成環境が搭載されており、Rocket-Chipではマルチコア構成環境が作られている。同様にBOOMでもマルチコア構成環境を試行してみる。 BOOMのコンフィグレーションは以下のファイルに定義されている。以下のようににしてDualMediumBoomC…

TileLinkのCache Coherencyプロトコル (2. TileLinkのコヒーレンシフロー)

TileLinkプロトコルの続き。 まず、以下のような構成にてどのようにキャッシュブロックが移るのかを見ていく。キャッシュを含めてそれぞれのノードにはブロックのコピーが置かれるわけだが、それぞれについて許可できる操作が異なる。 None:コピーを持って…

TileLinkのCache Coherencyプロトコル (1. TileLinkの定義チャネル)

TileLinkはAMBA、OCP(Open Core Protocol)のような共通バスプロトコルとしてSiFive社により定義されたプロトコルである。SiFive社が公開しているRocket-Chip、BOOM、ChipyardやDiplomacyを理解するときには必ず通らなければならない仕様だ。 このプロトコ…

BOOM (Berkeley Out-of-Order Machine) のマイクロアーキテクチャドキュメントを読む (13)

RISC-VのアウトオブオーダコアであるBOOM (Berkely Out-of-Order Machine) について勉強を進めている。以下のドキュメントを日本語に訳しながら読んでいくことにした。 docs.boom-core.org GShare分岐予測器 GShare はシンプルですが非常に効果的な分岐予測…

BOOMのTLBに関する調査 (7. PTWからLSUへのインタフェース)

BOOMのTLBの調査を引き続き行っている。TLBミスを起こしたリクエストはPTW(Page Table Walker)に渡されるのだが、Page Table Walkerのバッファにもヒットしなかった場合には外部にリクエストが渡される。外部リクエストがどこに行くのか観察していた。 最…

BOOM (Berkeley Out-of-Order Machine) のマイクロアーキテクチャドキュメントを読む (12)

RISC-VのアウトオブオーダコアであるBOOM (Berkely Out-of-Order Machine) について勉強を進めている。以下のドキュメントを日本語に訳しながら読んでいくことにした。 docs.boom-core.org ロードストアユニット(LSU) Fig. 24 ロードストアユニット LSU(Loa…

BOOMのTLBに関する調査 (6. Page Table Walkerのインタフェース)

Rocket-Chip / BOOMのTLBを調査している。Page Table Walkerの動作の詳細を見ていく。 Page Table Walkerのインタフェース Page Table Walkerのインタフェースは以下のようになっている。 リクエスト側 リクエスト側は複数のマスタが接続されており、これら…

BOOM (Berkeley Out-of-Order Machine) のマイクロアーキテクチャドキュメントを読む (11)

RISC-VのアウトオブオーダコアであるBOOM (Berkely Out-of-Order Machine) について勉強を進めている。以下のドキュメントを日本語に訳しながら読んでいくことにした。 docs.boom-core.org 分岐ユニット & 分岐命令の投機実行 分岐ユニット は、すべての分岐…

BOOM (Berkeley Out-of-Order Machine) のマイクロアーキテクチャドキュメントを読む (10)

RISC-VのアウトオブオーダコアであるBOOM (Berkely Out-of-Order Machine) について勉強を進めている。以下のドキュメントを日本語に訳しながら読んでいくことにした。 docs.boom-core.org 実行パイプライン Fig. 19: 2命令発行のBOOMのパイプライン例。最初…

BOOM (Berkeley Out-of-Order Machine) のマイクロアーキテクチャドキュメントを読む (9)

RISC-VのアウトオブオーダコアであるBOOM (Berkely Out-of-Order Machine) について勉強を進めている。以下のドキュメントを日本語に訳しながら読んでいくことにした。 docs.boom-core.org レジスタファイルとバイパスネットワーク Fig. 18 複数命令発行パイ…

BOOM (Berkeley Out-of-Order Machine) のマイクロアーキテクチャドキュメントを読む (8)

RISC-VのアウトオブオーダコアであるBOOM (Berkely Out-of-Order Machine) について勉強を進めている。以下のドキュメントを日本語に訳しながら読んでいくことにした。 docs.boom-core.org 命令発行ユニット 命令発行キュー は、まだ実行されていないディス…

BOOM (Berkeley Out-of-Order Machine) のマイクロアーキテクチャドキュメントを読む (7)

RISC-VのアウトオブオーダコアであるBOOM (Berkely Out-of-Order Machine) について勉強を進めている。以下のドキュメントを日本語に訳しながら読んでいくことにした。 docs.boom-core.org リオーダバッファ(ROB)とディスパッチステージ リオーダバッファ は…

BOOM (Berkeley Out-of-Order Machine) のマイクロアーキテクチャドキュメントを読む (6)

RISC-VのアウトオブオーダコアであるBOOM (Berkely Out-of-Order Machine) について勉強を進めている。以下のドキュメントを日本語に訳しながら読んでいくことにした。 docs.boom-core.org デコードステージ デコード ステージは、フェッチバッファから命令…

BOOMのTLBに関する調査 (5. Rocket-Chip / BOOMのArbiterの仕組み調査)

Rocket-Chip / BOOMで使用されているArbiterについて調査する。以下のソースコードを参照した。 @chiselName class Arbiter[T

BOOM (Berkeley Out-of-Order Machine) のマイクロアーキテクチャドキュメントを読む (5)

RISC-VのアウトオブオーダコアであるBOOM (Berkely Out-of-Order Machine) について勉強を進めている。以下のドキュメントを日本語に訳しながら読んでいくことにした。 docs.boom-core.org グローバルヒストリレジスタ(GHR)の管理 Global History Register (…

BOOM (Berkeley Out-of-Order Machine) のマイクロアーキテクチャドキュメントを読む (4)

RISC-VのアウトオブオーダコアであるBOOM (Berkely Out-of-Order Machine) について勉強を進めている。以下のドキュメントを日本語に訳しながら読んでいくことにした。 docs.boom-core.org The Backing Predictor (BPD) Next Line Predictor (NLP) がうまく…

RISC-Vのランダムテストriscv-tortureを試す (2. メンテナンスによるアップデート)

riscv-torture(ランダムテストパタン)はしばらくメンテナンスされていなかったのだが、最近アップデートされて一応makeが通るようになった。 自作CPUのランダムテストパタンとして使用することにする。 github.com RISC-V TortureのConfiguration Tortureの…

BOOM (Berkeley Out-of-Order Machine) のマイクロアーキテクチャドキュメントを読む (3)

RISC-VのアウトオブオーダコアであるBOOM (Berkely Out-of-Order Machine) について勉強を進めている。以下のドキュメントを日本語に訳しながら読んでいくことにした。 docs.boom-core.org 分岐予測 BOOM Front-end この章では、BOOMがどのように分岐を予測…

BOOM (Berkeley Out-of-Order Machine) のマイクロアーキテクチャドキュメントを読む (2)

RISC-VのアウトオブオーダコアであるBOOM (Berkely Out-of-Order Machine) について勉強を進めている。以下のドキュメントを日本語に訳しながら読んでいくことにした。 docs.boom-core.org RISC-V命令セットアーキテクチャ RISC-V ISAは、広く採用されている…

BOOMのTLBに関する調査 (4. Rocket-Chip / BOOM の Page Table Walker(PTW)に関する調査)

Rocket-Chip / BOOMのTLBについてはある程度動作を理解できるようになってきたので、次はTLBがつながる先のPTW (Page Table Walker)について調査したい。Page Table Walkerは基本的にRocketTile / BoomTileに1つだけ搭載されているが、ポートはTLBの数だけ用…

BOOM (Berkeley Out-of-Order Machine) のマイクロアーキテクチャドキュメントを読む

RISC-VのアウトオブオーダコアであるBOOM (Berkely Out-of-Order Machine) について勉強を進めている。以下のドキュメントを日本語に訳しながら読んでいくことにした。 docs.boom-core.org The Berkeley Out-of-Order Machine (BOOM) Fig. 1 Detailed BOOM P…

BOOMのTLBに関する調査 (3. TLBの挙動を波形解析する)

TLBの挙動についてある程度分かるようになってきたので、実際の波形を見ながら解析してみたいと思う。ChipyardのBOOMコンフィグレーションで、RISC-Vテストパタンを走らせて波形を解析する。 ./simulator-chipyard-MediumBoomConfig-debug \ --vcd=rv64ui-v-…

BOOMのTLBに関する調査 (2. TLBのエントリ構成)

TLBのインスタンスは以下で定義されている。 val tlb = Module(new TLB(true, log2Ceil(fetchBytes), TLBConfig(nTLBSets, nTLBWays))) このときの設定は、nTLBSets = 1, nTLBWays = 32, cfg.nSectors = 4となっているようだ。 val sectored_entries = Reg(V…

BOOMのTLBに関する調査 (1. TLBのインタフェース)

BOOMのTLBに関してその仕様と動作を調査する。SonicBOOMのTLBは以下の場所に定義されている。 chipyard/generators/boom/src/main/scala/lsu/tlb.scala github.com このNBDTLBがそれに相当する。NBDというのはNonBlockingの意味だと思う。 class NBDTLB(inst…