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

ソフトは論理のリポジトリには含まれてないんじゃないかと疑い始めました。ソフト用のリポジトリ が別にあるようです。
git clone --recursive https://github.com/sifive/freedom-e-sdk.git
またしても gnu-tools を取りに行くので途中で止めます。自前のコンパイラを使わないで済ますためのオマジナイ。
--- a/bsp/env/common.mk
+++ b/bsp/env/common.mk
@@ -25,8 +25,8 @@ INCLUDES += -I$(PLATFORM_DIR)
TOOL_DIR = $(BSP_BASE)/../toolchain/bin
-CC := $(TOOL_DIR)/riscv32-unknown-elf-gcc
-AR := $(TOOL_DIR)/riscv32-unknown-elf-ar
+CC := riscv32-unknown-elf-gcc
+AR := riscv32-unknown-elf-ar
V-scale 用に作ったコンパイラは rv32im なので、a 拡張付きで作り直します。
./configure --prefix=/opt/riscv --with-arch=rv32ima --with-abi=ilp32
sudo make
a を付けるだけなら vscale-chip と共存できると信じてます。
make して software/demo_gpio に移って Intel Hex に変換します。
make software PROGRAM=demo_gpio BOARD=freedom-e300-arty
cd software/demo_gpio
riscv32-unknown-elf-objcopy -O ihex demo_gpio demo_gpio.ihex
これを mcs ファイルの後ろにくっつけるのですが、”:00000001FF” はファイル終了マークなので削除してから連結します。で書き込んでみると… 動かん。ちょっと変更してみると動きました。00400000 が QSPI のローカルアドレスで、 20400000 がシステムから見たアドレスになるのだと思います。最後の1行は必要なさそうなので取っちゃいました。
1c1
< :020000040040BA
---
> :0200000420409A
4098c4098
< :020000040041B9
---
> :02000004204199
5834a5835
> :040000052040000097
[追記 この手変更は 明日の記事 で解決します]
ビルド済みの mcs とは、少しだけ動きが違うようです。
f0054075_22025507.png
同じ要領で dhrystone を試してみたのですが、残念ながら、キー入力を待たないようです。で、デフォルトのループ回数は大きすぎるようなので変更しました。
--- a/software/dhrystone/dhry_stubs.c
+++ b/software/dhrystone/dhry_stubs.c
@@ -11,5 +11,6 @@ long time(void)
// set the number of dhrystone iterations
void __wrap_scanf(const char* fmt, int* n)
{
- *n = 100000000;
+//*n = 100000000;
+ *n = 100000;
}
流してみると…
Dhrystone Benchmark, Version 2.1 (Language: C)
Program compiled without 'register' attribute
Please give the number of runs through the benchmark: ← ここで入力を待ってくれない
Execution starts, 100000 runs through Dhrystone
Execution ends
Final values of the variables used in the benchmark:

Microseconds for one run through Dhrystone: 40.0
Dhrystones per Second: 25000.0

Progam has exited with code:0x00000000
[追記
ちなみにビルド済みの mcs を編集して自前プログラムを走らすには、ビルド済みの mcs から プログラム部分を削除する必要があります。

まずは、mcs (Intel HEX フォーマット) ファイルの解析。
mcs は巨大すぎるので、データの行を取っ払って見通しをよくします。

grep -v ":10" freedom-e310-arty-1-0-2.mcs | less

:020(正確には:02000004)で始まるのがベースアドレスを指定する行

で、:020000040040BA 以降がプログラム部分で、それ以前が回路部分です。
プログラム部分を自前のプログラムと差し替えます。

ちなみにこれはブートアドレスが20400000の場合で、QSPIのベースアドレスを引いたアドレスが00400000で、この指定が:020000040040BAです。]

[PR]
by tom01h | 2017-04-10 00:47 | PCとか | Trackback | Comments(0)
WSL が新しくなっているかもしれないので、chisel のテストも兼ねて Freedom E310 を作ってみます。
Arty 用の E310 のマニュアルは ここ。論理は GitHub
sudo apt install default-jre
sudo apt install default-jdk

git clone https://github.com/sifive/freedom
cd freedom/
git submodule update --init --recursive ← 途中(riscv-tools)で止めたけど
make -f Makefile.e300artydevkit verilog
おや?Verilog 出てるぞ。WSL の問題、修正されたのかな?
調子に乗って FPGA 用のビルドも試してみます。Vivado は Windows 用を使うので、~/bin/vivado のシェルスクリプトを作ってみました。
cmd.exe /C C:\\Xilinx\\Vivado\\2016.4\\bin\\vivado.bat $*
環境変数がないって怒られました。ちょっと強引ですが、vivado に
cmd.exe /C C:\\Users\\tom01\\bin\\vivado.bat $*
vivado.bat に
set VSRC_TOP=c:\Users\tom01\RISC-V\freedom\builds\e300artydevkit\sifive.freedom.everywhere.e300artydevkit.E300ArtyDevKitConfig.v
set EXTRA_VSRCS=C:\Users\tom01\RISC-V\freedom\rocket-chip\vsrc\AsyncResetReg.v c:\Users\tom01\RISC-V\freedom\rocket-chip\vsrc\DebugTransportModuleJtag.v c:\Users\tom01\RISC-V\freedom\sifive-blocks\vsrc\SRLatch.v
call C:\Xilinx\Vivado\2016.4\bin\vivado.bat %*
で、ビルドが出来たみたいです。
つぎに Arty で流してみます。参考にしたのはいつもお世話になっている ここ。動きませんよ。仕方がないので、SiFive の ビルド済みファイル で試してみるとちゃんと動きました。差分を確認してみたところ、ほかにも細かな違いはありますが、大きくは ”:020000040040BA” 以降のデータが自作の方にはごっそり無いみたいです。たぶん論理はちゃんとできたけど、プログラムがないのだと思います。強引ですが、ここら辺の足りない分をコピーしてリトライするとちゃんと動きました。git submodule update を途中で止めちゃったのがいけないのでしょうね。だってとっても時間がかかるんですよ。

[PR]
by tom01h | 2017-04-09 21:33 | PCとか | Trackback | Comments(0)

Vostro にも RISC-V

Creators Update に合わせて、主力のデスクトップにも RISC-V 環境を構築中です。ついでに、Vivado も ModelSim も最新にしようかと思います。
で、ひとつ大事なことに気付きました。巨大な波形ファイルを作ると、ウイルス監視ソフトが頑張り過ぎちゃうみたいです。Verilator を使って vscale-chip をシミュレーションすると、一気に数百メガのファイルを吐き出します。それが原因か定かではないのですが、シミュレーションが終わってからプロンプトが出るまでにとっても時間がかかる。Inspiron でやっていたときは、Defender が勝手に止まっていたみたいです。Defender には監視除外の指定ができるみたいなので、フォルダごと監視から除外の指定をしちゃいました。
それにしても、やっぱり速いPCは良いなぁ。

[PR]
by tom01h | 2017-04-08 14:35 | PCとか | Trackback | Comments(0)
IEEE754 を読み直してみたら、”指数は限界なしで仮数を丸めた結果が最小値より小さい”みたいな感じなので、SoftFloatが合っているのかな? Subnormal に丸めるための丸め位置と、Tininess 検出のための丸め位置は違うってこと? Subnormal を生成するための丸めは 2段階丸めじゃなくて良いんだよね? 不安になってくるなぁ。とりあえず、手を入れていない TestFloat が Pass したから良い事にするか。

[PR]
by tom01h | 2017-02-16 22:49 | PCとか | Trackback | Comments(0)
V-scale chip シミュレータを更新しました。
  • 命令トレース出力機能を追加
  • 端末機能のローカルエコーをなくす
昨日は、XMODEM 追加だけで手いっぱいだったので…

[PR]
by tom01h | 2017-02-09 00:20 | PCとか | Trackback | Comments(0)
結構放置気味だった、V-scale chip シミュレータに XMODEM 機能を追加しました。
だらだらとしたテストベンチになっちゃいましたが、動けば良いんです。CAN には対応していませんが、CAN なんて来るわけ無いんで良いんです。
kzload は XMODEM の実装で待ち時間を作るために空のループをすごくたくさん回しています。こんなのが有るとシミュレーションがとても終わりません。うまく解決する方法が思いつかないので、#if 使ってループ回数切り替えてます。とっても格好悪いです。Makefile もかなり格好悪いです。もう、動けば何でもいいや状態です。
とりあえず検証環境が完成したので、V-scale と AHB X-bar の役割分担をちゃんと直して、無駄な命令フェッチのストールも無くしたいと思います。
こんな感じで動くのですが、エコーバックが1文字ずつにならないのが謎です。
[追記 getc は改行があるまでバッファするようです。ここに書いてました。ここには解決法も書いてあって、ローカルエコーも改行待ちも無しにするおまじないがありました。真似しました。]
~/RISC-V/vscale-chip/src/main/c/bootload$ make
[省略]
~/RISC-V/vscale-chip/src/main/c/os$ make
[省略]
~/RISC-V/vscale-chip$
make verilator-sim
[省略]
~/RISC-V/vscale-chip$ make verilator-board-test
cp src/main/c/bootload/kzload.ihex loadmem.ihex
cp src/main/c/os/kozos xmodem.dat
touch ram.data3 ram.data2 ram.data1 ram.data0
sim/Vvscale_verilator_top +max-cycles=180000 --vcdfile=tmp.vcd
Running ...
kzload (kozos boot loader) started.
kzload> load

XMODEM receive succeeded.
kzload> run
starting from entry point: 1900
Hello World!
> echo aaa
aaa
> q
rm ram.data3 ram.data2 ram.data1 ram.data0

[PR]
by tom01h | 2017-02-08 01:29 | PCとか | Trackback | Comments(0)

トレースログ

う~~ん。spike にはいつからか命令トレースを出力するオプションが付いていたみたい。そんな訳で、開発環境の話を修正しておきました。ついでに、V-scale のシミュレータにも命令トレース出力を追加しました。さらなるついでに、FPU 転送命令のバイパスも追加しました。トレース出ると、バイパス無いの気になっちゃいますので…

[PR]
by tom01h | 2017-02-01 00:29 | PCとか | Trackback | Comments(0)
FMADD の動作モデルも作ってみます。アラインは乗算結果の時は幅を広げて、加数の時はシフト量を増やします。ノーマライズは幅を広げる必要はないですが、シフト量は増やします。ここまで出来ると、大雑把に必要な資源の見積もりができます。まぁ、最初に予想していたのとそれほど違いなく出来そうです。また、残りの命令はチョイ変で済みそうなので、これで回路を意識した記述に手を付けられます。
testfloat だと、mulAdd の検証はかなりたくさんのパタンを必要とするようで、-level 2 を指定するといつ終わるんだろう?って感じです。Verilator は結構速いみたいで testfloat で入力データと期待値生成しながら走らせているのですが、CPU 使用率の比較はこんな感じになっています。
f0054075_13082097.png

[PR]
by tom01h | 2017-01-30 00:19 | PCとか | Trackback | Comments(0)
FPU の Verilog モデルを作成中ですが、自作ランダム検証ではなく、Berkeley TestFloat を使った検証を試してみます。これを使うと丸めモードを変更したり、フラグの期待値生成も簡単に出来るし、Intel CPU だと問題のある FMADD の期待値生成のことも考えずに済みます。
testfloat_gen を使って入力と期待値が生成できるようなので、そのフォーマットに合わせてテストベンチを作り直しました。入力データが特殊な時の処理とか、フラグ生成とかいろいろ追加が必要でしたが、これで品質が大きく向上するはずです。実際、FADD でバグ見つかりましたし…
こんな感じで流せます。結構時間かかります。
~/RISC-V/FunctionalUnit$ ../testfloat/berkeley-testfloat-3/build/Linux-x86_64-GCC/testfloat_gen -level 2 -f32_add | ./sim/Vfadd > log
~/RISC-V/FunctionalUnit$ ../testfloat/berkeley-testfloat-3/build/Linux-x86_64-GCC/testfloat_gen -level 2 -f32_mul | ./sim/Vfmul > log
仕様書をちゃんと確認してみると、tininess 検出は丸め後だったみたいです。で、試してみたんだけど、これって softfloat のほうが間違っているよね?結果が最小値なのにアンダーフローしてるし。サブノーマルの仮数が長すぎるまま判定しようと思って間違っているのだと思いますtininess の検出は結果を見て判断することにして、検証を続けようと思います。 [追記 僕の理解が間違っていたみたいなので、SoftFloat を元に戻してモデル記述を修正しました。]
~/RISC-V/testfloat/berkeley-testfloat-3/build/Linux-x86_64-GCC$ ./testfloat_gen -f32_mul|grep "[80]0800000 03$"
00800000 3F7FFFFF 00800000 03
00800000 BF7FFFFF 80800000 03
00FFFFFF 3F000000 00800000 03
00FFFFFF BF000000 80800000 03
3F000000 00FFFFFF 00800000 03
3F000000 80FFFFFF 80800000 03
3F7FFFFF 00800000 00800000 03
3F7FFFFF 80800000 80800000 03
80800000 3F7FFFFF 80800000 03
80800000 BF7FFFFF 00800000 03
80FFFFFF 3F000000 80800000 03
80FFFFFF BF000000 00800000 03
BF000000 00FFFFFF 80800000 03
BF000000 80FFFFFF 00800000 03
BF7FFFFF 00800000 80800000 03
BF7FFFFF 80800000 00800000 03

[PR]
by tom01h | 2017-01-29 00:07 | PCとか | Trackback | Comments(0)
演算器のモデルを作成中ですが、パイプラインへ追加する方法の調査を兼ねて、転送命令を追加してみようと思います。命令では FLW, FSW, FMV, FSGNJ の 4命令で、 tests で言うと次の3個です。
  • rv32uf-p-ldst
  • rv32uf-p-move
  • rv32uf-p-sgnj
はじめは FSGNJ(サインインジェクション)は後で良いと思ったけど、普通のレジスタ間転送はこの命令を使う模様です。で、普通のレジスタ間の転送命令が目に付かなかったせいで FPU にバイパスは不要と思っていたのですが、やっぱり必要だと思い知らされました。そりゃまぁそうですよね。でもとりあえず、バイパスは保留にしておきます。
まず、F Register と fcsr を追加、MISAを変更します。整数側のロードストアを見よう見まねで FLW,FSW を作ります。ここで rv32mi-p-csr が落ちました。mstatus.FS が Off(00) の時の FPU命令は不当命令になるらしいです。数日前に命令ログの出し方を覚えた spike が早くも役に立ちました。
FMV(整数レジスタとの転送)も似たような実装で動くのですが、rv32uf-p-move は FSGNJ も動かないと通らないみたいです。そんなわけで数行前の考えに至った次第です。
して、rv32uf-p-sgnj もついでに通しておこうと思ったのですが、今度はあまりちゃんと定義の無い fsflags なんて命令が出てきました。これって、CSR のアドレス 0 の fcsr.flag のエリアスに対する csrs 命令ってことで良いのかな?
mstatus.FS とか fpsr の更新の事はまだ考えていないですが、ここまでやって 3個の tests が通りました。と言っても、FS 更新していないから本当はダメなんですけどね。

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