FPGA開発日記

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

「Zedroid - Android (5.0 and later) on Zedboard」をやってみる(1. ZedBoardターゲットハードウェアの作成)

ひょんなことから見つけた、「Zedroid」(ZedBoardでAndroidを動かす)をやってみようと思う。

環境としてはVivado 2017.1を使用し、XMPなどの過去のツールが使えなくなっているのでいろいろ問題はあるが、行けるところまで行ってみよう。

www.slideshare.net

ハードウェアの用意

ZedBoard向けのハードウェアプロジェクトを作成する。これはたぶん普通のやり方だ。

mkdir zedroid
cd zedroid
git clone https://github.com/analogdevicesinc/hdl.git --recurse-submodules
cd hdl/library

Vivado 2017.1で合成するため、以下のように書き換える。

diff --git a/library/scripts/adi_ip.tcl b/library/scripts/adi_ip.tcl
index 9d5b5eb..9387c28 100644
--- a/library/scripts/adi_ip.tcl
+++ b/library/scripts/adi_ip.tcl
@@ -2,7 +2,7 @@
 # check tool version

 if {![info exists REQUIRED_VIVADO_VERSION]} {
-  set REQUIRED_VIVADO_VERSION "2016.2"
+  set REQUIRED_VIVADO_VERSION "2017.1"
 }

 if {[info exists ::env(ADI_IGNORE_VERSION_CHECK)]} {

adv7511の合成

今度はprojectの合成に移るが、こちらもVivadoのバージョンを書き換えておく。

cd ../project/

IPのバージョンも微妙に違うので書き換えた。

diff --git a/projects/scripts/adi_project.tcl b/projects/scripts/adi_project.tcl
index 3e61925..56a02bb 100644
--- a/projects/scripts/adi_project.tcl
+++ b/projects/scripts/adi_project.tcl
@@ -7,7 +7,7 @@ variable p_prcfg_list
 variable p_prcfg_status

 if {![info exists REQUIRED_VIVADO_VERSION]} {
-  set REQUIRED_VIVADO_VERSION "2016.2"
+  set REQUIRED_VIVADO_VERSION "2017.1"
 }

 if {[info exists ::env(ADI_IGNORE_VERSION_CHECK)]} {
diff --git a/projects/adv7511/common/adv7511_bd.tcl b/projects/adv7511/common/adv7511_bd.tcl
index d33aadc..6bfcc65 100755
--- a/projects/adv7511/common/adv7511_bd.tcl
+++ b/projects/adv7511/common/adv7511_bd.tcl
@@ -24,14 +24,14 @@ create_bd_port -dir O spdif
 set axi_hdmi_clkgen [create_bd_cell -type ip -vlnv analog.com:user:axi_clkgen:1.0 axi_hdmi_clkgen]
 set axi_hdmi_core [create_bd_cell -type ip -vlnv analog.com:user:axi_hdmi_tx:1.0 axi_hdmi_core]

-set axi_hdmi_dma [create_bd_cell -type ip -vlnv xilinx.com:ip:axi_vdma:6.2 axi_hdmi_dma]
+set axi_hdmi_dma [create_bd_cell -type ip -vlnv xilinx.com:ip:axi_vdma:6.3 axi_hdmi_dma]
 set_property -dict [list CONFIG.c_m_axis_mm2s_tdata_width {64}] $axi_hdmi_dma
 set_property -dict [list CONFIG.c_use_mm2s_fsync {1}] $axi_hdmi_dma
 set_property -dict [list CONFIG.c_include_s2mm {0}] $axi_hdmi_dma

 # audio peripherals

-set sys_audio_clkgen [create_bd_cell -type ip -vlnv xilinx.com:ip:clk_wiz:5.3 sys_audio_clkgen]
+set sys_audio_clkgen [create_bd_cell -type ip -vlnv xilinx.com:ip:clk_wiz:5.4 sys_audio_clkgen]
 set_property -dict [list CONFIG.PRIM_IN_FREQ {200.000}] $sys_audio_clkgen
 set_property -dict [list CONFIG.CLKOUT1_REQUESTED_OUT_FREQ {12.288}] $sys_audio_clkgen

diff --git a/projects/common/zed/zed_system_bd.tcl b/projects/common/zed/zed_system_bd.tcl
index 25c512f..138baaa 100644
--- a/projects/common/zed/zed_system_bd.tcl
+++ b/projects/common/zed/zed_system_bd.tcl
@@ -118,14 +118,14 @@ set_property -dict [list CONFIG.C_OPERATION {not}] $sys_logic_inv
 set axi_hdmi_clkgen [create_bd_cell -type ip -vlnv analog.com:user:axi_clkgen:1.0 axi_hdmi_clkgen]
 set axi_hdmi_core [create_bd_cell -type ip -vlnv analog.com:user:axi_hdmi_tx:1.0 axi_hdmi_core]

-set axi_hdmi_dma [create_bd_cell -type ip -vlnv xilinx.com:ip:axi_vdma:6.2 axi_hdmi_dma]
+set axi_hdmi_dma [create_bd_cell -type ip -vlnv xilinx.com:ip:axi_vdma:6.3 axi_hdmi_dma]
 set_property -dict [list CONFIG.C_M_AXIS_MM2S_TDATA_WIDTH {64}] $axi_hdmi_dma
 set_property -dict [list CONFIG.C_USE_MM2S_FSYNC {1}] $axi_hdmi_dma
 set_property -dict [list CONFIG.C_INCLUDE_S2MM {0}] $axi_hdmi_dma

 # audio peripherals

-set sys_audio_clkgen [create_bd_cell -type ip -vlnv xilinx.com:ip:clk_wiz:5.3 sys_audio_clkgen]
+set sys_audio_clkgen [create_bd_cell -type ip -vlnv xilinx.com:ip:clk_wiz:5.4 sys_audio_clkgen]
 set_property -dict [list CONFIG.PRIM_IN_FREQ {200.000}] $sys_audio_clkgen
 set_property -dict [list CONFIG.CLKOUT1_REQUESTED_OUT_FREQ {12.288}] $sys_audio_clkgen
 set_property -dict [list CONFIG.USE_LOCKED {false}] $sys_audio_clkgen
cd adv7511/zed
make

Vivadoを立ち上げる。

vivado adv7511_zed.xpr &

f:id:msyksphinz:20170430214843p:plain

次に、XSDKを立ち上げよう。ハードウェアをエクスポートする。

[File]→[Export]→[Export Hardware]を選択する。

[File]→[Launch SDK]をクリックする。

f:id:msyksphinz:20170430214853p:plain

関連記事

msyksphinz.hatenablog.com

msyksphinz.hatenablog.com

msyksphinz.hatenablog.com

DMPのAIプロセッサVIA DV700とTensorFlowプロトコルバッファ

ちょっと面白い製品がリリースされていたので調べてみた。

DMPのエッジ向けAIプロセッサVIA DV700という製品で、「エッジ向け」という名の通りIoTデバイスなどで動作することを前提としたAI用プロセッサだ。

Youtubeでデモンストレーションが公開されている。以下の画像はDMPのウェブサイトから抜粋。ちょっとざっくりし過ぎてて、何が何だか分からない。

http://www.dmprof.com/jp/images/img/product_zia_dv700_zukai_2.jpg

www.youtube.com

足回りについてはほとんど公開されておらず、プロセッサIPとしてだけの提供なので学習用などの大量のデータを食わせるためには、DDRやPCIExpressなどのIPを接続する必要がありそうだ。

デモンストレーションでは、XilinxのZC702を使って、簡単なニューラルネットワークの構築が可能になっている。 このネットワークをどのように構築するか、まだ資料がほとんど公開されていないのだが、APIとして「Caffe / Tensor flow protocol bufferサポート」というものがある。

TensorFlowのプロトコルバッファというの何だろう。調査してみた。

tyfkda.github.io

なるほど、学習したグラフを保存して、エッジデバイスなどに持ってくることができる。今回の場合も、別の計算ノードで作成したネットワークグラフを、DV700に持ってくるためのインタフェースということか。 これも面白そうだ。

プロトコルバッファについては、以前記事にしていたのだった。

msyksphinz.hatenablog.com

msyksphinz.hatenablog.com

msyksphinz.hatenablog.com

RISC-Vでコンピュータアーキテクチャの基礎を学びたい人向けの入門書(Computer Organization and Design RISC-V Edition)

RISC-Vで書き直されたパタヘネこと"Computer Organization and Design"が発売された。

Computer Organization and Design RISC-V Edition: The Hardware Software Interface (The Morgan Kaufmann Series in Computer Architecture and Design)

Computer Organization and Design RISC-V Edition: The Hardware Software Interface (The Morgan Kaufmann Series in Computer Architecture and Design)

知っている人は知っていると思うが、これのARM版も存在する。

Computer Organization and Design ARM Edition: The Hardware Software Interface (The Morgan Kaufmann Series in Computer Architecture and Design)

Computer Organization and Design ARM Edition: The Hardware Software Interface (The Morgan Kaufmann Series in Computer Architecture and Design)

今回は待望のRISC-V版とのことだが、私は購入していない。 理由は、ARM版を見て、昔のMIPS版と比較して内容がほとんど変わらず、命令セットのみ変えられていたこと(しかもARMの命令セットをかなり単純にしたものだった)。

今回も、RISC-Vに命令セットは変えられているだろうが、あまり大きな内容変更はないと思っている。 基礎を学ぶ人には良いかもしれないが、コンピュータアーキテクチャを専門としている人はいまさら感があるかな。

RISC-Vについてあまり詳しくない人は、これを気に読んでみるとよいかもしれない。

どうでもいいが、タイトルのこの腕、細すぎるんだよね。。。

RISC-VがGCC7.1に取り込まれた(インストール試行)

f:id:msyksphinz:20170325154038p:plain

groups.google.com

以下からダウンロードすることが可能だ。 とりあえずダウンロードして、ビルドして様子を見てみることにする。

ftp://gcc.gnu.org/pub/gcc/snapshots/7.0.1-RC-20170425/gcc-7.0.1-RC-20170425.tar.gz

また、binutilsも2.28からRISC-Vをサポートした。

binutilsコンパイル

wget http://ftp.gnu.org/gnu/binutils/binutils-2.28.tar.gz
tar xfz binutils-2.28.tar.gz
cd binutils-2.28

32bit版

/home/msyksphinz/riscv32にインストールするものとする。

mkdir build32 && cd build32
../configure --prefix=/home/msyksphinz/riscv32-gcc --target=riscv32-unknown-elf --disable-multilib
make
make install

64bit版

/home/msyksphinz/riscv64にインストールするものとする。

mkdir build64 && cd build64
../configure --prefix=/home/msyksphinz/riscv64-gcc --target=riscv64-unknown-elf --disable-multilib
make
make install

最後に、PATHを通しておく。

export PATH=/home/msyksphinz/riscv32-gcc/bin:${PATH}
export PATH=/home/msyksphinz/riscv64-gcc/bin:${PATH}
wget ftp://gcc.gnu.org/pub/gcc/snapshots/7.0.1-RC-20170425/gcc-7.0.1-RC-20170425.tar.gz

32bit版

mkdir build32 && cd build32
../configure --prefix=/home/msyksphinz/riscv32-gcc --target=riscv32-unknown-elf --enable-lto --enable-languages=c --without-headers --with-newlib --enable-interwork  --enable-multilib --disable-shared --disable-thread --disable-libssp
make

64bit版

mkdir build64 && cd build64
../configure --prefix=/home/msyksphinz/riscv64-gcc --target=riscv64-unknown-elf --enable-lto --enable-languages=c --without-headers --with-newlib --enable-interwork  --enable-multilib --disable-shared --disable-thread --disable-libssp
make

追記。途中で--disable-libsspを追加した。どうやらlibsspは対応していないようだ。

これでとりあえず素のriscv32-unknown-elf-gccとriscv64-unknown-elf-gccはビルドできた。次にライブラリ等をビルドできるか試行する。

The RISC-V メモリコンシステンシモデル

RISC-Vウェブサイトに出ていたこの記事。

Vengineerさんにも言及いただいた。

riscv.org

5th RISC-V Workshopにも出ていた、RISC-Vのメモリコンシステンシモデルについてツールを用いてチェックしたというPrinceton大学の研究チームの記事だ。

発表資料はこちら。

https://content.riscv.org/wp-content/uploads/2016/12/Tue1200-web-RISC-V-Mem-Consistency-Trippel-Princeton.pdf

(結構Google翻訳にも頼ってしまったが、)要約すると、

  • RISC-Vのメモリコンシステンシモデルでは、C++11に必要なメモリアクセスオーダリングに違反する動作を行う可能性がある。
  • Rocketコアのようなシンプルなものでは影響を受けない。
  • RISC-V ISAの仕様を強化し、このエラーを回避する。新しいRISC-V仕様を2017年中に完成させる。

資料を読んでいたのだが、Store Atomicityとして、以下の3つが存在し、

Multiple-copy atomic: - All cores see store simultaneously - Read-Own-Write-Early-multiple-copy atomic: - Storing core can read its own store before other cores - Stores made visible to all remote cores simultaneously - Non-multiple-copy atomic: - Storing core can read its own store before other cores - Store is made visible to some remote cores before others

このうちNon-multiple-copy Atomicに問題があるということなのかな?メモリコンシステンシモデルについてまだ詳しくないので、良く分かっていない。

f:id:msyksphinz:20170425011331p:plain

スレッドT0とT1のストアが、スレッドT2とT3に到着する場合に異なる順序で到達する場合に発生するということか。 この例だとまだ良く分からないが、T0とT2がコア0、T1とT3がコア1に割り当てられており、それぞれL1キャッシュを共有している。

コア0(つまりT0とT2)はコア1のキャッシュの変更が見えるまでに時間がかかっており、ld xの結果はr0=0と読めているがld yの結果はr1=0と読めていない。 一方、コア1(つまりT1とT3)はコア0のキャッシュの変更が見えるまでに時間がかかっており、ld yの結果はr2=1と読めているが、ld xの結果はr3=0と読めていない。

RISC-V LLVM を用いたベンチマークビルドの方法(Compressed ISAを生成させない方法)

f:id:msyksphinz:20170325154038p:plain

前回のRISC-V LLVM 32ビット版命令生成には一つ問題があり、そのままパッチを当ててしまうとCompressed ISA(16ビット版 RISC-V ISA)を生成してしまう点にある。

現状自作CPUも自作ISSもCompressed ISAには対応していないので、32bit版命令しか生成しないように変更する。

msyksphinz.hatenablog.com

riscv-clangのリポジトリを変更する。

diff --git a/lib/Driver/Tools.cpp b/lib/Driver/Tools.cpp
index 156ee24..1fede05 100644
--- a/lib/Driver/Tools.cpp
+++ b/lib/Driver/Tools.cpp
@@ -1552,6 +1552,11 @@ static void getRISCVTargetCPU(const ArgList &Args,
     CmdArgs.push_back("-target-feature");
     CmdArgs.push_back("+rv64");
     parseRISCVExtensions(MArch.drop_front(4), CmdArgs);
+  }else if(Triple.getArch() == llvm::Triple::riscv) {
+    CmdArgs.push_back("-target-feature");
+    CmdArgs.push_back("+rv32");
+    CmdArgs.push_back("-target-feature");
+    CmdArgs.push_back("-rv64");
   }else{
     //default to RV64I
     CmdArgs.push_back("-target-feature");
@@ -9184,6 +9189,15 @@ void gnutools::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
     CmdArgs.push_back(Args.MakeArgString("-march=" + CPUName));
     break;
   }
+  case llvm::Triple::riscv: {
+       // for riscv-tools in sifive freedom-e-sdk
+       CmdArgs.push_back("-march=rv32ima");
+       CmdArgs.push_back("-mabi=ilp32");
+       // for riscv-tools in sifive freedom/rocket-chip/riscv-tools
+       //CmdArgs.push_back("-m32");
+       //CmdArgs.push_back("-msoft-float");
+     break;
+  }
   }

   Args.AddAllArgs(CmdArgs, options::OPT_I);

つまり、"-march=rv32imac" だったのが、"-march=rv32ima"に変更するので、Compressed ISAが生成されなくなる。 これでCoremarkをビルドしているのだが、シミュレーションを実行しても最後まで通過しない。ここは解析が必要だ。

Vivado 2017.1 AXI VIP packageの情報

Vivado 2017.1 AXI VIP Packageについていくつか情報が出ている。

japan.xilinx.com

XILINX_AXI_VIP_2017_1.zipをダウンロードすると、いくつかVIPパッケージ内の機能について記述されている。

f:id:msyksphinz:20170422032915p:plain

また、VivadoインストールディレクトリにはAXI VIPパッケージのようなものが入っている。

./Vivado/2017.1/data/ip/xilinx/axi_vip_v1_0
./Vivado/2017.1/data/ip/xilinx/axi_vip_v1_0/hdl/axi_vip_v1_0_vlsyn_rfs.sv
./Vivado/2017.1/data/ip/xilinx/axi_vip_v1_0/hdl/axi_vip_v1_0_vl_rfs.sv
./Vivado/2017.1/data/ip/xilinx/axi_vip_v1_0/hdl/axi_vip_v1_0_1_axi4pc.sv
./Vivado/2017.1/data/ip/xilinx/axi_vip_v1_0/xgui/axi_vip_v1_0.tcl
./Vivado/2017.1/data/ip/xilinx/axi_vip_v1_0/doc/axi_vip_v1_0_changelog.txt

ただ、疑問なのはこれ2016.4にも入ってるんだよなあ。

2016.4はシレッと入れておいて、2017.1で正式リリースということにしたいのかなあ。