<   2016年 12月 ( 15 )   > この月の画像一覧

V-scale 開発環境の構築

V-scale を動かすのに最低限必要なもの。
V-scale 本体は、本家 UCB のが ここ にあって、僕が fork していじくっているのが ここ にあります。本家の物は最新バージョンの開発環境や tests では動きません。
開発環境は GNU Compiler Toolchain です。まあ、とにかくでかい。前回は普通に(RV64Gで?)コンパイルしたのですが、今回は RV32IM で作ります。RV64G で作っても gcc -m32 で elf32-littleriscv ができていたみたいですけどね。make してみると riscv32-unknown-elf-* になりました。まあ良いか。だめだ。tests が作れない。やっぱり RV64G で作っておく。
そして、以下のようなエラーが出ます。
./configure --prefix=/opt/riscv --with-arch=rv32im --with-abi=ilp32
sudo make
fatal error: zlib.h: そのようなファイルやディレクトリはありません
やりなおし
sudo apt-get install zlib1g-dev
sudo make
なんで続きやらずに1からやり直すんだろう…
つぎに ISA のテストに使う riscv-tests をとってきます。使うのは rv32mi, rv32ui, rv32um 辺りかな。アセンブラの引数チェックが厳しくなったのか、以下のファイルに修正が必要になりました。ってか、除算系は今まで意味のあるチェックが出来ていなかったっぽい。[追記 ゼロ除算の特殊処理が出来ていなくて商を間違うのですが、tests のバグで見つかっていませんでした。mul-div を高速版に差し替えるとともに修正しました。]
modified: isa/rv32um/div.S
modified: isa/rv32um/rem.S
modified: isa/rv32um/remu.S
modified: isa/rv64ui/sll.S
modified: isa/rv64ui/slli.S
modified: isa/rv64ui/srai.S
本家 V-scale のリポジトリには、いつの頃のか分からないけど、論理と対応した tests も入っています。マシンモードがすごく弱いけど、昔はこうだったのかな?僕のリポジトリにも比較的新しめのを入れてあります。どちらも、変換済みの物だけですけどね。[追記 僕のリポジトリには、インストール済みの tests から ihex を生成するための Makefile (かなり格好悪い記述だけど)を追加しておきました。]
ここから先はお好みで。
命令セットエミュレータはたくさん有るけど、一番最初に目に留まった spike を。それぞれが何なのかよくわかりませんが、次の3点セットです。 Frontend ServerISA Simulatorpk
ほかにも 新しいエミュレータ が出ているみたいなので、今度試してみたいと思っています。
さらに、いろいろとお手本になると思われるので、V-scale とは直接関係ないけど Rocket Chip Generator もあると良いと思います。でも、現状の WSL では Java に問題があるらしくって、chisel を動かすことができないみたいです。

[PR]
by tom01h | 2016-12-29 16:32 | PCとか | Trackback | Comments(0)

FPGA プログラミング大全

買ってみました。まだ全然読んでないけど。
Xilinx 用の本なんだけど、ちょっと古い本だと ISE のことを書いてあるので役に立たないんですよね。これは新しくって Vivado で書いてあります。しかも HLS のことも(たぶん使うことはないけど)書いてあるし、ロジックアナライザのことが書いてあるのが嬉しいです。いろいろなツールが無償化されて便利になりました。
f0054075_18471220.jpg

[PR]
by tom01h | 2016-12-25 18:50 | 本・映画など | Trackback | Comments(0)

カグラ

日帰りでカグラへ行きました。天気悪い。風はそれほど強くなくて、リフトはちゃんと動いていたけど。
雪はちゃんとついていたけど、まだ薄いのかな?整地が不十分で、滑りにくかったです。それと、重たい雪でとっても疲れました。

[PR]
by tom01h | 2016-12-24 23:59 | スキー | Trackback | Comments(0)

kozos on V-scale chip on ARTY

ARTY という FPGA ボード上に V-scale chip を実装して kozos という小さな OS を動かしたいっていうお話です。
ARTY は DIGILENT 社の FPGA ボードで、Xilinx 社の Artix 7 という FPGA が載っています。ここ とか ここ で1.6万円くらいで売っています。この FPGA 上に V-scale chip を載せます。ボード上には FPGA 以外にもいろいろな機能が載っているのですが、もったいないことに USB-UART くらいしか使っていません。この USB-UART チップを通して、V-scale chip の UART とパソコンの間で通信をします。↓こんなのです。
f0054075_20595195.jpg
V-scale chip は、先日紹介した V-scale という RISC-V アーキテクチャのマイコンを搭載します。マイコン以外は命令用とデータ用にシングルポート SRAM を2個と UART を搭載します。SRAM は各 16KB で、V-scale の I-Bus, D-Bus どちらからでもアクセスできます。ただし、競合によるバスストールを避けるためには命令とデータは明確に分離すべきでしょう。UART は TX,RX 用にそれぞれ4バイトの FIFO を持ちます。バスマスタ機能や割り込み発生機能は持ちません。ブロック図は下のような感じです。
f0054075_17094555.png

kozos は 組み込みOS自作入門 という本の中で作り上げていく、とても小さな OS です。もともとは H8 マイコンボード用なのですが、これを V-scale chip 向けに移植しています。OS(というかブートローダ)には次の機能があります
  1. UART を通してパソコンと通信する
  2. プロンプトを表示して、入力されたコマンドを解釈する
  3. XMODEM プロトコルで、ファイルを転送する
  4. 転送された ELF ファイルを展開して、マイコン上で実行する
本来はもっといろいろな機能があるのですが、現状はステップ6までで実現される、上の機能で満足しています。
ちゃんとは動かないけど、V-scale chip と共に ここ に公開しました。

[ぎりぎり動くようになったので追記]
[追記 AHBとはなんか違うプロトコルで動いていましたが、この度修正出来ました。]
プロンプトが出てきたら、load[改行]と打ってから、XMODEM でファイルを転送します。ここで ELF ファイルを転送すると、次の run コマンドでプログラムを実行できます。
kzload (kozos boot loader) started.
kzload> load
XMODEM receive succeeded.
dump[改行]と打つと、転送したファイルの HEXDUMP が表示されます。
run[改行]で、転送したファイル(ELF形式)を展開して実行します。
kzload> run
starting from entry point: 1900
Hello World!
>
サンプルプログラムは src/main/c/os/ 以下にあります。サンプルプログラムでは echo コマンドが使えます。転送するファイルは ELF をストリップした kozos です。ライブラリはすべて自作で、lib.c の物しか使えません。また、オリジナルでは 8kB 位までしか動かないそうです。vscale-chip ではアドレスマップを大幅変更しているのでよく分かりませんが、大体同じくらいの制限かと思います(^^;

[PR]
by tom01h | 2016-12-22 00:00 | PCとか | Trackback | Comments(0)

V-scale に関して今持っている知識をまとめてみる。
V-scale は U.C.バークレーの実装したマイコン級の RISC-V です。U.C.バークレーは、速い方から BOOM、rocket、Z-scale/V-scale の3種類のコアを実装しています。そこら辺の話は ここ が詳しいです。V-scale 以外は、やはり U.C.B. の開発した言語 Chisel で記述されています。V-scaleZ-scale の Verilog 記述という位置付けです。Chisel から Verilog への変換ツールが提供されているのですが、V-scale は自動生成の Verilog という事ではないみたいで、手で書いた Verilog に見えます。
あまり詳しいことは書いていないですが、こんな資料 が公開されています。
では特徴。
  1. 対応するアーキテクチャは RV32IM で、特権レベルはマシンモードとユーザモードに対応。ただし、最新のアーキテクチャには追い付いていない。
  2. 3段パイプ、インオーダのシングルスカラパイプライン構成。演算結果の書き戻しは WB ステージの最後で、1ステージで演算の終わる命令は、 WB ステージから EX ステージにバイパスされます。
  3. 分岐予測機構は持たず、分岐発生時は1サイクルストールします。
  4. メモリアクセスポートは命令とデータに分かれた2本の口を持っていて、シミュレーション環境では1個のデュアルポートメモリに接続しています。
  5. 乗算と除算は1サイクルに1ビットの計算をします。演算中は、ハザードがなくてもびしっとパイプを全部止めます。
また、例外に関しては途中で投げ出したのか、受け側(パイプライン側)の実装は完了していますが、発生側は illegal instruction, illegal CSR access 以外は未実装か間違っている。上記のような贅沢なメモリでしか検証していないのか、メモリアクセスウェートでバグあり、挙句の果てにメモリモデルにまで… 話がそれた。
とまぁ、問題はいろいろあるのですが、少々手を入れて CoreMark を測ってみました。メモリは上記の理想的すぎるメモリです。計測結果は以下。3段パイプのくせに遅すぎると思って、32+αサイクルかかる乗算を4サイクルに変更してみました。もちろん、この場限りのいい加減な記述ですが…
  • 遅い乗算器 IPC=0.45 1.48CMK/MHz
  • 4サイクル乗算器 IPC=0.77 2.54CMK/MHz
3段パイプなんだから、これくらい出て欲しいよね。でも、もし計測間違っていたらごめんなさい。
こんな感じの V-scale を育ててみようと思ったのが これ です。Windows insider + Bash on Windows + ModelSim という特殊な環境用なので参入障壁高めですが。しかもまだ手を付けたばかりなのに、すでに減速気味です…

[PR]
by tom01h | 2016-12-21 00:00 | PCとか | Trackback | Comments(0)
まさに安物買いの… なのですが、Inspiron11 を購入しました。お正月に向けて、V-scale の開発はモバイル環境が良いかなぁと思って。
f0054075_21360985.jpg
まずは Insider Program に参加します。Slow Ring で登録しました。これは、Bash on Windows から Windows のコマンド実行を可能とするためです。
次に、Bash on Windows を使うために開発者モードに設定します。そして、プログラムと機能から Windows Subsystem for Linux を有効化。コマンドプロンプトから bash と打ち込むとインストールされます。Bash on Ubuntu on Windows ってアイコンが出来ています。
Ctrl と Caps の入れ替えは regedit を使う方法では出来なくなっていたので、ctrl2caps を MS からダウンロードしてきて使います。/etc/passwd を書き換えて、ホームを Windows のホームに移します。Emacs 用に Windows 側にも HOME を設定します(システムの詳細設定から)。そして、.emacs とか .bashrc とかを古い環境からコピーします。
エディタは Windows 用の Emacs を使います。emacs-24.5-shared-libgcc.zip をダウンロードしてきて、C:\ で解きます。
Quartus Prime Lite Edition の中から ModelSim-Intel FPGA Edition をインストール。Altera が Intel に買収されてすごい名前になりましたね。やっぱり変わっているインストールパスを PATH に追加します。
[Verilator 追記
Veriloator のインストールは公式サイトに書いてある通りでOKです。Ubuntu でもパッケージの配布があるので便利ですが、そっちはバージョンがちょっと古いので Makefile から "--l2-name v" オプションを削除してください。]
[さらに追記 Verilator で巨大な波形ファイルを取得する場合、何やらウイルス監視ソフトが頑張り過ぎちゃうようです。とっても時間がかかるようなので、フォルダごと監視対象から除外しちゃいました。]
それと Vivado をインストールして、ARTY のボードファイルをコピーします。さらに TeraTerm を入れると、FPGA 環境は完成です。Vivado 用の USB ドライバも、FTDI の USB-UART ドライバも、Vivado と一緒にインストールされるんですかね?個別にインストールする必要はなくなっているみたいです。
次回は V-scale 環境を構築します。ただし、Bash on Windows では Chesel は動かないみたいです。

[PR]
by tom01h | 2016-12-19 21:56 | PCとか | Trackback | Comments(0)

初滑り

1泊2日で志賀高原に初滑りに行きました。
雪もそれなりにちゃんとあって、天気も良く、ゲレンデも混雑して無くて快適でした。
ただ、初すべり期間で動いてないリフトが多かったけど。
今シーズンも何かつかめると良いな。
ブーツは痛くならなくて、快適でした。

[PR]
by tom01h | 2016-12-17 23:59 | スキー | Trackback | Comments(0)
昨日の続き。いかにハードウェアの実装を効率化するかという妄想の話です。
SRAM 上に レジスタを実現すると下の図の様になるのでしょう。面倒なので省略していますが、アドレス空間は32です。
f0054075_12444952.png
そしてベクトル長を2倍にすると下の図。アドレス空間は64に増えます。同じ SRAM を 4個積んでいるので、エレメント番号が飛んでいます。データサイズを混在させると無駄が目立ちますね。
f0054075_21371711.png
なので、下のような配置に変えてみる。無駄なのは変わらないじゃんって思うでしょ?実はここで言及している無駄は、メモリセルの無駄じゃなくて、読み書きポートの無駄なのです。上の配置だと、たとえデータサイズが 32bit 同士の演算でも 1回の演算で 2個のデータを扱えません。下なら可能です。
f0054075_21375044.png
あ、レジスタ番号は小さい方から順に小さいサイズを割り当てるんだった。面倒だから、もう図は直さないけど…

[PR]
by tom01h | 2016-12-16 20:33 | PCとか | Trackback | Comments(0)
RISC-V ワークショップで、去年今年 の連続でベクトル拡張について発表されています。細かいことはまだ決まっていないのかな?概念的なことしか発表されてないし、よく理解できないところもあるので、想像したことを書いてみることにした。
まず、初期設定としてソフトが必要とするベクタ長(ループ回数)の AVL とハードウエアの対応できる最大のベクタ長 MVL を決める。MVL は vcmaxw/vcnpred へのCSR書き込みで決まると書いてある。レジスタが 64bit*4Way の長さを持っていて、 vcmaxw が32bit だと、MVL は 8 になるんだと思う。
さらに初期設定として、vcfgd 命令?でループ中で使うレジスタセットを定義する。去年のスライドを見ると、例えばループ中で2本しかレジスタを使わない場合は 32/2=16 倍の長さのベクタ長もサポートしそうに思える。変わったのかな。

そしてループに突入。
まず、AVL の残りと MVL を比較して今回のベクトル長 vl を決める。まぁ、AVL が大きいときは vl=MVL となる。
ループ中のベクトル命令は、この vl の長さで実行される。

最後に AVL の残りから vl を引いて、結果が0になればループを抜ける。
命令実行の流れとしてはこんな感じと思われる。

ハードの実装の話は、去年のスライドにしかないが、レジスタを SRAM で作ると書いてある。複数サイクルかけてレジスタを読むらしい。で、エレメントごとに別の SRAM を準備して、パイプライン化する仕組みだ。スライドで上がっている例では SRAM の数と演算器の数の比がいまいちな構成に感じたのでそこは変えているけど、下の図のような感じで動くのかな?幅広で浅い SRAM をたくさん積むのって、デメリット大きな気がするんだけど。エレメント数の数倍のベクトル長にすれば SRAM のメリット出てくる?
複数サイクル命令って、RISC の思想とあまり合わないような気もするんだけどね。
f0054075_21290966.png
ちなみにパイプライン長は長くても、同じエレメントにしかデータ依存関係はないはずなので、ハードの構成は単純になるはずです。

[PR]
by tom01h | 2016-12-15 21:40 | PCとか | Trackback | Comments(0)
kozos では、データ領域(初期値のある静的変数)を起動時に ROM から SRAM にコピーするのですが、そのサイズをリンカスクリプトで定義しているシンボルから拾っています。この数字がまた、今までとちょっと変わったみたい。
リンカスクリプトには↓のように書いているのだけど、edata≠bbs_start なんです。プログラムの方は同じ値を期待しているようで、コピーサイズが ”(long)&edata - (long)&data_start” なので、最後の1個がコピーされないのが原因でした。
なんでこういう微妙な違いがあるのかなぁ?
で、データ領域初期化はできたけど、XMODEM は動かない… 前にループが足りなかった時と同じ動きだ。今回は時間延ばしただけじゃ動かなかったけど…

.data : {
data_start = . ;
*(.data)
edata = . ;
} > data AT> rom
.bss : {
bss_start = . ;
*(.bss)
*(COMMON)
ebss = . ;
} > data AT> rom
. = ALIGN(4);
_end = . ;

[PR]
by tom01h | 2016-12-11 21:27 | PCとか | Trackback | Comments(0)