<   2017年 01月 ( 16 )   > この月の画像一覧

だいぶ放置しちゃったけど、ついに V-scale chip on Arty でも kozos が動きました。
なんとなく AHB のアービタがダメなのは分かっていたのですが、よく見ると、そのダメなところを CPU でカバーしていました。おかげで1サイクル余分にストールするし、ディレイも増大していました。この時 に CPU を直したのが根本的に間違っているのですが、その直し方も不十分だったみたい。CPU を追加修正したら、一応動くようになりました。しかし、ISA テストのパタンでも Fail するのに、なんでちゃんと解析してなかったんだろうか?
ちなみに間違いの内容は、競合があったときに負けた方のマスタを待たせるんだけど、肝心のリクエストは消えちゃって再発行されないって感じです。
やはりここは、ちゃんと vscale-xbar を直すべきだとは思うのですが、ちゃんと動くように直せない。ディレイもどんどん増加していきます。
とりあえず現状で妥協して、vscalevscale-chip を更新しました。

プロンプトが出てきたら、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 | 2017-01-14 23:00 | PCとか | Trackback | Comments(0)
もともと Verilator で動いていたんだから簡単に復活できると思っていました。
でも、Intel-HEX を読むように変えたときに SystemVerilog の機能(sscanf)を使っていて、その部分が Verilator では使えませんでした。Verilator は SystemVerilog に対応しているはずですが、そもそも合成可能な Verilog しか対象にしていないはずなので、テストベンチ用の機能が使えなくても文句は言えません。readmemh とかが使えていたので、変な期待をしちゃっていました。
仕方がないので、C++ のテストベンチから無理やりメモリに書き込みます。メモリの実体を RTL から変換したファイル sim/Vvscale_verilator_top.h の中から探します。↓かな?
VL_SIG(v__DOT__DUT__DOT__hasti_mem__DOT__mem[65536],31,0);
階層は全部崩されちゃうんですかね?C++ のテストベンチからは↓のようにして書き込むことが出来ました。
verilator_top->v__DOT__DUT__DOT__hasti_mem__DOT__mem[addr] = op;
実際はエンディアン変換していてぐちゃぐちゃしてるけど。
そんなわけで無事復活したので、ここ を更新しました。Verilator ってむちゃくちゃ速くて感動しますね。でも、gtkwave が使い慣れていないのであんまり使わないと思うけど。
[追記 Verilator の新しいバージョンでは最上位階層のインスタンス名が変わっていたので対応しました。]

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

CORDIC も作ってみた

ついでに CORDIC も作ってみました。でもV-scale には FPU が付いていないので、仮に追加するとしてもかなり先のことになると思います。
CORDIC で sin, cos, atan2 を計算します。CORDIC のアルゴリズムに興味があれば、適当にググってください。RTL の実装ですが、CORDIC の部分自体は簡単でした。ただ、前処理、後処理がたくさん必要になりそうです。
sin, cos の CORDIC への入力は 0~PI/2 です。それ以外の場合は前後に処理が必要です。まあ前処理でも、-PI~PI ぐらいしか対応しないでしょうね。それ以外は Invalid にするのが妥当かと思います。
atan2 の CORDIC への入力は x>=0, y>=0 で、アラインして入力する必要があります。後処理は以下。なぜ +PI なのかは理解していない。
if(x<0){r=-r+M_PI;}
if(y<0){r=-r;}
前処理、後処理と、入力データ生成部分、期待値生成と比較を c で書いています。atan の苦労は9割がたはテストベンチ側にありました。でも、こんな設計には Verilator がとっても役に立ちますね。結果は ここ に追加して置いておきます。mul_div とはまだ混ぜません。
ちなみに ここの Mixing C and assembler なんかを見ると、コンパイラに命令追加できなくても C 言語から追加命令が呼べそうな気がします。

[PR]
by tom01h | 2017-01-10 23:07 | PCとか | Trackback | Comments(0)
新しい乗算・除算器を組み込んで、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)

すごく寒い

なんか最近寒くて寝付かれない。朝風呂(夜入らない)が悪いのは分かっているが変えられない。なので、こんなのを買ってみた。寝る前に足をなるべく冷やさないためと、布団に入ったらすぐに温かくするためです。一度冷たくなくなったらもう大丈夫なので、温かさ7時間とか必要ないんですけどね。ズボンの上から履くニーソみたいなのは足が出せるようになっています。レンチンする湯たんぽは毎回袋から出して温めるとか面倒なことを言っています。
f0054075_19181062.jpgf0054075_19181016.jpg

[PR]
by tom01h | 2017-01-08 19:26 | 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)