FPGA開発日記

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

SonicBOOMのデザインを読み解く (1. 環境の構築とシミュレーション)

SonicBOOMのCoreMark値はそれなりに高く、普通にパイプラインを組むだけではおよそ出すことのできないくらいの性能が出ている。これがどこから来ているのか解析したいという話があったので、少し見てみることにした。 ツールチェインのビルド まずはChipyard…

何故RISC-Vのアトミック操作命令はLR/SCでCASではないのか (2. LR/SCの条件)

Atomicアクセスについて、LR/SCを使う場合にはライブロックが発生する可能性がある。これを解決するために、RISC-VではいくつかLR/SCについて説明が付け足されている。 LR/SCに制限を付ける LR/SCで挟むアトミックな命令シーケンスは、最大で命令16個分とす…

何故RISC-Vのアトミック操作命令はLR/SCでCASではないのか

RISC-Vの仕様書を読んでいて、アトミックアクセスの所に色々書いていったので自分でも勉強してみることにした。 まず、大前提としてRISC-Vではアトミックアクセスのための命令としてLR/SC(Load-Reserved / Store-Conditional)の命令を採用している。 この命…

Verilatorのコンパイルフローを観察する (11. V3Const.cppについて)

Verilatorの解析続き。 V3Const.cppには、いくつかの定数最適化が加わっているようだ。astgenというPythonスクリプトによってソースコードが拡張されている。展開用のスクリプトは長くてすぐには理解できないのだが、生成されたソースコードを読んでみる。 v…

Vivado Simulatorを使ってUVMに入門する (4. master と slave に分けてシミュレーション)

以下のサイトを読みながらUVMについて勉強をしている。 sites.google.com 次はUVMの環境をマスターとスレーブに分けて環境を構築する。これまで作ったsequencer / driver / monitor をそれぞれmasterとslaveに分けた。 sample_master_agent.sv class sample_…

Vivado Simulatorを使ってUVMに入門する (3. sequence / sequence_item / driver)

UVMの勉強をしている。UVMを使ったもう少し踏み込んだデザインについて勉強中。以下のページを参考にしている。 sites.google.com UVMのテストパタンがどのようにテストターゲットに向けて流されるのかという話だが、とりあえずは、 sequnceというユニットが…

Verilatorのコンパイルフローを観察する (10. Veritalor Internalsのドキュメントを読む)

VerilatorのInternalドキュメントを読む。ソースコードを読んでいるだけではだんだん良く分からなくなってきたので、一応概要を確認しておく。 概要の続き。 github.com コーディング規約 インデントスタイル Verilator C++ソースのインデントをマッチさせる…

Verilatorのコンパイルフローを観察する (9. Veritalor Internalsのドキュメントを読む)

VerilatorのInternalドキュメントを読む。ソースコードを読んでいるだけではだんだん良く分からなくなってきたので、一応概要を確認しておく。 github.com Verilator Internals このファイルではVerilatorの内部構造とプログラミングの詳細について議論する…

HPVM: Heterogeneous Parallel Virtual Machine についてのメモ

LLVM Maling Listで流れてきたのでメモ:イリノイ大学の開発したHPVMについて。 ヘテロジニアスアーキテクチャ向けのIR Representationのことを示しているようだ。論文は以下。まだ全部読み切っていないけど。 HPVM: Heterogeneous Parallel Virtual Machine…

Verilatorのコンパイルフローを観察する (8. 010_paramLinkについて)

010_paramLinkはSystemVerilogにおけるパラメータの決定を行う。例えば以下のようなデザインをサンプルとして作ってみた。 test.sv module test; localparam p = 4; logic [p-1: 0] in; test2 #(.param(p * 2), .plus_p(9)) u_test2 ( .in({in, in}), .out()…

Verilatorのコンパイルフローを観察する (7. 008_LinkIncのソースコードを読む)

008_LinkIncはVerilogファイル中の++、--演算を処理するための関数のようだ。ヘッダファイルの説明書きを見てみよう。 src/V3LinkInc.cpp // V3LinkInc's Transformations: // // prepost_stmt_visit // PREADD/PRESUB // Create a temporary __VIncrementX …

Verilatorのコンパイルフローを観察する (6. 007_JumpLinkのソースコードを読む)

whileブロックの内部解析続き。break文がどのように分解されているのかを観察する。以下のようなVerilogファイルを題材に観察している。 module while_jump; int i; initial begin while(i < 100) begin if (i == 10) break; i++; end end endmodule これら…

Verilatorのコンパイルフローを観察する (5. 007_JumpLinkについて)

Verilatorの内部構造勉強続き。次は007_JumpLinkについて見てみた。READMEを見てみると以下のように書いてある。 src/V3LinkJump.cpp // V3LinkJump's Transformations: // // Each module: // Look for BEGINs // BEGIN(VAR...) -> VAR ... {renamed} // FO…

Vivado Simulatorを使ってUVMに入門する (2. driver / agent / monitor / sequencer などなど)

Vivado Simulatorを使ってUVMに入門している。とりあえず良い資料が無いので以下のサイトを見ながら我流でいろいろ試している。 sites.google.com UVM Driver / Agent / monitor / Sequencer を以下のように配置した。 . |-- Makefile |-- model | |-- sampl…

RISC-Vがリンクレジスタを2つ用意しているのは何故なのか

最近は朝の体操としてRISC-Vの仕様書を一から全部読みなおしている。ジャンプアンドリンク命令の部分を読んでいて、自分でも良く知らないところが出てきたので調べてみた。 RISC-VのABIでは通常ジャンプアンドリンクのリンクレジスタとしてraレジスタ(x1)が…

Verilatorのコンパイルフローを観察する (4. Astのダンプについて)

VerilatorがSystem Verilogファイルを字句解析、構文解析した後は、V3AstNodeというクラスに構造的に組み上げる。これをダンプしているのが以下のログファイルに相当する。 Verilator Tree Dump (format 0x3900) from <e0> to <e94> NETLIST 0x7fffe4eb4f40 <e1#> {a0aa} $</e1#></e94></e0>…

Verilatorのコンパイルフローを観察する (3. 内部のデータ変換を追いかける)

Verilatorが内部でどのような方式によりVerilogをC++に変換しているのか興味がある。 色々調べてみると、--debugオプションを付けるとデータフローグラフを出力してくれるらしい。 verilator --cc --debug simple_ff.sv とりあえず出てきたdotファイルを片っ…

Vivado Simulatorを使ってUVMに入門する

私は論理回路の中でもデザインエンジニアなので、UVMが非常に苦手である。というか全く分からない。 ただし分からないと言うばかりではどうしようもないので、Vivado Simulatorを使って多少は勉強しなければなるまい。 UVMはUniversal Verification Methodol…

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に実装されているページテーブルの実装と仮想アド…