SDSoCを使った合成方法がわかったので、次は自分でプラットフォームを作る方法を調べました。
SDSoCのプラットフォームはxpfmという名前のファイルですが、これはVivadoで作るdsaというファイルと、SDKで作るboot.binやfsbl.elfなどから生成します。
詳しいやりかたはUG1236に載っているので、このチュートリアルをやりました。
UG1236によると、まず、普通にVivadoのプロジェクトを作り、processing_system7や、proc_sys_reset、clk_wizなどを置いて普通にZYNQを使った空(?)のプロジェクトを作ります。
そして、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というプロパティが追加されるのがわかります。
VivadoをTCLで操作する方法は正直よくわからないので、勉強しないといけないですね・・
そうしたら、Generate Output Productsを行うのですが、
このときに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ファイルで中身はこんな感じでした。
prjというディレクトリには、Vivadoのプロジェクトの部品がそのまま入っている感じでした。
ipcacheのほうは、ipcache\ip\2018.1ディレクトリが作られているだけで、中身は空のようでした。
こうしてdsaファイルをエクスポートしたら、XSDKでfsbl.elfとboot.binとbifファイルを生成します。それから空のプロジェクトを作って、ヒープを768MBにしたリンカスクリプトを作ります。
standalone動作で最大のメモリを使うという意図のようです。
BOOT.binと、fsbl.elf、lscript.ld、standalone.bifの4つのファイルをbootというディレクトリに入れます。
bootディレクトリの中身はこんな感じになっていますです。

bootと同じレベルのディレクトリにdsaファイルを置きます。
SDxを起動して、[New]->[SDx Project]を行い、Platform projectを選択します。

先ほど生成したdsaファイルを選択し、Finishを押します。
Platform projectが生成されます。
①Define System Configurationを、②Add Processor Group/Domain、③Generate Platform、④Add Custom Repositoriesを行えばSDxの新規プロジェクト作成の際にこのプラットフォームが選択できるようになります。
ここまで長かった・・
さて、UG1236のチュートリアルによれば、SDxのテンプレートから選ぶとのことなのですが、テンプレートに何もありません。
SDx Examplesを押して、downloadボタンを押しても接続でエラーになってしまいます。
こういうときは、https://github.com/Xilinx/SDSoC_Examplesからダウンロードして、その中にあるcppフォルダのgetting_startedフォルダをC:\Users\<ユーザ名>\.Xilinx\SDx\2018.1フォルダにコピーしてあげると、サンプルが見えるようになります。
これでうまくいくかと思ったのですが、まだダメでした。
テンプレートにあるプロジェクトをコンパイルしようとすると、
#include "sds_utils.h"
というのが見つからずにエラーになります。
解決方法としては、Githubからダウンロードしてきた、SDSoC_Examples-master\libs\sds_utilsフォルダをSDxのプロジェクト(Workspace)のディレクトリに入れればOKなようです。
これでincludeファイルが見つかって、ビルドできるようになります。
出来上がったVivadoのプロジェクトは
D:\sdsoc\UG1236\platforms\empty_application\Debug\_sds\p0\_vpl\ipi\syn
にありました。開いてみるとVivadoのBlock Designが出来上がっていました。
HLSのモジュールがあり、DataMoverがDMA転送をするという典型的なデザインのようです。左側に、チュートリアルで作ったひな型のBlock Designが含まれています。
これをImplementしたプロジェクトは
D:\sdsoc\UG1236\platforms\empty_application\Debug\_sds\p0\_vpl\ipi\imp
にあります。実体はdcpファイルなので、中は見れません。
dcpファイルの拡張子をzipに変えて解凍してみても、巨大なEDIFとXDCといくつかの設定がファイルが入っているだけのようなので、この時点でネットリスト化されているようです。
SDx上ではelfファイルも出来上がり、最終的なBOOT.BINも出来ていました。
これを書き込めばSDSoCのアプリが動くのだとは思いますが、ZC702がないので試せません。
次はZynqberryでやってみることにします。
ところで、ピン配置の定義ってどこでやるんだろう・・?最初にボードファイルを読み込んだところかな?
最近のコメント