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

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)
ブレークポイントは特権マニュアルの1.9.1に追加されたレジスタ tselect を使っているんだけど、アドレス以外にこのレジスタの機能が書いていない。で、なぜか SiFive のホームページにおいてある デバッグマニュアル に書いてありそうな感じ。とりあえず後回しにする。
で、命令ミスアラインアクセス。なんとなく(メモリからのエラーを)処理するコードがあるけど、発生源がない模様。メモリの前に追加してみたけどパスしない。マニュアルを読んでみると、メモリから帰ってくるエラーは Instruction access fault で、Instruction address misaligned を発生するのは分岐命令自身の様だ。で、分岐命令もキャンセルされなくてはならないみたいです。なので、分岐命令に例外発生条件追加。
データアクセス側も同様に例外発生条件を追加して 2本パス。残るはブレークポイントだけになりました。

[PR]
by tom01h | 2016-12-02 00:05 | PCとか | Trackback | Comments(0)
V-scale のマシンモードパタンを通すために、mstatus レジスタを実装した。いや、正確にはビットアサインが変わっていたのを直したので9割、他にもちょっと機能を足したけど… で、4本のパタンがパス。
即値でシフト量を渡すシフト命令のシフト量が32を超える場合を直してもう1本パス。
残るはミスアラインメモリアクセス例外2本とブレークポイントの合わせて3本。
でも、ちゃんとマニュアル読んでないから、他にも直す必要ありそうな気がする…

[PR]
by tom01h | 2016-11-29 22:52 | PCとか | Trackback | Comments(0)
先日、マシンモードのパタン9本を試してみると、3本パス、3本フェイル、3本終了せずだったのですが、よく見ると、本当はパスじゃないものもいくつかある事に気づきました。まずは illegal_csr_access の論理ループをぶった切った暫定修正をちゃんと直すべきみたいです。
直してみたら… なんか、ユーザモードでマシンモードのレジスタにアクセスするパタンがある。意味わからん。と思ったら、mstatus レジスタの意味が分かっていないらしいです。次は、ここをちゃんと作ろうと思います。
ちなみに、スーパバイザの stvec を触っているのはパタンのバグだよねぇ。

[PR]
by tom01h | 2016-11-28 00:26 | PCとか | Trackback | Comments(0)
V-scale で遊びたいんだけど、なんとなく古いアーキテクチャのまま取り残されているように見える。test/ に入っている hex ファイルしか実行できない CPU ではつまらないので、riscv-tests リポジトリの RV32IM のユーザモードのテストくらいはパスするように改造する。
その前に、入力ファイルの生成方法がわからなかったので、読み込むファイルの形式を ihex に変更した。
リセットベクタが変わっていたり、システムレジスタのアドレスが変わっていて、なかなか本来のテストまで届かない。意味の分からないレジスタも、とりあえず isa のパタンが通れば良い程度の変更をした。で、やっとテストが始まると、テスト部分はあっさり通過。だが、終了方法も変わっている模様。そこまで直すとやっとパスした。
1本通ると、他の全部のテストもパスしました。まあ、基本的なところは変わっていないってことか。
特権マニュアルちゃんと読んで変更分反映しないとダメかな?こういうのつまらないんだよなぁ。
現状版を GitHub に公開しました。
[追記] rv32mi-* の9本を試してみると、3本パス、3本フェイル、3本終了せずでした。ここから手を付けるか。

[PR]
by tom01h | 2016-11-26 20:59 | PCとか | Trackback | Comments(0)

V-scale

V-scale を落としてきてみた。RISC-V のマイコン級インプリの Z-scale を Verilog で書いたものです。Z-scale は見てないし、自動生成なのか、手で最適化したのかも知りません。とにかく、実行してみた。VCS と Verilator の実行環境が入っている。もちろん VCS なんて持っていないので Verilator で試してみると、大量の .vcd ファイルが出た。別の PC に gtkwave が入っているので見ることはできるけど、これ、波形確認しか手はないのかな?最近は ModelSim の波形 Viewer に慣れているので ModelSim でも流れるようにしてみたんだけど、イベントループでも起きてるの?
# ** Error (suppressible): (vsim-3601) Iteration limit 5000 reached at time 255 ps.
入力は .hex ファイルしかない。tests から作ったようにも見えるけど、アドレスが結構違う。どこで問題が起きているのかさっぱりわからん。
仕方ないので、Verilator の波形と比べてみると、マシンモードからユーザモードに移る手前で落ちているように見えます。これ、まじめに追うかどうか、悩みどころだなぁ。

[追記
csrw mepc で mepc をセット
csrr で何かをリード (待ち合わせかなにかと思う)
eret でユーザモードに移行しつつ mepc にジャンプ (eret は古いらしい 今は mret であるべき)

の命令列の scrr で止まっているみたい。
なので、この命令を無害な命令に書き換えてみたら最後の方まで進んだ。
でも、最後にマシンモードに戻ってから tohost 番地への書き込みあたりでやっぱりイベントループの模様。]
[追記2 とりあえず illegal_csr_access をぶった切ってみたら最後まで行きました。]

[PR]
by tom01h | 2016-11-03 17:06 | PCとか | Trackback | Comments(0)