組み込みOS自作本 の H8 から SH2 用に移植して使ってた kozos を、今度は RISC-V に移植したい。
Makefile だの、リンカスクリプトだの変更して make してみたけど、リンク時にシンボルがないって言われる。本によると、c言語で定義したシンボルは、リンカとかアセンブラからは頭に _ が付いて見えるとのことで、本のソースもそうなっていてそれで良い。
問題はその逆で、リンカスクリプトではシンボルは定義の時に _ を付けておいて、c から参照すると _ が取れるのかどうかと言う問題。本の中と、今まで使っていた SH2 用の環境では取れる。RISC-V 用だと _ が勝手に取れることはないみたいで、シンボルが未定義って文句言われた。リンカスクリプト上の定義から _ を外したら make できた。gcc のバージョンも違うから、そのせいかもしれないが。
で、FPGA で動かしてみたら、今度は puts が最初の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)

棒の峰

珍しく、この時期に棒の峰に行きました。結果から言うと、まぁ、春のほうが良いかな。
f0054075_19370020.jpgf0054075_19370087.jpg

これと言って綺麗じゃなかったせいかな?なんかどんどん速足になりました。そしてなんか疲れた。まぁ、運動のために行ったと思えばよいか。そして目的の温泉も入ってきました。桜は十月桜というそうです。
f0054075_19400904.jpgf0054075_19400962.jpg


[PR]
# by tom01h | 2016-12-04 19:42 | 山歩き | 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)

Rocket Chip Generator

一応 Rocket Chip Generator も試してみようと思った。
ますは WSL で試したんだけど、JAVA が動かない。
[error] (antlr4:Generate classes from antlr4 grammars) java.io.IOException: Cannot run program "java": error=12, メモリ を確保できません
WSL では JAVA のメモリ関係で動かない事もあるとか書いているネットの情報もある。でも WSL は日々進化しているし、古い情報は当てにならないかも。まあ、うちでも動いていないんだけどね。
でもなんで JAVA 使っているの?Chisel は Scala の上で動いて、 Scala は JAVA の上で動くのかな?Windows の JAVA を呼べると解決するかな?

で、VM 上の Ubuntu でも試してみたら動いた。Java 入れろっていうから入れてみたのに、今度は Javac がないっていう。検索してみたら、Javac は Java とは別みたいね。で、入れてみたら、その後勝手に Scala 入れたり Verilator 入れたりとっても時間かかった末に Verilog を吐くところまでは確認できた。これは人の読める Verilog じゃないや。V-scale はやっぱり人手で書いていると推測します。
この後、この Verilator で Linux のブートとかもできるのかな?ちなみに、spike での Linux は Ubuntu 上でも動きませんでした。

[PR]
# by tom01h | 2016-11-23 22:10 | PCとか | Trackback | Comments(0)

Arty で kozos Step6 完成

なぜか gets の途中で有りもしない改行を拾っていた改行が来なくてもループを抜けていたのですが、リンカスクリプトを変えたらちゃんと動くようになりました。がしかし、どう悪かったのかは謎のまま。H8 の設定のまま使っていたけど、気持ち悪いところを指していたので、変えたら動きました。が、元がどう悪かったのかは分かりません。
ramall(rwx) : o = 0xffffbf20, l = 0x004000 /* 16KB */
ram(rwx) : o = 0xffffc020, l = 0x003f00
stack(rw) : o = 0xffffff00, l = 0x000000 /* end of RAM */
↑を↓にした
ramall(rwx) : o = 0xffffc000, l = 0x004000 /* 16KB */
ram(rwx) : o = 0xffffc100, l = 0x003f00
stack(rw) : o = 0xffffff00, l = 0x000000 /* end of RAM */
まぁ、動いたからいいか。ここで終わりにしようと思っていたけど、割り込みのデバッグに Step7 もやってみた方が良いかな?
f0054075_20002261.png

[PR]
# by tom01h | 2016-11-22 20:53 | PCとか | Trackback | Comments(0)

登山用ドリンク

登山用ドリンクは、お茶とスポーツドリンクと水を各 500ml 持っていくのがデフォ、小さい山だと水はなしです。そして、スポーツドリンクは泊りのことも考えて 500ml 用粉末を使っています。お茶は良いのが見つかっていません。暖かい飲み物を持っていくことはめったにないかなぁ。
で、粉末ですが、以前は amino VITALのクエン酸チャージを使っていました。最近は VAAM を使っているのですが、特にこれに変えた理由はなくって、たまたまこれしか 500ml 用の粉末がなかったから。しかし、VAAM は評判もそうだし、売りもそうなのだから仕方ないけど、すごく汗をかきます。これ、あんまり山に向いていない。ダイエットには良いのかもしれないけどね。なので次はまた、amino VITAL に戻します。今年はよくばてていたのは飲み物のせいだったのなら良いなと思っています。
f0054075_23535454.jpg

[PR]
# by tom01h | 2016-11-21 19:54 | Trackback | Comments(0)