この記事では、Altera®(Intel®)SoC FPGA の開発環境で発生する既知のエラーと、その対策方法を紹介します。
はじめに
Quartus® Prime に付属する sopc-create-header-files を使用すると、Platform Designer の設計情報(.sopcinfo ファイル)を元に、各種 IP コンポーネントのベースアドレスの定義を含むヘッダーファイルを生成可能です。生成したヘッダーファイルは、ソフトウェアの実装に利用することができるようになっています。
しかしながら、最近のツールバージョンでは、SoC FPGA Embedded Development Suite(SoC EDS)の Embedded Command Shell 環境下で sopc-create-header-files を実行した場合に、エラーが発生する場合があるようです。この記事では、sopc-create-header-files 実行時に発生するエラーの内容と、その対策について紹介します。
エラー内容および発生条件
sopc-create-header-files の実行に失敗する場合は、以下のようなエラーメッセージが表示されます。当然ながらヘッダーファイルも生成されません。
$ sopc-create-header-files ghrd_10as066n2.sopcinfo
swinfo2header: Failed to load *.swinfo file "/tmp/sopc-create-header-files.529.tmp.swinfo"
sopc-create-header-files: swinfo2header --swinfo /tmp/sopc-create-header-files.529.tmp.swinfo --sopc ghrd_10as066n2.sopcinfo failed
発生条件は、Windows 環境にて以下のバージョンの Quartus® Prime を、SoC EDS と組み合わせて使用した場合に発生します(Nios® II の Shell 環境が WSL(Windows Subsystem for Linux)に移行した以降のツールバージョンが該当します)。
- Quartus® Prime Pro Edition: version 19.2 以降
- Quartus® Prime Standard Edition: version 19.1 以降
エラーの対策方法
sopc-create-header-files の中身は Shell スクリプトで記述されているため、テキストエディターで中身を編集することが可能です。以下に記載するエラー対策用の記述を追加してご対応ください。
編集対象:
- Standard Edition: C:\intelFPGA\<version>\quartus\sopc_builder\bin\sopc-create-header-files
- Pro Edition: C:\intelFPGA_pro\<version>\quartus\sopc_builder\bin\sopc-create-header-files
編集内容:
以下の黄色で表示されている部分がエラーの対策用に記述を追加した箇所となります。コピー&ペースト用に追記箇所のテキストも下の方に掲載しておきます。
18 行目 ~ 20 行目:
elif [ "${_IS_WINDOWS}" = "1" ] && [ -n "$(which cygpath 2>/dev/null)" ]; then
_IS_CYGWIN=1
windows_exe=.exe
44 行目 ~ 47 行目:
[[ -x /bin/cygpath ]] && {
# Use cygpath to convert tmp to a windows path.
swinfo_tmp_fname=$(cygpath -w $swinfo_tmp_fname)
}
補足:sopc-create-header-files の基本的な使い方(HELP)
sopc-create-header-files は、コマンドライン引数に .sopcinfo ファイルを指定するのみで利用可能です。オプション指定により、出力先や生成するヘッダーファイルの種類を指定することもできます。
正常時の実行結果ですが、オプション無しで .sopcinfo ファイルのみを指定した場合は、以下のようなメッセージ表示と共に各種ヘッダーファイルが生成されます。
$ sopc-create-header-files ghrd_10as066n2.sopcinfo
swinfo2header: Creating macro file 'ghrd_10as066n2.h' for SOPC Builder system 'ghrd_10as066n2'
swinfo2header: Creating macro file 'arria10_hps_0.h' for module 'arria10_hps_0'
swinfo2header: Creating macro file 'arria10_hps_0_bridges.h' for module 'arria10_hps_0_bridges'
swinfo2header: Creating macro file 'arria10_hps_0_arm_a9_0.h' for module 'arria10_hps_0_arm_a9_0'
swinfo2header: Creating macro file 'arria10_hps_0_arm_a9_1.h' for module 'arria10_hps_0_arm_a9_1'
swinfo2header: Creating macro file 'f2sdram_m.h' for module 'f2sdram_m'
swinfo2header: Creating macro file 'f2sdram_m1.h' for module 'f2sdram_m1'
swinfo2header: Creating macro file 'fpga_m.h' for module 'fpga_m'
swinfo2header: Creating macro file 'hps_m.h' for module 'hps_m'
swinfo2header: Creating macro file 'pb_lwh2f.h' for module 'pb_lwh2f'
sopc-create-header-files の HELP 出力の内容も掲載しておきます。
$ sopc-create-header-files --help
Usage: sopc-create-header-files [<sopc>] [OPTION]...
This utility creates header files from your SOPC Builder system description.
By default, the header files are in cpp format and have a .h suffix.
Other formats may be selected with the appropriate command-line option.
Options:
<sopc> Path to SOPC Builder .sopcinfo file or its directory.
If omitted, <sopc> defaults to the current directory.
If a directory is specified for <sopc>, there must be one
.sopcinfo file in the directory.
If you don't have a .sopcinfo file for your SOPC Builder system,
re-generate your system in SOPC Builder (version 8.0 or later)
to create one.
--separate-masters Don't combine a module's masters that are in the same address space
--output-dir <dirname> Put multiple header files in dirname (default is '.')
--single <filename> Create single header file called filename
--single-prefix <prefix> Prefix macros from selected single master
--module <moduleName> Module name when creating single header file
--master <masterName> Master name when creating single header file
--format <type> Header file format (default is "h")
--silent Don't display normal messages
--help Display this help message
Supported header file formats:
type suffix uses example
==== ====== ========================== ======================
h .h C/C++ header file for cpp #define FOO 12
m4 .m4 macro file for m4 m4_define("FOO", 12)
sh .sh shell scripts FOO=12
mk .mk makefiles FOO := 12
pm .pm Perl scripts $macros{FOO} = 12;
By default, multiple header files are created. There is one header file for
the entire system and one header file for each master group in each module.
A master group is a set of masters in a module in the same address space.
In general, a module may have multiple master groups.
$
Alternatively, the --single option creates one header file for one master group.
If there is one CPU module in the SOPC Builder system with one master group,
the header file will be generated for that CPU's master group.
If there are no CPU modules but there is one module with one master group,
the header file will be generated for that module's master group.
The --module and --master options can be used to override these defaults
If the chosen module has multiple master groups, the
--master option specifies the name of a master in the desired master group.
まとめ
今回紹介した方法によりエラーを回避することが可能なことは確認できておりますが、こちらは暫定の対策方法とお考え下さい。今後のツールバージョンで対策が行われる可能性もありますので、その場合は、新しいツールバージョンに適用された方法に合わせてご対応頂くことをお勧めいたします。