タグ:V-scale ( 45 ) タグの人気記事

新しい乗算・除算器を組み込んで、V-scale chip で FPGA の合成をしてみました。左が修正前、右が修正後です。500LUT 増加ってどのくらいなんだろう?割合でみると結構大きいですね。分母はコアじゃなくてチップですからねぇ。
f0054075_22380150.pngf0054075_22380145.png

そして、ワーストスラックは若干ながら改善していました。確かに mul_div が始点だったんですが、FF出しに見えたんだけどなぁ。
CoreMark も再測定しました。ちなみに 4サイクル乗算器はインチキ RTL 記述です。
  • オリジナル IPC=0.45 1.48CMK/MHz
  • 4サイクル乗算器 IPC=0.77 2.54CMK/MHz
  • 新演算器 IPC=0.73 2.43CMK/MHz
除算の高速化の影響よりも、乗算+1の影響のほうが大きいみたいですね。あとは除算用のプレシフトかな?ノーマライザ入れておけば、FPU積み込む事があったら使えそうだし。
よく見ると+1サイクルストールしています。まぁでも、これは必要なストールかな。
[追記 モジュール別のサイズを見つけました。synth後、imple前の物ですけど。ば、倍増か…]
[追記2 それ以前にラッチ推定があったので直しました(^^;]
変更後
+------+----------------+-----------------+------+
| |Instance |Module |Cells |
+------+----------------+-----------------+------+
|1 |top | | 5044|
|17 | vscale |vscale_core | 4485|
|18 | pipeline |vscale_pipeline | 4482|
|19 | csr |vscale_csr_file | 1567|
|20 | ctrl |vscale_ctrl | 1045|
|21 | imm_gen |vscale_imm_gen | 1|
|22 | md |vscale_mul_div | 1430|
|23 | regfile |vscale_regfile | 60|
|24 | src_a_mux |vscale_src_a_mux | 32|
|25 | src_b_mux |vscale_src_b_mux | 37|
変更前
+------+----------------+-----------------+------+
| |Instance |Module |Cells |
+------+----------------+-----------------+------+

|1 |top | | 4475|
|17 | vscale |vscale_core | 3916|
|18 | pipeline |vscale_pipeline | 3913|
|19 | csr |vscale_csr_file | 1562|
|20 | ctrl |vscale_ctrl | 1135|
|21 | imm_gen |vscale_imm_gen | 1|
|22 | md |vscale_mul_div | 777|
|23 | regfile |vscale_regfile | 60|
|24 | src_a_mux |vscale_src_a_mux | 32|
|25 | src_b_mux |vscale_src_b_mux | 37|


[PR]
by tom01h | 2017-01-09 10:07 | PCとか | Trackback | Comments(0)

乗算・除算器

遅くなりましたが、あけましておめでとうございます。
V-scale chip の FPGA ボードが動かないまま、バグの見当が付いているのに放置したままですが、題の通り別のことに興味が行っています。そういえば、除算のバグらしきものも発見したのだったけど、やっぱり放置しています[こっちはついでに直しました。]。
そもそもは CORDIC で sin/cos/arctan を求めようって話だったのですが、
CORDIC には加算器3個要るらしい→2bit/サイクル除算器と回路共用できるね→そういえば V-scale の乗算すごく遅かったな
って思考をたどって、V-scale 用にちょっと高速な乗算・除算器を作ってみようと思っています。
こんな感じでちょっとだけ贅沢に資源を積み込みます。
f0054075_17390349.png
乗算器の色の区別はこんな感じです。
f0054075_21062708.png
[完成したのでちょっと変更
Verilog にしてみると こんな感じ です。verilator で検証環境を作ってみました。
Divide by Zero のバグも併せて直して、vscale を更新しました。]

[PR]
by tom01h | 2017-01-05 22:28 | PCとか | Trackback | Comments(0)

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)

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)
昨日の続き。いかにハードウェアの実装を効率化するかという妄想の話です。
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)
組み込みOS自作本 の H8 から SH2 用に移植して使ってた kozos を、今度は RISC-V に移植したい。
Makefile だの、リンカスクリプトだの変更して make してみたけど、リンク時にシンボルがないって言われる。本によると、c言語で定義したシンボルは、リンカとかアセンブラからは頭に _ が付いて見えるとのことで、本のソースもそうなっていてそれで良い。
問題はその逆で、リンカスクリプトではシンボルは定義の時に _ を付けておいて、c から参照すると _ が取れるのかどうかと言う問題。本の中と、今まで使っていた SH2 用の環境では取れる。RISC-V 用だと _ が勝手に取れることはないみたいで、シンボルが未定義って文句言われた。リンカスクリプト上の定義から _ を外したら make できた。gcc のバージョンも違うから、そのせいかもしれないが。
で、FPGA で動かしてみたら、今度は puts が最初の1文字しか出さない模様。検証中……
[追記 DXステージストールと命令バスストール競合時のバグでした。ここ対策したら1行出したところでリセット起きている模様…
命令バスストールしても命令フェッチアドレスが更新されちゃうのが原因でした。バスストール周りのバグ多いですねぇ。ここ直したら、ちゃんとプロンプトが出るようになった。
でも、dump コマンドで size=-1 になりません。データ領域(初期値のある静的変数)の初期化がうまくいっていないんだろうなぁ。]

[PR]
by tom01h | 2016-12-08 07:44 | PCとか | Trackback | Comments(0)
V-scale には命令とデータ用の2本の AHB ポートが出ています。で、どんなメモリがつながっているのか見てみると、これってデュアルポートメモリか?FPGA ならデュアルポートでも大丈夫だけど、やっぱり普通の SRAM にしたいよね。ってことで、アービタをこさえました。で、ISA 検証パタンを流してみたら、命令フェッチを待たされる時のインプリバグってるじゃん。バークレーのインプリはすごく綺麗に書いていて読みやすいんだけど、たまにバグってるね。なんか途中で投げ出したように見える。
ところで、最近まで間違っていたのですが(全部自分で作っていたからそれでも動いていた)、AHB のライトデータってデータフェーズに出すのですね。これって、かなり沢山の人が迷惑してるんじゃないかなぁ。どうしてこうなった?[追記 案の定、ライトバックバッファ付きメモリの作成に手こずりました。]
OpenCore からもらってきた UART エンジンに AHB の口をつけて、それと命令メモリ、データメモリの合わせて3スレーブと、CPUからの2マスタのクロスバーを作ってつなぐつもりです。命令メモリは命令フェッチ優先で作ろうと思っていたのに、毎サイクル命令フェッチ出るんですね。ここもいつか直したいけど、まずはデータ優先で作っておくか。

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