2021-04-01から1ヶ月間の記事一覧
"3. HDL(SystemVerilogやVHDL)からLLHDへのマッピング"から。 SystemVerilogやVHDLなどのHDLから、LLHDへのマッピングを行う。ここでは、SystemVerilogをLLHDにどのようにマッピングするかについて見ていく。 3.1 階層構造 SystemVerilogのmoduleやVHDLのent…
前回の解析に基づき、FIRRTLのParseを続けている。 Circuitを構築すると、MLIRで作成したCircitOpを構築するようだ。 /// file ::= circuit /// circuit ::= 'circuit' id ':' info? INDENT module* DEDENT EOF /// ParseResult FIRCircuitParser::parseCirc…
LLHDはLLVMを拡張したハードウェアを記述するための中間言語である。CIRCTの実装を読むにあたりこの論文にいくつか言及されていたので読んでみることにした。 llhd.io ハードウェア設計のフロー全体で使用できる新しいIRとしてLLHDを提案する。LLHDはこれま…
CIRCTではFIRRTLを受け取ってSystemVerilogをエクスポートするような機能が搭載されている。CIRCTではMLIRの技術が使用されており、MLIRの勉強するのにはもってこいだと思う。FIRRTLをParseしてMLIRを使って構築するフローが構築されているので、まずはこれ…
ChipyardでRTLシミュレーションを行う場合、波形を出力する場合にはdebugターゲットを使ってコンパイルすることになる。 Verilatorを使う場合にはデフォルトで出力される波形フォーマットはVCDなのだが、VCDはテキストフォーマットのため波形を出力すると巨…
こちらの記事を読んで、LLVMのAutomatic Vectorizationが少しずつ使い物になっていることを知った。RISC-Vを例に採っているので、使えるようになっているのだろうか? blog.kmckk.com 丸一日かけてLLVM13をビルドして、オプションを調整してベクトル拡張命令…
こちらの記事を読んで、LLVMのAutomatic Vectorizationが少しずつ使い物になっていることを知った。RISC-Vを例に採っているので、使えるようになっているのだろうか? 試してみようと思って手元にあるLLVM12のバイナリを動かしてみると、そもそも-riscv-vect…
GDBを当てて動作を観察してみた。Verilatorはデバッグ版とリリース版がビルドされるので、デバッグ版を使用する。 $ gdb ./bin/verilator_bin_dbg EmitCImp::visit()にブレークポイントを張って動作を観察する。 b EmitCImp::visit run --cc --debug ../tiny…
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がVerilogの構成自体をAst形式で格納しているのは理解できた。では、これがどのようにC++に置き換えられているのかを観察することにする。 C++のヘッダファイルと実装ファイルが出力されるのはV3EmitC.hとV3EmitC.cppが使用されているようだ。 veri…
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のCoreMark値はそれなりに高く、普通にパイプラインを組むだけではおよそ出すことのできないくらいの性能が出ている。これがどこから来ているのか解析したいという話があったので、少し見てみることにした。 ツールチェインのビルド まずはChipyard…
Atomicアクセスについて、LR/SCを使う場合にはライブロックが発生する可能性がある。これを解決するために、RISC-VではいくつかLR/SCについて説明が付け足されている。 LR/SCに制限を付ける LR/SCで挟むアトミックな命令シーケンスは、最大で命令16個分とす…
RISC-Vの仕様書を読んでいて、アトミックアクセスの所に色々書いていったので自分でも勉強してみることにした。 まず、大前提としてRISC-Vではアトミックアクセスのための命令としてLR/SC(Load-Reserved / Store-Conditional)の命令を採用している。 この命…
Verilatorの解析続き。 V3Const.cppには、いくつかの定数最適化が加わっているようだ。astgenというPythonスクリプトによってソースコードが拡張されている。展開用のスクリプトは長くてすぐには理解できないのだが、生成されたソースコードを読んでみる。 v…
以下のサイトを読みながらUVMについて勉強をしている。 sites.google.com 次はUVMの環境をマスターとスレーブに分けて環境を構築する。これまで作ったsequencer / driver / monitor をそれぞれmasterとslaveに分けた。 sample_master_agent.sv class sample_…
UVMの勉強をしている。UVMを使ったもう少し踏み込んだデザインについて勉強中。以下のページを参考にしている。 sites.google.com UVMのテストパタンがどのようにテストターゲットに向けて流されるのかという話だが、とりあえずは、 sequnceというユニットが…
VerilatorのInternalドキュメントを読む。ソースコードを読んでいるだけではだんだん良く分からなくなってきたので、一応概要を確認しておく。 概要の続き。 github.com コーディング規約 インデントスタイル Verilator C++ソースのインデントをマッチさせる…
VerilatorのInternalドキュメントを読む。ソースコードを読んでいるだけではだんだん良く分からなくなってきたので、一応概要を確認しておく。 github.com Verilator Internals このファイルではVerilatorの内部構造とプログラミングの詳細について議論する…
LLVM Maling Listで流れてきたのでメモ:イリノイ大学の開発したHPVMについて。 ヘテロジニアスアーキテクチャ向けのIR Representationのことを示しているようだ。論文は以下。まだ全部読み切っていないけど。 HPVM: Heterogeneous Parallel Virtual Machine…
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()…
008_LinkIncはVerilogファイル中の++、--演算を処理するための関数のようだ。ヘッダファイルの説明書きを見てみよう。 src/V3LinkInc.cpp // V3LinkInc's Transformations: // // prepost_stmt_visit // PREADD/PRESUB // Create a temporary __VIncrementX …
whileブロックの内部解析続き。break文がどのように分解されているのかを観察する。以下のようなVerilogファイルを題材に観察している。 module while_jump; int i; initial begin while(i < 100) begin if (i == 10) break; i++; end end endmodule これら…
Verilatorの内部構造勉強続き。次は007_JumpLinkについて見てみた。READMEを見てみると以下のように書いてある。 src/V3LinkJump.cpp // V3LinkJump's Transformations: // // Each module: // Look for BEGINs // BEGIN(VAR...) -> VAR ... {renamed} // FO…
Vivado Simulatorを使ってUVMに入門している。とりあえず良い資料が無いので以下のサイトを見ながら我流でいろいろ試している。 sites.google.com UVM Driver / Agent / monitor / Sequencer を以下のように配置した。 . |-- Makefile |-- model | |-- sampl…
最近は朝の体操としてRISC-Vの仕様書を一から全部読みなおしている。ジャンプアンドリンク命令の部分を読んでいて、自分でも良く知らないところが出てきたので調べてみた。 RISC-VのABIでは通常ジャンプアンドリンクのリンクレジスタとしてraレジスタ(x1)が…
VerilatorがSystem Verilogファイルを字句解析、構文解析した後は、V3AstNodeというクラスに構造的に組み上げる。これをダンプしているのが以下のログファイルに相当する。 Verilator Tree Dump (format 0x3900) from <e0> to <e94> NETLIST 0x7fffe4eb4f40 <e1#> {a0aa} $</e1#></e94></e0>…
Verilatorが内部でどのような方式によりVerilogをC++に変換しているのか興味がある。 色々調べてみると、--debugオプションを付けるとデータフローグラフを出力してくれるらしい。 verilator --cc --debug simple_ff.sv とりあえず出てきたdotファイルを片っ…
私は論理回路の中でもデザインエンジニアなので、UVMが非常に苦手である。というか全く分からない。 ただし分からないと言うばかりではどうしようもないので、Vivado Simulatorを使って多少は勉強しなければなるまい。 UVMはUniversal Verification Methodol…