« SDSoCの勉強を始めました(1) | トップページ | ZynqberryのSDSoC対応 »

2018.06.10

SDSoCの勉強を始めました(2)

SDSoCを使った合成方法がわかったので、次は自分でプラットフォームを作る方法を調べました。

SDSoCのプラットフォームはxpfmという名前のファイルですが、これはVivadoで作るdsaというファイルと、SDKで作るboot.binやfsbl.elfなどから生成します。

詳しいやりかたはUG1236に載っているので、このチュートリアルをやりました。

Ug1236

UG1236によると、まず、普通にVivadoのプロジェクトを作り、processing_system7や、proc_sys_reset、clk_wizなどを置いて普通にZYNQを使った空(?)のプロジェクトを作ります。

Ug1236_vivado

そして、VivadoのTCLコンソールに以下のようなコマンドを入力して、processing_system7などにPFMというpropertyをセットします。

set_property PFM_NAME "xilinx.com:zynq7_board:zynq7_board:1.0"\
[get_files [get_property FILE_NAME [get_bd_designs]]]

set_property PFM.CLOCK { \
 clk_out1 {id "2" is_default "true" proc_sys_reset
"proc_sys_reset_0" } \
 clk_out2 {id "1" is_default "false" proc_sys_reset
"proc_sys_reset_1" } \
 clk_out3 {id "0" is_default "false" proc_sys_reset
"proc_sys_reset_2" } \
 clk_out4 {id "3" is_default "false" proc_sys_reset
"proc_sys_reset_3" } \
 } [get_bd_cells /clk_wiz_0]

set_property PFM.AXI_PORT { \
M_AXI_GP0 {memport "M_AXI_GP"} \
M_AXI_GP1 {memport "M_AXI_GP"} \
S_AXI_ACP {memport "S_AXI_ACP" sptag "ACP" memory
"processing_system7_0 ACP_DDR_LOWOCM"} \
S_AXI_HP0 {memport "S_AXI_HP" sptag "HP0" memory
"processing_system7_0 HP0_DDR_LOWOCM"} \
S_AXI_HP1 {memport "S_AXI_HP" sptag "HP1" memory
"processing_system7_0 HP1_DDR_LOWOCM"} \
S_AXI_HP2 {memport "S_AXI_HP" sptag "HP2" memory
"processing_system7_0 HP2_DDR_LOWOCM"} \
S_AXI_HP3 {memport "S_AXI_HP" sptag "HP3" memory
"processing_system7_0 HP3_DDR_LOWOCM"} \
} [get_bd_cells /processing_system7_0]

set intVar []
for {set i 0} {$i < 16} {incr i} {
lappend intVar In$i {}
}
set_property PFM.IRQ $intVar [get_bd_cells /xlconcat_0]

この作業を行うと、PFMというプロパティが追加されるのがわかります。

Pfm

VivadoをTCLで操作する方法は正直よくわからないので、勉強しないといけないですね・・

そうしたら、Generate Output Productsを行うのですが、

Genoutput_2

このときにGlobalを選ぶようです。実はこのチュートリアルは2回やっていて、1回目はうまくいかなかったのですが、per IPを選んでいたからかもしれません。Globalを選ぶのが重要なのかもしれません。

そして、Create HDL Wrapperをしたら、Export Hardwareをして、その後で以下のコマンドをTCLコンソールに打ってDSAを出力するとのことです。

write_dsa –force <path_to_project>/zynq7_board.dsa

ただし、この<path_to_project>はデフォルトでC:/Users/ユーザ名/AppData/Roaming/Xilinx/Vivado/あたりに設定されているので、少々使い勝手が悪いです。<path_to_project>の変更方法もよくわかりません。

そこで、以下のように直接ディレクトリを指定して出力したほうがいいと思います。

write_dsa –force d:/sdsoc/UG1236/zynq7_board.dsa

これでDSAファイルが出来上がります。DSAというのはZIPファイルで中身はこんな感じでした。

Dsa_inside

prjというディレクトリには、Vivadoのプロジェクトの部品がそのまま入っている感じでした。

Dsa_prj

ipcacheのほうは、ipcache\ip\2018.1ディレクトリが作られているだけで、中身は空のようでした。

こうしてdsaファイルをエクスポートしたら、XSDKでfsbl.elfとboot.binとbifファイルを生成します。それから空のプロジェクトを作って、ヒープを768MBにしたリンカスクリプトを作ります。

standalone動作で最大のメモリを使うという意図のようです。

Linker_script

BOOT.binと、fsbl.elf、lscript.ld、standalone.bifの4つのファイルをbootというディレクトリに入れます。

bootディレクトリの中身はこんな感じになっていますです。

Boot

bootと同じレベルのディレクトリにdsaファイルを置きます。

Boot_dsa

SDxを起動して、[New]->[SDx Project]を行い、Platform projectを選択します。

Platform_project

先ほど生成したdsaファイルを選択し、Finishを押します。

Platform projectが生成されます。

Pfm_gen

①Define System Configurationを、②Add Processor Group/Domain、③Generate Platform、④Add Custom Repositoriesを行えばSDxの新規プロジェクト作成の際にこのプラットフォームが選択できるようになります。

New_platform

ここまで長かった・・

さて、UG1236のチュートリアルによれば、SDxのテンプレートから選ぶとのことなのですが、テンプレートに何もありません。

Sdx_template

SDx Examplesを押して、downloadボタンを押しても接続でエラーになってしまいます。

こういうときは、https://github.com/Xilinx/SDSoC_Examplesからダウンロードして、その中にあるcppフォルダのgetting_startedフォルダをC:\Users\<ユーザ名>\.Xilinx\SDx\2018.1フォルダにコピーしてあげると、サンプルが見えるようになります。

Sdx_samples

これでうまくいくかと思ったのですが、まだダメでした。

テンプレートにあるプロジェクトをコンパイルしようとすると、

#include "sds_utils.h"

というのが見つからずにエラーになります。

解決方法としては、Githubからダウンロードしてきた、SDSoC_Examples-master\libs\sds_utilsフォルダをSDxのプロジェクト(Workspace)のディレクトリに入れればOKなようです。

Sdx_sds_utils

これでincludeファイルが見つかって、ビルドできるようになります。

出来上がったVivadoのプロジェクトは

D:\sdsoc\UG1236\platforms\empty_application\Debug\_sds\p0\_vpl\ipi\syn

にありました。開いてみるとVivadoのBlock Designが出来上がっていました。

Sdx_ug1236_vivado

HLSのモジュールがあり、DataMoverがDMA転送をするという典型的なデザインのようです。左側に、チュートリアルで作ったひな型のBlock Designが含まれています。

これをImplementしたプロジェクトは

D:\sdsoc\UG1236\platforms\empty_application\Debug\_sds\p0\_vpl\ipi\imp

にあります。実体はdcpファイルなので、中は見れません。

Imp

dcpファイルの拡張子をzipに変えて解凍してみても、巨大なEDIFとXDCといくつかの設定がファイルが入っているだけのようなので、この時点でネットリスト化されているようです。

SDx上ではelfファイルも出来上がり、最終的なBOOT.BINも出来ていました。

Bootbin

これを書き込めばSDSoCのアプリが動くのだとは思いますが、ZC702がないので試せません。

次はZynqberryでやってみることにします。

ところで、ピン配置の定義ってどこでやるんだろう・・?最初にボードファイルを読み込んだところかな?

|

« SDSoCの勉強を始めました(1) | トップページ | ZynqberryのSDSoC対応 »

コメント

コメントを書く



(ウェブ上には掲載しません)




« SDSoCの勉強を始めました(1) | トップページ | ZynqberryのSDSoC対応 »