FPGA開発日記

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

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

LLHDの論文を読む (2. HDL(SystemVerilogやVHDL)からLLHDへのマッピング)

"3. HDL(SystemVerilogやVHDL)からLLHDへのマッピング"から。 SystemVerilogやVHDLなどのHDLから、LLHDへのマッピングを行う。ここでは、SystemVerilogをLLHDにどのようにマッピングするかについて見ていく。 3.1 階層構造 SystemVerilogのmoduleやVHDLのent…

CIRCTの仕組みとMLIRを読み解く (MLIRのTarget Descriptionを読み解く)

前回の解析に基づき、FIRRTLのParseを続けている。 Circuitを構築すると、MLIRで作成したCircitOpを構築するようだ。 /// file ::= circuit /// circuit ::= 'circuit' id ':' info? INDENT module* DEDENT EOF /// ParseResult FIRCircuitParser::parseCirc…

Low Level Hardware Description (LLHD)の論文を読む

LLHDはLLVMを拡張したハードウェアを記述するための中間言語である。CIRCTの実装を読むにあたりこの論文にいくつか言及されていたので読んでみることにした。 llhd.io ハードウェア設計のフロー全体で使用できる新しいIRとしてLLHDを提案する。LLHDはこれま…

CIRCTの仕組みとMLIRを読み解く (FIRRTLのParse部分)

CIRCTではFIRRTLを受け取ってSystemVerilogをエクスポートするような機能が搭載されている。CIRCTではMLIRの技術が使用されており、MLIRの勉強するのにはもってこいだと思う。FIRRTLをParseしてMLIRを使って構築するフローが構築されているので、まずはこれ…

Chipyardの環境でfst波形フォーマットを出力するための方法

ChipyardでRTLシミュレーションを行う場合、波形を出力する場合にはdebugターゲットを使ってコンパイルすることになる。 Verilatorを使う場合にはデフォルトで出力される波形フォーマットはVCDなのだが、VCDはテキストフォーマットのため波形を出力すると巨…

LLVM13からRISC-Vのベクトル拡張のサポートを確かめる

こちらの記事を読んで、LLVMのAutomatic Vectorizationが少しずつ使い物になっていることを知った。RISC-Vを例に採っているので、使えるようになっているのだろうか? blog.kmckk.com 丸一日かけてLLVM13をビルドして、オプションを調整してベクトル拡張命令…

LLVM13からRISC-Vのベクトル拡張のサポートが本格的に入るらしい?

こちらの記事を読んで、LLVMのAutomatic Vectorizationが少しずつ使い物になっていることを知った。RISC-Vを例に採っているので、使えるようになっているのだろうか? 試してみようと思って手元にあるLLVM12のバイナリを動かしてみると、そもそも-riscv-vect…

Verilatorのコンパイルフローを観察する (14. VerilatorがC++ファイルを出力する仕組み)

GDBを当てて動作を観察してみた。Verilatorはデバッグ版とリリース版がビルドされるので、デバッグ版を使用する。 $ gdb ./bin/verilator_bin_dbg EmitCImp::visit()にブレークポイントを張って動作を観察する。 b EmitCImp::visit run --cc --debug ../tiny…

Verilatorのコンパイルフローを観察する (13. C++ファイルの出力)

C++ファイルの出力はmainImp()がその役割を担っているようだ。 verilator/src/V3Emit.cpp void EmitCImp::mainImp(AstNodeModule* modp, bool slow) { // Output a module AstNodeModule* fileModp = modp; // Filename constructed using this module m_mod…

Verilatorのコンパイルフローを観察する (12. VerilatorがC++のヘッダファイルC++ファイルを出力する仕組み)

VerilatorがVerilogの構成自体をAst形式で格納しているのは理解できた。では、これがどのようにC++に置き換えられているのかを観察することにする。 C++のヘッダファイルと実装ファイルが出力されるのはV3EmitC.hとV3EmitC.cppが使用されているようだ。 veri…

SonicBOOMのデザインを読み解く (2. LargeBoomConfigの場合)

LargeBOOMConfigの場合、Coremark値は以下のようになった。CMK/MHzは4.68となり、公称値よりも少し低いくらいになっている。 using random seed 1618715154 This emulator compiled with JTAG Remote Bitbang client. To enable, use +jtag_rbb_enable=1. Li…

「レガシーコードからの脱却」を読んだ

レガシーコードからの脱却 ―ソフトウェアの寿命を延ばし価値を高める9つのプラクティス作者:David Scott Bernstein発売日: 2019/09/19メディア: 単行本(ソフトカバー) まず初めに一般論を言っておくと、Amazonでのこの本の評価は非常に高い。良いことが書…

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…