FPGA開発日記

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

Chisel3で外部モジュールをロードする場合に必要なbuild.sbtの変更点

Chisel3を使っていて、どうもメインディレクトリの外部にあるソースコードを参照したい、Mavenに登録してあるわけではないのだけれども、ローカルに作ってあるクラスを参照して作りたいなと思ったとき。 例えば、以下のようなモジュールを開発しており、これ…

ハードウェア記述言語Chiselコンパイラの内部解析(2. Chiselコンパイルのフローを追いかける)

ハードウェア記述言語ChiselはScalaのプラットフォームの上に構築されている。大きく分けて2つのリポジトリから構成されている。 chisel3 : https://github.com/freechipsproject/chisel3 firrtl : https://github.com/freechipsproject/firrtl chisel3のリ…

ハードウェア記述言語Chiselコンパイラの内部解析(1. カスタマイズ用のローカル環境を作る)

ハードウェア記述言語ChiselはScalaのプラットフォームの上に構築されている。大きく分けて2つのリポジトリから構成されている。 chisel3 : https://github.com/freechipsproject/chisel3 firrtl : https://github.com/freechipsproject/firrtl chisel3のリ…

Chiselで再帰を使ってPopCountモジュールを実装する

Arianeの実装を見ていると、PopCountの実装がSystem Verilogの再帰を使って実装してあった。 github.com Popcountの実装 module popcount #( parameter int unsigned INPUT_WIDTH = 256, localparam POPCOUNT_WIDTH = $clog2(INPUT_WIDTH)+1 ) ( input logic…

ChiselでMapやReduceを使ったいくつかのハードウェア記述Tips

ChiselはScalaをベースとしたハードウェア記述言語なので、Verilog-HDLではあまり見かけることのない記述ができる。 最近使っているChiselの便利な技法のいくつかをまとめてみる。 Vecの中身を.reducを使ってリダクションする Vecにはreductionなどの記法が…

SystemVerilogで記述されたRISC-VプロセッサArianeのフロントエンドの構成

SystemVerilogで記述されたRISC-VプロセッサArianeについて解析を進めている。 まずはフロントエンドから。フロントエンドは命令をフェッチするところだが、以下のようなサブモジュールで構成される。 instr_realign : 命令アライナ。命令フェッチ時に命令の…

SystemVerilogで記述されたRISC-VプロセッサArianeの回路面積解析

SystemVerilogで記述されたRISC-VプロセッサArianeについて解析を進めている。回路面積が大きいという話で、実際にどれくらいのサイズなのか見てみることにした。 github.com 上記を使用している。FPGAの合成には、リポジトリをダウンロードした上でmake fpg…

RISC-V Vector Extension 0.7.2の仕様書の日本語化を始めた (第3章まで)

RISC-V Vector Extensionは仕様が徐々に固まってきており、実装はまだ分からないがツールセットやアセンブラが徐々に公開されている。 Vector Extensionは現在でも使用がアップデートされており、特にこれまでの0.6から0.7へのアップデートはかなりの修正が…

"Digital Design with Chisel"が正式発行

"Digital Design with Chisel"の表紙 前々からChiselのメーリングリストに流れていた、Chiselの入門者的な書籍、"Digital Design with Chisel"が最終正式版になってついに発売されたらしい。 Amazonでも入手が可能だがpdfは無料公開されており、GitHubからす…

GitHubでCoremark-PROがオープンソース化されたので試してみる

https://www.eembc.org/coremark-pro/ CPUのベンチマークといえば様々なものがあるが、有名なところといえば SPEC (https://spec.org/) Standard Performance Evaluation Corperation。おそらくもっとも有名なベンチマーク。各種CPUのベンチマーク評価などで…

AWSのPythonインタフェースboto3を使用してEC2インスタンスにジョブを流し込む

AWSをコマンドラインから扱う方法についていろいろ勉強している。 最終的にはローカルマシンで実行している処理をAWSに流し込めるようになりたいが、そのためにはまずはPythonインタフェースであるboto3から、コマンドを流し込んで実行できなければならない…

AWSのPythonインタフェースboto3を使用してEC2インスタンスにコマンドを流し込む方法

AWSをコマンドラインから扱う方法についていろいろ勉強している。 最終的にはローカルマシンで実行している処理をAWSに流し込めるようになりたいが、そのためにはまずはPythonインタフェースであるboto3から、コマンドを流し込んで実行できなければならない…

AWSコマンドラインインタフェースにてS3とデータを同期する方法

AWSをコマンドラインから扱う方法についていろいろ勉強している。 例えば、ローカルマシン上のファイルやディレクトリをS3にアップロードし、それをEC2インスタンスに転送する方法などコマンドラインで実現できるようになりたい。 ローカルディレクトリのフ…

EC2インスタンスをboto3を使って立ち上げてコマンドを実行するまでの流れ

boto3を使ってEC2のインスタンスを立ち上げるところまではできるようになった。次は、立ち上げたインスタンスに対してコマンドを発行して、EC2インスタンスに任意の操作を実行できるようにする。 boto3経由でEC2インスタンスを操作するためには、SSMという機…

HotChips 2019で発表された世界最大のチップCerebras Wafer Scale Engineのホワイトペーパを読む

https://www.cerebras.net ウェブサイトより引用。 HotChips 2019の様子がTwitterで流れてきた。やはり一番大きなインパクトがあったのはCerebrasのWafer Scale Engineではないだろうか。 性能、機能性、意味はとりあえずおいておいて、そのインパクトはかな…

LLVMのバックエンドを作るための第一歩 (53. RV64 / RV32両方のサポート格闘中2)

RV64の64ビットモードでLLVMがアセンブラを生成できるように格闘している。とりあえずサンプルプログラムとして以下を用意した。 xlen64_func.cpp int64_t func() { int64_t a0 = 10; int64_t a1 = 20; int64_t ans = a0 + a1; return ans; } いろいろ奮闘し…

LLVMのバックエンドを作るための第一歩 (53. RV64 / RV32両方のサポート格闘中)

RV64の64ビットモードでLLVMがアセンブラを生成できるように格闘している。とりあえずサンプルプログラムとして以下を用意した。 xlen64_func.cpp #include <stdint.h> int64_t func() { return 0x100; } 要点としては、0x100の戻り値をint64_tのデータ型で返せるか、</stdint.h>…

AWSインスタンスをPythonで操作するためのboto3に入門する

私は普段はLLVMのビルドをローカルマシンを使って行っている。私のローカルラップトップPCはSurface Laptop2なので、LLVMをデバッグモードでビルドするのにはかなり骨が折れる(実際、ビルド中は何もできない)。 しかしサーバを購入するのはもったいないし、…

Chiselで部分代入を実現するためのいくつかのテクニック

Chiselでは、以下のようなビット列の一部に対する部分代入が許されない。 ハードウェア記述言語としてみると非常に不便だが、もともとChiselがソフトウェア記述言語Scalaがベースであるということを考えると何となく想像がつく。 val res = Wire(UInt(32.W))…

LLVMのバックエンドを作るための第一歩 (54. Compressed命令を実装する検討)

RISC-Vの命令セットは基本的に32ビット長だが、Compresed命令という16ビット長の短縮命令が定義されている。これはArmのThumb命令のようなもので、命令フェッチのサイズを減らし、性能を向上させることを目的としている。 今回はこのCompressed命令をLLVMに…

ChiselのパラメタライズによりGenericなモジュールを作成する手法

Chiselによりインタフェースのパラメタライズの検討を行う。例えば、汎用インタフェースを使用してバスのマルチプレクサを構成することを考える。 インタフェースとしては以下のものを使う。以下のGenBundleはTで汎用化されている。valid, sideband, dataの…

LLVMのバックエンドを作るための第一歩 (53. RV64 / RV32両方のサポート)

RISC-Vには32ビットモード(RV32)、64ビットモード(RV64)、128ビットモード(RV128)が定義されている。これまではRV32による32ビットのみをサポートしてきたが、RV64もサポートしたい。具体的に言えば、 RV64モードの時にレジスタ幅を64ビットとして取り扱う(…

Chiselを使ってコンフィギャラブルなモジュール設計を行う

Chiselを使うと柔軟性の高いモジュール設計が可能となる。一つの手法として、パラメータとしてクラスを渡す手法について調査した。 例えば、RISC-Vの1モジュールのPMP(Physical Memory Protection)の簡単な機能について実装を考えてみる。ただし今回はどのメ…

LLVMのバックエンドを作るための第一歩 (52. 浮動小数点のその他の命令)

比較命令以外にも、浮動小数点の様々な演算をサポートする。例えば、以下のようなものが挙げられる。 SQRT 浮動小数点符号反転 浮動小数点絶対値 符号付整数から浮動小数点への変換、符号なし整数から浮動小数点への変換 浮動小数点から符号付整数への変換、…

LLVMのオリジナルバックエンド実装をRelease 9.0のブランチに移植してみる

LLVM Release 9.0のリリースが目前だ。release_90のブランチでは日進月歩でコミットが進んでいるようだ。 github.com これまではrelease_80ブランチの上で作業していたのだが、そろそろrelease_90の上に移ってちゃんと移植できるか確かめた方が良い気がして…

高性能プロセッサの分岐予測のサーベイ論文を読んで分岐予測について学ぶ (9. ニューラル分岐予測器2)

プロセッサアーキテクチャについて再度復習その8。今回からニューラル分岐予測器。ニューラルネットを用いた分岐予測器の続き。 読んでいるのはA Survey of Techniques for Dynamic Branch Predictionという論文で、新規技術の解説ではないのだが、現在の有…

System Verilogで記述されたRISC-VコアArianeを試す (2. Arianeのキャッシュサブシステム)

Arianeは、System Verilogで記述されたインオーダの6ステージRISC-Vパイプラインプロセッサだ。 Arianeのデザインは良くできていて、System Verilogできれいに記述されている。キャッシュサブシステムなどCPUの基本構成も綺麗に設計されているので、これを機…

RustのコードをLLVM IRに変換してRISC-V LLVMバックエンドに渡してみる

RustのフロントエンドはLLVMで実装されているらしい。 Rustの文法自体は最近触っていないせいですっかり忘れてしまったが、自作LLVMバックエンドがRustの生成したLLVMを処理することができるようになれば格好いいかもしれない。 とりあえず、RustからLLVMのI…

高性能プロセッサの分岐予測のサーベイ論文を読んで分岐予測について学ぶ (8. ニューラル分岐予測器1)

プロセッサアーキテクチャについて再度復習その8。今回からニューラル分岐予測器。ニューラルネットを用いた分岐予測器。 読んでいるのはA Survey of Techniques for Dynamic Branch Predictionという論文で、新規技術の解説ではないのだが、現在の有名どこ…

LLVMのバックエンドを作るための第一歩 (51. 浮動小数点比較命令の追加)

RISC-Vには、浮動小数の比較命令命令として以下が定義されている。 funct7 rs2 rs1 funct3 rd opcode FMIN.D 0010101 rs2 rs1 000 rd 1010011 FMAX.D 0010101 rs2 rs1 001 rd 1010011 FEQ.D 1010001 rs2 rs1 010 rd 1010011 FLT.D 1010001 rs2 rs1 001 rd 10…