FPGA開発日記

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

2018-06-01から1ヶ月間の記事一覧

RISC-Vにも対応できるJTAG Debugger ARM-USB-TINY-Hを買った

Freedom SoCのデバッグをしたいので、ARMのJTAG Debuggerを購入した。だいたい5000円くらい。 Strawberry Linuxで購入できるとのことだけど、クレジットカードに対応していなくて代引きのみ。 そんなの仕事してる最中にどうやって払えっていうんだよ! とい…

高速C++コンパイラZapccの試行(2. GCC / LLVM / zapcc でのコンパイル速度比較)

zapccは先日発表されたClangをベースとしたコンパイラである。基本的な高速化の手法についてはいろんなところで公開されているのでそちらをチェックして欲しい。 サーバクライアント方式にすることで高速化を図っているということなのだが、実際にはどの程度…

AWSで動作するRISC-VデザインFireSimのカスタマイズ : オリジナルデバイスをVerilog付きでシミュレーションする

前回の記事で、どうにかFixedInputStreamが実行できるようになったが、これはテストベンチまですべてScalaで記述して常に同じ動作を繰り返す環境になっている。 これは嫌なので、Verilogなどを接続して外部から引数を渡し、自由にシミュレーションを実行でき…

SiFive社から発表されたRISC-Vコアまとめ

2018/11/01追記。だいぶ増えてきた。表更新。 2019/04/17追記。S21を追加。 U7, S7, E7 Series U74-MC U74 Standard S76-MC S76 Standard E76-MC(Main-Core) E76-MC(Sub-core) E76 Standard Core Type U74 RV64C S7 RV64IMAC RV64GC RV64GC RV64GC RV32IMAFC…

AWSで動作するRISC-VデザインFireSimのカスタマイズ : Firechipにオリジナルデバイスを追加する

FireSimについてある程度動かしたので、今度はカスタマイズをしてみたい。 というわけで、FireSimの実際のデザイン部分であるFireChipを使ってみることにした。 オリジナルのデザインを追加してみることにした。 メモリマップのレジスタを作る 参考にしたの…

AWSで動作するRISC-VデザインFireSimのカスタマイズ : Firechipを試す

FireSimについてある程度動かしたので、今度はカスタマイズをしてみたい。 というわけで、Firesimの実際のデザイン部分であるFireChipを使ってみることにした。 Tutorial: Developing New Devices — FireSim documentation まずはデザインをForkしてダウンロ…

高速C++コンパイラZapccの試行(1. 現プロジェクトのインポート)

興味本位ではあるが、高速C++コンパイラとしてオープンソース化されたZapccが非常に気になっている。 LLVMがベースとなっていることだし、いつも新しいコンパイラプラットフォームが公開されたときはRISC-Vの対応について見てしまうので、アーキテクチャの移…

Microsoftのデータフロープロセッサ EDGEの論文を読む

Twitterで知った、MicrosoftのFPGA向けのインオーダスカラプロセッサの論文が出ている。ターゲットとしてはデータフロー処理だ。 プロセッサの名前としてはEDGEという。ブラウザのEdgeではなくて、Explicit Data Graph Executionの略称である。 面白そうなの…

AWS上で動作するRISC-VチップFireSimのチュートリアルを試す 4. Single Core Roctket-Chipの動作

FireSimのチュートリアルを試す続き。前回はなぜかFireSimが起動せずに終わった。 色々調べていくと、FireSimを立ち上げる際のF1インスタンスの設定で、t1.nanoで生成したVPCとサブネットを使用しなければならなかった。 AWSコンソール上でこれを確認してF1…

AWS上で動作するRISC-VチップFireSimのチュートリアルを試す 3. ソフトウェアのビルドと環境設定

AWSで動作するRISC-Vシミュレーション環境FireSimのチュートリアルその3. F1インスタンスにアクセスするために、生成したキーペアのfiresim.pemをホームディレクトリに配置しておく。 また、sshのキーと同様に、chmod 600 しておく。 $ chmod 600 ~/firesim…

Ubuntu 18.04でsbtが動かない問題(というか結果的にRocket-Chipが動かない問題)を何とかする

Ubuntuが18.04 LTSになって、さっそくバージョンアップしてRISC-Vの環境を構築しようとしたのだけれども問題にぶち当たった。 RISCV-Toolsは以下のエントリでインストールの試行はしていたし、うまく行くことは確認していたのだけれども、Rocket-Chipの試行…

Spectre & Meltdown を防ぐマイクロアーキテクチャSafeSpecの論文を読む

CPU

Hisa Ando氏のブログで知ったのだが、Spectre & Meltdownを防ぐマイクロアーキテクチャとしてSafeSpecという技術が発表されたので、これを読んでみることにした。 2.SpectreやMeltdownを防ぐSafeSpecマイクロアーキテクチャ 20180616 Boffins offer to mak…

TensorFlow+Kerasに入門(4. Keras2のConvolution2DとConv2Dの違い?)

FPGAの部屋のmarseeさんの記事を見て、TensorFlow+Kerasに入門してみた。 というかmarseeさんの記事で掲載されているソースコードをほとんどCopy & Pasteして実行してみているだけだが... TensorFlow+KerasでCifar10を学習するサンプルプログラムを実行して…

AWS上で動作するRISC-VチップFireSimのチュートリアルを試す 2. インスタンスの設定とAWSの起動

AWSで動作するRISC-Vシミュレーション環境FireSimのチュートリアルその2. [高度な詳細]を開き、テキストボックスに付録に示すようなテキストファイルを入力する。 ... 次にストレージを追加する。デフォルトでは75GBと設定されているが、これを300GBまで拡…

AWS上で動作するRISC-VチップFireSimのチュートリアルを試す 1. 立ち上げと参考文献

参考にしたのは以下。 Welcome to FireSim’s documentation! — FireSim documentation 初期セットアップ・インストール 最初にAWSのユーザグループを作成する。AWSのアカウントと支払を行っていればこのステップを実行する必要はない。 アカウントに必要なAW…

RISC-V SpikeシミュレータでC/C++のprintfを実現する仕組み (5. システムコールの呼び出し)

Hello Worldのプログラムを動かしながら、RISC-V Spikeシミュレータのログを追っていき、RISC-Vのブートシーケンスを追っていく、その2。 今回はRISC-Vプログラムのシステムコールの呼び出し部分 Spikeシミュレータの構造を調べているのだが、printf()などの…

プロセッサのメモリコンシステンシモデルについて

プロセッサ構成はますますマルチコア化しており、同期処理や各プロセッサでの通信、データ共有をどのように行うかという問題は重要になっている。 ハードウェア・ソフトウェアには「メモリモデル」というものが定義されており、共有する変数をどのようにして…

RISC-V SpikeシミュレータでC/C++のprintfを実現する仕組み (4. RISC-Vのプログラムロード)

Hello Worldのプログラムを動かしながら、RISC-V Spikeシミュレータのログを追っていき、RISC-Vのブートシーケンスを追っていく、その2。 今回はRISC-Vプログラムのロード部分。 parse_args()により関数をコールを行う。 riscv-pk/pk/pk.c static size_t par…

RISC-V SpikeシミュレータでC/C++のprintfを実現する仕組み (3. RISC-Vのブートシーケンス)

Hello Worldのプログラムを動かしながら、RISC-V Spikeシミュレータのログを追っていき、RISC-Vのブートシーケンスを追っていく。 riscv-isa-sim/riscv/sim.cc 内のリセットベクタが最初に動作する。 riscv-isa-sim/riscv/sim.cc void sim_t::make_dtb() { .…

Elfファイルからシンボルを取り出してシミュレータでトレースを表示する機能の実装

RISC-Vシミュレータにはelfファイルを読み込ませているのだが、elfファイルにはいろんな情報が取り込まれており、例えば テキスト領域の関数のヘッダアドレス グローバルデータが格納されているアドレス などの情報が格納されている。 シミュレータは、テキ…

RISC-V SpikeシミュレータでC/C++のprintfを実現する仕組み (2. Device Tree Blobと Proxy Kernel)

RISC-Vのシミュレータは、シミュレーション対象のプログラムのElfファイル以外に、いくつかの外部ライブラリをロードしている。 RISC-V の Device Tree (SpikeのビルドにDevice Tree Compiler が必要なのはこのためだ) RISC-V の Proxy Kernel (I/Oなどの本…

分散システムのコンセンサスアルゴリズムRaftについて調査

ビットコインの勉強の最中に、コンセンサスアルゴリズムについていろいろと調べていたのだが、じゃあ一般的に分散システムでコンセンサスってどうやってとるんだろう?ということに興味をもってコンセンサスアルゴリズムというものを知った。 最初は、ちょっ…

TensorFlow+Kerasに入門(3. Keras2cppでCIFAR10のモデルを変換してみる)

FPGAの部屋のmarseeさんの記事を見て、TensorFlow+Kerasに入門してみた。 というかmarseeさんの記事で掲載されているソースコードをほとんどCopy & Pasteして実行してみているだけだが... TensorFlow+KerasでCifar10を学習するサンプルプログラムを実行して…

RISC-VのCompressed命令のISS実装 (2. RV64/RV32の両デコード対応)

RISC-VのCompressed命令について理解したので、自作ISSへの実装を進めた。 Compressed 命令の仕様については以下のまとめた。 msyksphinz.hatenablog.com 前回のRV64版のCompressed命令の実装についてはとりあえず終わったので、次はRV32版のCompressed命令…

RISC-VのCompressed命令のISS実装 (1)

RISC-VのCompressed命令について理解したので、自作ISSへの実装を進めた。 Compressed 命令の仕様については以下のまとめた。 msyksphinz.hatenablog.com というわけで、実装自体はテンプレートに従って追加していったのだが、いくつか注意しなければならな…

TensorFlow+Kerasに入門(2. Keras2cppを試行)

FPGAの部屋のmarseeさんの記事を見て、TensorFlow+Kerasに入門してみた。 というかmarseeさんの記事で掲載されているソースコードをほとんどCopy & Pasteして実行してみているだけだが... 前回でKerasでMNISTの学習ができるようになったので、次はモデルをJS…

「ブロックチェーン・プログラミング」を読む (ビットコイン送金を体験)

「ブロックチェーン・プログラミング」第2章はビットコインの基本を復習しておく。 Mastering Bitcoinを読んでいるので、ある程度理解できるのでサクサク読み進めていく。 今回は第4章の途中まで。第3章は暗号技術でちょっと難しいのでとりあえず読み飛ばす…

TensorFlow+Kerasに入門(1. 環境構築+サンプルコード実行)

FPGAの部屋のmarseeさんの記事を見て、TensorFlow+Kerasに入門してみた。 というかmarseeさんの記事で掲載されているソースコードをほとんどCopy & Pasteして実行してみているだけだが... 参考記事 TensorFlow + Kerasを使ってみた GitHub : yampy / machine…

「ブロックチェーン・プログラミング」を読む (ビットコインとブロックチェーンの基本)

「ブロックチェーン・プログラミング」第2章はビットコインの基本を復習しておく。 Mastering Bitcoinを読んでいるので、ある程度理解できるのでサクサク読み進めていく。 ブロックチェーン・プログラミング 仮想通貨入門 (KS情報科学専門書)作者: 山崎重一…

RISC-V SpikeシミュレータでC/C++のprintfを実現する仕組み (1. RISC-V バイナリの解析)

RISC-V Spikeシミュレータでは printf() や std::cout を使ってもコンソールで出力することができる。 test_output.c #include <stdio.h> int main () { printf ("Hello World, C\n"); return 0; } test_output.cpp #include <iostream> int main () { std::cout << "Hello Worl</iostream></stdio.h>…