FPGA開発日記

FPGAというより、コンピュータアーキテクチャかもね! カテゴリ別記事インデックス https://msyksphinz.github.io/github_pages

Rocket Chip Generatorのバス生成技術を読み解く(1. Diplomacyの論文を読む)

Rocket Chipのバス設計は非常に読み解くのが難しい。 Rocket Chipのフロントエンドを読み解いていこうと思ったが、フロントエンドのバス接続の部分でさっそく挫折してしまった。 特に、Chiselで記述されたバスプロトコルとLazyModuleを読み解くのが何だか良…

LLVMのバックエンドを作るための第一歩 (25. int32型以外のサポート)

現在は、int型(32ビット整数)のみLLVM IRをサポートしているが、それ以外の型をサポートしたいと思う。32ビット整数、16ビット整数、8ビット整数、そしてBool型をサポートする。 これらの値をメモリアクセスするために、AlignedLoadを拡張して以下のノードを…

RISC-V Workshop Zurichで発表されたRISC-V Vector Extension 0.7.1

RISC-V Workshop Zurichで発表されたRISC-V Vector Extension 0.7.1の資料がアップロードされたので、さっそく概要を把握してみる。 https://content.riscv.org/wp-content/uploads/2019/06/17.40-Vector_RISCV-20190611-Vectors.pdf ちなみに、詳細な資料は…

LLVMのバックエンドを作るための第一歩 (24. ポインタのサポート)

LLVM IRでポインタのサポートをする。ポインタをサポートするためには、該当するシンボルに対するアドレスを計算するというIRを追加する必要がある。これを、EffectiveAddressというクラスで追加する。 llvm-myriscvx/lib/Target/MYRISCVX/MYRISCVXInstrInfo…

RISC-V Workshop in ETH Zurichの講演スライドが公開された

まだすべてチェックしていないが、RISC-V Workshop Zurichのスライドがすべて公開されている。 riscv.org ざっくりとみてみたいのはこのあたりかな。 OpenHW Group Announces CORE-V Family of Open-Source RISC-V Cores https://content.riscv.org/wp-conte…

SiFive社 Official ReleaseのCoremarkをHiFive Unleashedで動かす

SiFive Tech Symposiumの時に聞いたのだが、Freedom-E-SDKの時期リリースバージョンではCoremarkが同梱されているらしい。 freedom-e-sdkのブランチをdevelopment-19.05に変更すれば出てくる。 github.com freedom-e-sdkの標準のビルド方法ではビルドできな…

LLVMのバックエンドを作るための第一歩 (23. グローバル変数の取り扱い)

今回は、グローバル変数を取り扱うための手法について調査する。 現状では、グローバル変数の入っているプログラムをコンパイルすると以下のようにエラーが発生する。 int gStart = 3; int gI = 100; int test_global() { int c = 0; c = gI; return c; } ./…

Verilog-Perl を使ってRocket-Chipの階層構造を把握する

RISC-VのRocket-Chipを勉強していこうと思う。 まずはRocketがどのような階層構成になっているのか、生成されたVerilogを使って把握してみたい。 ずいぶんと古いツールだが、Verilog-Perlの中にvhierというツールが存在する。 metacpan.org 久しぶりにVerilo…

LLVMのバックエンドを作るための第一歩 (22. RISC-Vに存在しないパタンをどのように命令生成するか)

例えば、以下のようなプログラムをコンパイルする。 このプログラムは命令を生成する段階でローテートを示すIRを生成する。 int test_rotate_left() { unsigned int a = 8; int result = ((a << 30) | (a >> 2)); return result; } ./bin/clang -target mips…

LLVMのバックエンドを作るための第一歩 (21. 演算命令の追加)

定数が生成できるようになったので、次は演算命令を追加する。 こちらも同様にMYRISCVXInstrInfo.tdに命令パタンを追加していく。 llvm-myriscvx/lib/Target/MYRISCVX/MYRISCVXInstrInfo.td def ADDI : ArithLogicI<0b0010011, 0b000, "addi", add, simm12, …

LLVMのバックエンドを作るための第一歩 (20. 定数を生成させるパタンの追加)

簡単な関数をコンパイルしてアセンブリ命令が出力できるようになったので、様々な命令をサポートしていきましょう。MYRISCVXに命令を追加して、生成できるコードの量を増やしていく。 基本的な算術演算から進めるのが良いと思う。 MYRISCVXに命令を追加する…

ET-West 2019にてRISC-Vとオープンハードウェアについてテクニカルセッションを行います

2019/06/13(木)~2019/06/14(金)に開催されるET-Westと呼ばれる技術展で、テクニカルセッションとしてRISC-Vに関する講演を行います。 www.jasa.or.jp テクニカルセッション 06/14 13:00 - 14:30 場所 : グランフロント大阪 ナレッジキャピタル コングレコン…

LLVMのバックエンドを作るための第一歩 (19. 関数のスタックフレームの作り方)

MYRISCVXRegisterInfo::eliminateFrameIndex これも必須の関数だ。関数のスタックフレーム内での参照について、計算できていなかったオフセットを計算するための関数だ。 このeliminateFrameIndexが呼ばれるまでは、スタックポインタをベースに参照されるデ…

LLVMのバックエンドを作るための第一歩 (18. emitPrologue, emitEpilogue)

最終的に関数をコンパイルして命令を出力するためには、関数のプロローグ・エピローグを生成する必要がある。 関数のプロローグは関数に入った時の最初に行う処理、関数のエピローグは関数から出るときに最後に行う処理である。 基本的には Callee Saved Reg…

これからの時代、少量カスタムで大量種類のチップを設計する方法とは (UCBの論文を読む)

UCB(University of California, Berkeley)の論文を教えてもらい、読んでみることにした(実際には大量にGoogle翻訳した)。 この論文は"Generating the Next Wave of Custom Silicon"という論文である。 著者から分かる通り、RISC-VとChiselの思いっきり関係者…

LLVMのバックエンドを作るための第一歩 (17. ISELDagToDAGの働きについて)

DAG-to-DAGの目的は、ターゲットとは独立したノード情報をターゲット固有のノードに変換する処理を行うことだ。命令を選択するアルゴリズムはSelectionDAGに対して実行される。 DAGToDAGの中で実装しなければならない重要な関数の一つは、アドレスを計算する…

LLVMのバックエンドを作るための第一歩 (16. ISELLowering内でのReturn文の取り扱い)

MYRISCVXISelLoweringはLLVM IRからSelectionDAG(データフローグラフ)への変換プロセスになる。 バックエンドのかなり初期の部分で適用される。 ここで必要な実装はMYRISCVXISelLowering.cppを実装する必要がある。 ここではLowerReturnとLowerFormalArgumen…

LLVMのバックエンドを作るための第一歩 (15. ISelLoweringによりInstruction Selection)

MYRISCVXISelLoweringはLLVM IRからSelectionDAG(データフローグラフ)への変換プロセスだ。バックエンドのかなり初期の部分で適用される。 ここで必要な実装はMYRISCVXISelLowering.cppを実装する必要がある。ここではLowerReturnとLowerFormalArgumentsを実…

RISC-VボードSipeed Maix GOを試行する(1. 組み立て)

Sipeed Maix GOはRISC-Vコアの搭載された小型ボードだ。 www.seeedstudio.com このボードのスペックについては、上記のページをそのまま引用すると、 In hardware, MAIX have powerful KPU K210 inside, it offers many excited features: 1st competitive R…

SiFive Tech Symposium in TokyoのAgenda公開

いつの間にか公開されていた、SiFive Tech Symposium in Tokyoのアジェンダを見ることができるようになった。 sifivetechsymposium.com 情報が錯綜していてどうしたらいいのか分からなかったが、これが正式なアジェンダ、なんだと思う。 結構他の都市のイベ…

LLVMのバックエンドを作るための第一歩 (14. LLVMInitializeCPUTargetMC()により登録されるクラス群)

printInstruction()などの命令プリントメソッドとMYRISCVXTargetMachineとの関連付けは、MCTargetDesc/MYRISCVXMCTargetDesc.cppで行われている。 LLVMInitializeMYRISCVXTargetMC()により登録されるクラス群 llvm-myriscvx/lib/Target/MYRISCVX/MCTargetDes…

LLVMのバックエンドを作るための第一歩 (13. 命令のプリントに関するメソッド群)

命令のプリント、つまりアセンブリ命令をファイルに出力する処理は、基本的にMYRISCVXInstrInfo.tdに記述した命令の定義に基づいて生成される。 LLVMではPrintInstruction()というメソッドがその役割を担います。 このメソッドはMYRISCVXInstPrinterクラスに…

LLVMのバックエンドを作るための第一歩 (12. llcのターゲット・CPU・アトリビュートの関係)

llcでLLVM IRからアセンブリ言語を生成する場合、バックエンドのターゲットとして大きく分けて以下の3つを指定する。 ./bin/llc -march=myriscvx32 -mcpu=simple32 -mattr=-64bit コマンドラインから設定されるターゲットの情報と内部変数の関係 それぞれが…

LLVMのバックエンドを作るための第一歩 (11. LLVMが独自ターゲットマシンを認識する仕組み)

LLVM Compiler Infrastructure MYRISCVXTargetMachineはターゲットマシンを定義するファイルである。 また、MYRISCVXTargetMachineを継承したクラスとして複数のターゲットマシンを作ることができる。 MIPSなどのバイエンディアンのアーキテクチャでは、リト…

LLVMのバックエンドを作るための第一歩 (10. サブターゲットを追加するためのSubtargetFeature)

LLVM Compiler Infrastructure 前回に引き続きLLVMのバックエンドを作るために必要なファイルを読み解いていく。 MYRISCVXSubTarget.{h,cpp} サブターゲットはMYRISCVXの中でもアーキテクチャのバリエーションを付けるために使用されるもので、その名の通り…

セキュリティプロセッサMorpheusの論文を読む。ランダム化のための"Churn"とは。

少し前のニュースで、ASPLOS19でRISC-Vをベースとした新しいセキュアプロセッサの発表が行われたというニュースを見た。 Morpheus: A Vulnerability-Tolerant Secure Architecture Based on Ensembles of Moving Target Defenses with Churn dl.acm.org セキ…

xSIG 2019にてRISC-Vとオープンハードウェアについてチュートリアル講演を行います

2019/05/27(月)~2019/05/28(火)に開催されるxSIGと呼ばれるワークショップにて、RISC-Vについてチュートリアル講演を行います。 xsig.hpcc.jp xSIGというのは、「クロス・シグ」と読むらしく、「The 3rd cross-disciplinary Workshop on Computing Systems,…

LLVMのバックエンドを作るための第一歩 (9. MCTargetDescとABIInfo)

LLVM Compiler Infrastructure 前回に引き続きLLVMのバックエンドを作るために必要なファイルを読み解いていく。 MCTargetDesc/MYRISCVXMCTargetDesc.{h,cpp} MYRISCVXMCTargeTDescでは明確なクラスを定義するわけではない。 その代わりに、これまでTarget D…

Intel CPUの脆弱性"ZombieLoad"の論文を読んでみる

Intelがまた出した。Meltdown / Spectre系のCPUの脆弱性として新たに発表された"ZombieLoad"である。 これもまた論文が発表されている。これらの論文は、最新のCPUの技術を勉強するにあたって非常に有用なものだ。ZombieLoadの論文を読んで、どのような脆弱…

LLVMのバックエンドを作るための第一歩 (8. Calling Conventionとレジスタ定義)

LLVM Compiler Infrastructure MYRISCVXCallingConv.td MYRISCVXのCalling Convention、つまり呼び出し規約について設定するTarget Descriptionファイルだ。MYRISCXVの呼び出し規約は、RISC-Vのものをそのまま使用しようと思う。 ここでは、関数呼び出しの時…