FPGA開発日記

カテゴリ別記事インデックス https://msyksphinz.github.io/github_pages , English Version https://fpgadevdiary.hatenadiary.com/

RISC-V Instruction Set Privileged Architecture 1.10 / User-Level ISA 2.2が出ました

f:id:msyksphinz:20170517011512p:plain

f:id:msyksphinz:20170517011441p:plain

RISC-V Instruction Set Architectureに更新が入っていた!こういうのをシレッとアップグレードするのは正直止めてほしいのだが。。。

  • User-Level ISA Specification 2.1 –> 2.2 (2017/05/07)
  • Draft Privileged Architecture 1.9.1 –> 1.10 (2017/05/07)

どうやら6th RISC-V Workshopの時期を見込んで更新がされたようね。

まだ詳細をチェックしていないのだが、徐々に追記して行こう。まずはPrivileged Architectureの方からチェックしている。

まだ1.9.1との差分しかチェックしていないが、ザックリとしたところでは、

  • CSRのShadowレジスタは削除された。v1.9.1までは、CSRのShadowレジスタアドレスというものが定義されており、対象CSRが低い権限の時には読み取り専用だが、より高い権限の時に読み書きができるようなレジスタをサポートするためのものだった。v.1.10では必要に応じて再定義することが可能となった。
  • いくつかCSRの名前およびビットフィールドが変更されている。misaのビットフィールドはMXL, mbadaddrレジスタはmtval、sptbrはsatp(supervisor address translation and protection)に変更されている。
  • Physical Memory Protectionの仕様が追加された。
  • ハイパーバイザーモード(H-Mode)は削除された。なんと!

SiFiveの64bit RISC-Vコア Soc E51でCoremarkを動作させる(MCSの作り方)

前回、RISC-Vの64bitコアを搭載したSoCプラットフォームE51を使ってCoremarkを動作させたが、このときにあらかじめ提供されているMCSを改造してCoremarkを挿入した。 この方法はハードウェア設計の師匠に教えてもらったものだが、師匠から許可を得たのでその方法を記載してみる。

MCSファイルの仕組み

FPGAにおけるMCSファイルは、Intel Hexというフォーマットで記述されている。

Intel HEX - Wikipedia

:020000040000FA
:10000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00
:10001000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0
:10002000000000BB11220044FFFFFFFFFFFFFFFFA6
:10003000AA995566200000003003E0010000026B21
:10004000300080010000001220000000300220017A
:1000500000000000300200010000000030008001BC
:1000600000000000200000003000800100000007B8
:1000700020000000200000003002600100000000AD
:100080003001200102003FE53001C0010000000006
:10009000300180010362D09330008001000000092C
:1000A000200000003000C001000004013000A00169
:1000B000000005013000C001000000003003000115
:1000C00000000000200000002000000020000000D0
:1000D00020000000200000002000000020000000A0
:1000E00020000000300020010000000030008001EE
:1000F00000000001200000003000400050085A5C61
:1001000000000000000000000000000000000000EF
:1001100000000000000020000000000000000000BF
:1001200000000000000000000000000000000000CF
:1001300000000000000000000000000000000000BF
...

この形式では、:02から始まる行は、:02_0000_04_0000_FAと分類でき、

  • データ量: 2バイト
  • アドレス: 0000
  • レコードタイプ: 拡張リニアアドレス
  • データ: 0x0000
  • チェックサム: 0xFA

となる。レコードタイプが拡張リニアアドレスのため、後続のデータのアドレスはこのレコードの16bitデータ0x0000を上位16bitに設定した値となる。したがって後続の行のデータ先頭アドレスは以下のようになる。

  • 2行目 : 0x0000_0000
  • 3行目 : 0x0000_0010 …

プログラムが格納されている部分を探す

では、次にこの:02から始まる行をgrepして取り出してみる。

$ grep :02 SiFive_E51_Coreplex_FPGA_Evaluation_v1p0_r0.mcs
...
:02000004001AE0
:02000004001BDF
:02000004001CDE
:02000004001DDD
:02000004001EDC
:02000004001FDB
:020000040020DA
:020000040021D9
:020000040040BA

この中で、:020000040040BA以降にプログラムが格納されており、それより前が回路情報となる。

このレコードは :02_0000_04_0040_BAとなり、データ先頭アドレスの上位16bitが 0x0040(IntelHexの拡張リニアアドレスはビッグエンディアン)となる。 つまり、0x0040_0000から先にプログラムが格納されているということが分かった。 RISC-Vのブートアドレスが0x20400000で、QSPIのベースアドレスを引いたアドレスが0x00400000のためこうなるらしい。 ほへへ。

確かに、このレコードから先は明らかにプログラムっぽい。

:020000040040BA
:1000000081400141814101428142014381430144D8
:1000100081440145814501468146014781470148A8
:10002000814801498149014A814A014B814B014C78
:10003000814C014D814D014E814E014F814F970101
:10004000C03F93812178970200009382A20E7390A3
:100050005230214973104930732940F1631D090260
:100060009702C03F938202FA1703C03F130383F93C
:1000700063F7620023B00200A102E3ED62FEB70461
:100080000002054923A024019104370900021B093D
...

MCSファイル内のレコードを置き換える

まずは:020000040040BAより先のレコードを削除する。次に、Coremarkのプログラムを代わりにペーストするというわけだ。Coremarkのバイナリから以下の要領でihexを生成する。

riscv64-unknown-elf-objcopy --target ihex coremark.bin coremark.ihex

生成されたihexのうち、最後の

:040000054040000077

は存在しているとVivado Hardware Managerによりエラーとみなされるようなので削除する。これで新しいMCSの完成だ。 あとはMCSを書き込むだけでプログラムを動作させることができる。

SiFiveの64bit RISC-VコアE51でCoremarkを動作させる

前回、MCSをダウンロードしてSiFiveのRISC-VコアE51を起動させた。

その時は、デバッグ用の機器を用意していなかったので自分のプログラムを動作させることができなかったが、ハードウェア設計の師匠からメールをもらい、プログラムを動作させることができるようになった。

tom01h.exblog.jp

詳細は師匠の技なのでこのブログには書かないが、MCSファイルの中身を差し替えてプログラム部分を差し替えることによりプログラムを動作させることができるようになる。

ここではfreedom-e-sdkに格納されている64ビット版Coremarkをコンパイルし、コンパイル結果のihexファイルをMCSファイルと結合することによりプログラムを動作させることにした。

MCSファイルを改変した結果、無事にCoremarkプログラムが起動した。

f:id:msyksphinz:20170515001923p:plain

Coremark/MHzの計算方法は、例によって { \displaystyle
\text{Iterations/Sec} / \text{MHz}
} で計算できるので、今回は { \displaystyle
152.084290 / 65 = 2.34
} となる。

あれ、公称値と少し違うなあ。

f:id:msyksphinz:20170515002436p:plain

core freq at 65000000 Hz
core freq at 65000000 Hz
2K performance run parameters for coremark.
CoreMark Size    : 666
Total ticks      : 18446744073688525916
Total time (secs): 65.753011
Iterations/Sec   : 152.084290
Iterations       : 10000
Compiler version : GCC7.1.0
Compiler flags   : -O2 -fno-common -funroll-loops -finline-functions --param max-inline-insns-auto=20 -falign-functions=4 -falign-jumps=4 -falign-loops=4
Memory location  : STACK
seedcrc          : 0xe9f5
[0]crclist       : 0xe714
[0]crcmatrix     : 0x1fd7
[0]crcstate      : 0x8e3a
[0]crcfinal      : 0x988c
Correct operation validated. See readme.txt for run and reporting rules.
CoreMark 1.0 : 152.084290 / GCC7.1.0 -O2 -fno-common -funroll-loops -finline-functions --param max-inline-insns-auto=20 -falign-functions=4 -falign-jumps=4 -falign-loops=4 / STACK

Progam has exited with code:0x0000000000000000

「ローグ・ワン スターウォーズ ストーリー」DVD買った

ローグワンのDVD買っちゃった。

msyksphinz.hatenablog.com

劇場で見ても結構面白かったので、もう一度見たいと思いDVDを買ってしまった。

本編へのオマージュが大量にあり、見てて面白い。何度も見そうだ。

「Zedroid - Android (5.0 and later) on Zedboard」をやってみる(9. uramdisk.image.gzの展開)

前回は、u-bootが立ち上がったもののinitを起動させることができず、どうしたらよいのか分からないところで終わった。

そこまで日記に書いたところ、uramdisk.image.gzを事前に展開しておく必要があるということを @ksmakoto さんに教わった。 確かにその通りで、u-bootはinitがどこにあるのか(実際にはuramdisk.image.gzに格納されている)がどこにあるのかも知らないし、それをメモリに展開したところで場所を教えないとどうしようもない。 どうしたらよいのだろうと調査した結果、Xilinxの以下のページを発見し、試行してみた。

Xilinx Wiki - U-boot

なるほど、以下のようにしてイメージをメモリに展開するのか。さらに展開した場所をカーネルに教えてやり、起動する。

u-boot> fatload mmc 0 0x3000000 uImage
u-boot> fatload mmc 0 0x2A00000 devicetree.dtb
u-boot> fatload mmc 0 0x2000000 uramdisk.image.gz
u-boot> bootm 0x3000000 0x2000000 0x2A00000

同じように実行すると、起動し始めた。よしよし。

brd: module loaded
loop: module loaded
libphy: XEMACPS mii bus: probed
[Firmware Warn]: /amba@0/eth@e000b000/phy@0: Whitelisted compatible string. Please remove
xemacps e000b000.eth: pdev->id -1, baseaddr 0xe000b000, irq 33
ehci_hcd: USB 2.0 'Enhanced' Host Controller (EHCI) Driver
usbcore: registered new interface driver usb-storage
usbcore: registered new interface driver usbserial
usbcore: registered new interface driver usbserial_generic
usbserial: USB Serial support registered for generic
usbcore: registered new interface driver ftdi_sio
usbserial: USB Serial support registered for FTDI USB Serial Device
mousedev: PS/2 mouse device common for all mice
i2c /dev entries driver
xiic-i2c 41600000.i2c: input clock not found.
xiic-i2c: probe of 41600000.i2c failed with error -2
Xilinx Zynq CpuIdle Driver started
sdhci: Secure Digital Host Controller Interface driver
sdhci: Copyright(c) Pierre Ossman
sdhci-pltfm: SDHCI platform and OF driver helper
mmc0: SDHCI controller on e0100000.sdhci [e0100000.sdhci] using ADMA
ledtrig-cpu: registered to indicate activity on CPUs
hidraw: raw HID events driver (C) Jiri Kosina
usbcore: registered new interface driver usbhid
usbhid: USB HID core driver
adv7511-hdmi-snd fpga-axi@0:adv7511_hdmi_snd: ASoC: CODEC DAI adv7511 not registered
mmc0: new high speed SDHC card at address 1234
zed-adau1761-snd fpga-axi@0:zed_sound: ASoC: CODEC DAI adau-hifi not registered
mmcblk0: mmc0:1234 SA08G 7.25 GiB
 mmcblk0: p1 p2 p3 p4
NET: Registered protocol family 17
zynq_pm_ioremap: no compatible node found for 'xlnx,zynq-ddrc-a05'
zynq_pm_late_init: Unable to map DDRC IO memory.
Registering SWP/SWPB emulation handler
of_graph_get_next_endpoint(): no port node found in /fpga-axi@0/axi_hdmi@70e00000
adv7511-hdmi-snd fpga-axi@0:adv7511_hdmi_snd: ASoC: CODEC DAI adv7511 not registered
zed-adau1761-snd fpga-axi@0:zed_sound: ASoC: CODEC DAI adau-hifi not registered
hctosys: unable to open rtc device (rtc0)
xemacps e000b000.eth: Set clk to 25000000 Hz
xemacps e000b000.eth: link up (100/FULL)
Sending DHCP requests ., OK
IP-Config: Got DHCP answer from 192.168.0.1, my address is 192.168.0.7
IP-Config: Complete:
     device=eth0, hwaddr=00:0a:35:00:01:22, ipaddr=192.168.0.7, mask=255.255.255.0, gw=192.168.0.1
     host=192.168.0.7, domain=airport, nis-domain=(none)
     bootserver=0.0.0.0, rootserver=0.0.0.0, rootpath=     nameserver0=192.168.0.1
ALSA device list:
  No soundcards found.
Freeing unused kernel memory: 248K (c0698000 - c06d6000)
This architecture does not have kernel memory protection.
init: cannot find '/system/bin/debuggerd64', disabling 'debuggerd64'ev/block/mmcblk0p3,target=/data,type=ext4)=0
init: cannot find '/system/bin/install-recovery.sh', disabling 'flash_recovery'
Unable to find swap-space signature
shell@zedboard:/

しかししばらく待っていると、以下のエラーメッセージを吐いてリブートしてしまった。えー、何だこりゃ。

$ init: critical process 'healthd' exited 4 times in 4 minutes; rebooting into recovery mode
reboot: Restarting system with command 'recovery'

調査していると、以下のブログを発見した。

henryomd.blogspot.jp

うーん、nfsが関係しているのか?以下を追加してみよう。

setenv bootargs 'earlyprintk maxcpus=1 console=ttyPS0,115200 ip=dhcp root=/dev/nfs nfsroot=192.168.1.2:/export/root/zedroid,nfsvers=3 rw init=/init'

saveenv

今度は、以下のエラーを出して同様にリブートがかかってしまった。

init: critical process 'servicemanager' exited 4 times in 4 minutes; rebooting into recovery mode
eboot: Restarting system with command 'recovery'

うーん、まだ調整が必要だなあ。

f:id:msyksphinz:20170513025151p:plain

関連記事

msyksphinz.hatenablog.com

msyksphinz.hatenablog.com

msyksphinz.hatenablog.com

msyksphinz.hatenablog.com

msyksphinz.hatenablog.com

msyksphinz.hatenablog.com

msyksphinz.hatenablog.com

msyksphinz.hatenablog.com

「Zedroid - Android (5.0 and later) on Zedboard」をやってみる(8. Kernel Panic)

前回からいろいろブートファイルを作り直して、どうにかu-bootが立ち上がるようになった。

そして zedroid_device_xilinx_zedboard-kernel を少し変更する必要があったが、U-bootでの動作は始まったようだ。

  • zynq-zed-adv7511.dtsi
diff --git a/arch/arm/boot/dts/zynq-zed-adv7511.dtsi b/arch/arm/boot/dts/zynq-zed-adv7511.dtsi
index 1209b8c..4afed32 100644
--- a/arch/arm/boot/dts/zynq-zed-adv7511.dtsi
+++ b/arch/arm/boot/dts/zynq-zed-adv7511.dtsi
@@ -106,6 +106,10 @@
                        audio-codec = <&adau1761>;
                        cpu-dai = <&axi_i2s_0>;
                };
+               efuse@f800d000 {
+            compatible = "xlnx,zynq-efuse";
+                   reg = <0xf800d000 0x20>;
+               };
        };

        leds {

しかしAndroid(というかLinux)が起動するまでに以下のようなエラーメッセージを吐いてカーネルパニックになっている。

通常通りにブートしても、Linuxを起動するときの最初のプロセスにあたるinitが存在せず、カーネルパニックになってしまっていると思われる。

initは、/dev/sdb1 (SDカードのパーティション0)に格納したuramdisk.image.gzに入っているはずだ。これはLinux起動時に展開されるはずなので、 以下のようにしてU-bootのコマンドラインで指定すればよいと思う。

setenv bootargs console=ttyPS0,115200 root=/dev/ram rw earlyprintk init=/init
boot   # 起動

しかし今度は以下のエラーメッセージで止まってしまう。良く分からないなあ。。。

No filesystem could mount root, tried:  ext3 ext2 ext4 vfat msdos
Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(1,0)
CPU: 0 PID: 1 Comm: swapper/0 Not tainted 4.6.0 #1

うーん、これは何だろう?

f:id:msyksphinz:20170512000615p:plain

SiFiveの64bit RISC-VコアE51をArty FPGAで動作させる

SiFiveはフリーのRISC-Vコアデザインとして、32bitのE31、64bitのE51を提供している。

www.sifive.com

f:id:msyksphinz:20170510223409p:plain

これらのソースコードはリクエストしないとダウンロードすることは出来ないが、mcsファイルが配布されているためこれを使って手っ取り早くFPGAで動作させてみることができる。

mcsファイルのダウンロードは無料なので、さっそくダウンロードして実行させてみよう。

FPGA Bitstreamを入手する

E31およびE51のFPGAビットストリームは、以下で入手可能だ。ターゲットハードウェアとして、XilinxのArty FPGA Boardのものが用意されている。

https://dev.sifive.com/static/core/images/dev-boards/arty-artix-7.cf703ff39240.jpg

SiFiveのウェブサイトからダウンロード可能だ。

dev.sifive.com

f:id:msyksphinz:20170511010949p:plain

ダウンロードしたら、SiFive_E51_Coreplex_FPGA_Evaluation_v1p0_r0.tar.gzを展開する。SiFive_E51_Coreplex_FPGA_Evaluation_v1p0_r0.mcsがあるので、これを書き込む訳だ。

ダウンロードおよび動作確認にはUbuntuを利用するので、Vivado経由で書き込むときはドライバのインストールを忘れないこと。以下を参考にした。

github.com

 cd /opt/Xilinx/Vivado/2015.1/data/xicom/cable_drivers/lin64/install_script/install_drivers  
 sudo ./install_digilent.sh  
 cd /opt/Xilinx/Vivado/2015.1/data/xicom/cable_drivers/lin64/install_script/install_drivers  
 sudo ./install_drivers

また、コンフィグ格納用のSPIメモリの指定は、自分の過去の記事を参考にした。

msyksphinz.hatenablog.com

これでシリアルポートを開いて、115200bpsに指定して受信していると、メッセージが表示される。

f:id:msyksphinz:20170510233518p:plain

一応ここまで。デバッグケーブルを持っていないのでここから先は進めないが、RISC-Vボードを活用するためにデバッグケーブルを購入するか否か。。。 5000円程度だから思い切って買ってしまえばよいのだけれど。

参考。E51(64bit版RISC-V)のベンチマークプログラムのコンパイル

E51用のサンプルプログラムやベンチマークプログラムは、以前紹介したfreedom-e-sdkリポジトリから入手可能だ。

github.com

詳細は省略するが、まずはツールのビルド(別リポジトリにツールがビルドされるので本当は嫌なのだが、オリジナルのriscv64-unknown-elf-gccを使うとリンクでエラーが出たのでとりあえず回避…)

sudo aptitude install libtcl8.5 # openocdのビルドに必要
make tools BOARD=coreplexip-e51-arty -j4

Coremarkのコンパイルは以下で可能だ。

make software PROGRAM=coremark BOARD=coreplexip-e51-arty