SiFive Freedomビルド方法:Arty-A7向けビットストリーム作成



バージョン: 2025/02/20

目次:

  1. SiFive Freedom について
  2. Freedomのビルド(Chisel→Verilog)
  3. Arty-A7用ビットストリーム作成

1. SiFive Freedom について

1.1. SiFive Freedom の概要

SiFive Freedom とは
  • • Rocket chip を搭載したオープンソース実装のプラットフォーム
  • • 以下で公開
  • • 2つのプラットフォーム
    • • Freedom E300 RTOS 向け32bit => Arty A7に対応
    • • Freedom U500 Linux 向け64bit

Freedom の位置づけ
  • • 現在は、chipyard に移行

Caravel

2. Freedomのビルド(Chisel→Verilog)

2.1. Freedom の現状の課題と対応策

Freedomをビルドするための課題
  • • コード凍結のため、古い環境が必要(と思われる)
  • • サブモジュールが存在しないURLをリンク

対応策
  • • リポジトリやツールはホスト側で準備し、コンテナでビルド
  • • プロジェクトフォルダをホストとコンテナで共有

Caravel

2.2. dockerの利用について

docker とは : https://ja.wikipedia.org/wiki/Docker
  • • コンテナ仮想化によるOSレベルの仮想化

Docker の場合、Linux上で仮想化

Caravel


Hypervisor の場合、OS自体を仮想化

Caravel


docker 利用方法 (Dockerfileの利用有無)

ubuntu 公式イメージをそのまま使用

Caravel

Dockerfile をビルドして利用

Caravel

2.3. Verilog生成までの手順

手順

Caravel

2.4. freedom ファイルの取得(1)

git clone による取得
git clone https://github.com/sifive/freedom.git
submodule の展開 → エラー発生
cd freedom git submodule update --init --recursive
エラー発生個所
git submodule status --recursive
-65cc4d2748a2c2e6f2... rocket-chip/riscv-tools/riscv-gnu-toolchain/riscv-qemu/dtc -87eea99e443b389c97... rocket-chip/riscv-tools/riscv-gnu-toolchain/riscv-qemu/pixman -e3d05727a074619fc1... rocket-chip/riscv-tools/riscv-gnu-toolchain/riscv-qemu/roms/SLOF -04186319181298083e... rocket-chip/riscv-tools/riscv-gnu-toolchain/riscv-qemu/roms/ipxe -c5542f226c0d3d61e7... rocket-chip/riscv-tools/riscv-gnu-toolchain/riscv-qemu/roms/openbios -c559da7c8eec5e45ef... rocket-chip/riscv-tools/riscv-gnu-toolchain/riscv-qemu/roms/openhackware +99d9b4dcf27d7fbcba... rocket-chip/riscv-tools/riscv-gnu-toolchain/riscv-qemu/roms/qemu-palcode (heads/master) -e2fc41e24ee0ada60f... rocket-chip/riscv-tools/riscv-gnu-toolchain/riscv-qemu/roms/seabios -23d474943dcd55d055... rocket-chip/riscv-tools/riscv-gnu-toolchain/riscv-qemu/roms/sgabios -2072e7262965bb48d7... rocket-chip/riscv-tools/riscv-gnu-toolchain/riscv-qemu/roms/u-boot -19ea12c230ded95928... rocket-chip/riscv-tools/riscv-gnu-toolchain/riscv-qemu/roms/vgabios

2.4. freedom ファイルの取得(2)

URLの変更内容

rocket-chip/riscv-tools/riscv-gnu-toolchain/riscv-qemu/.gitmodules

path 変更前URL 変更後URL
roms/vgabios git://git.qemu-project.org/vgabios.git/ https://github.com/qemu/vgabios.git
roms/seabios git://git.qemu-project.org/seabios.git/ https://github.com/qemu/seabios.git
roms/SLOF git://git.qemu-project.org/SLOF.git https://github.com/qemu/SLOF.git
roms/ipxe git://git.qemu-project.org/ipxe.git https://github.com/qemu/ipxe.git
roms/openbios git://git.qemu-project.org/openbios.git https://github.com/qemu/openbios.git
roms/openhackware git://git.qemu-project.org/openhackware.git https://github.com/qemu/openhackware.git
roms/qemu-palcode git://github.com/rth7680/qemu-palcode.git https://github.com/qemu/qemu-palcode.git
roms/sgabios git://git.qemu-project.org/sgabios.git https://github.com/qemu/sgabios.git
pixman git://anongit.freedesktop.org/pixman https://gitlab.freedesktop.org/pixman/pixman.git
dtc git://git.qemu-project.org/dtc.git https://github.com/qemu/dtc.git
roms/u-boot git://git.qemu-project.org/u-boot.git https://github.com/qemu/u-boot.git

URLの変更後に再度Update
git submodule sync –recursive git submodule update --init --recursive

2.4. freedom ファイルの取得(3)

ビルドエラーの原因となるファイルの修正 対象ファイル:

rocket-chip/firrtl/project/plugins.sbt
rocket-chip/chisel3/project/plugins.sbt

修正内容:

以下の先頭1行を削除 (理由:URLが無効のため、エラーとなる)

resolvers += Resolver.url("scalasbt", new URL("http://scalasbt.artifactoryonline.com/scalasbt/sbt-plugin-releases")) (Resolver.ivyStylePatterns) resolvers += Classpaths.sbtPluginReleases resolvers += "jgit-repo" at "http://download.eclipse.org/jgit/maven" addSbtPlugin("org.scalastyle" %% "scalastyle-sbt-plugin" % "1.0.0") addSbtPlugin("org.scoverage" % "sbt-scoverage" % "1.5.1") ...

2.5. ツールの取得(1)

必要なツール
名称 version 説明
sbt 1.2.1 Chisel のビルドに必要
バージョンの特定:scala 2.12.4に対応したバージョンを検索
Java (openjdk) 11 バージョンの特定:以下のサイトに記載あり
https://docs.scala-lang.org/overviews/jdk-compatibility/overview.html
Ubuntu 18.04 では、openjdk-11をapt-get で取得可能
verilator 3.922 Verilogのシミュレーション用
バージョンの特定:README.md に記載あり
RISC-V toolchain 10.2.0 バージョンの特定:SiFive社のツールチェーンの最新版
https://github.com/sifive/freedom-tools/releases

2.5. ツールの取得(2) sbt のバージョン特定

以下の手順でsbt のバージョンを特定

Caravel

2.5. ツールの取得(3) sbt の取得

sbt の取得方法
  • • apt のソースリストにsbtリポジトリを追加
  • • sbtの特定バージョンをダウンロード
apt のソースリストにsbtリポジトリを追加
sudo apt-get update echo "deb https://repo.scala-sbt.org/scalasbt/debian all main" | sudo tee /etc/apt/sources.list.d/sbt.list echo "deb https://repo.scala-sbt.org/scalasbt/debian /" | sudo tee /etc/apt/sources.list.d/sbt_old.list curl -sL "https://keyserver.ubuntu.com/pks/lookup?op=get&search=0x2EE0EA64E40A89B84B2DF73499E82A75642AC823" | ¥ sudo -H gpg --no-default-keyring --keyring gnupg-ring:/etc/apt/trusted.gpg.d/scalasbt-release.gpg --import sudo chmod 644 /etc/apt/trusted.gpg.d/scalasbt-release.gpg sudo apt-get update
sbtの特定バージョンをダウンロード
apt-get download sbt=1.2.1

2.5. ツールの取得(4) verilator の取得

verilator の取得
  • • ※ README.md に記載の手順から変更
ファイルの準備
git clone https://github.com/verilator/verilator
v3.922 のチェックアウト
cd verilator git checkout -b verilator_3_922 v3.922

2.5. ツールの取得(5) RISC-Vツールチェーンの取得

RISC-Vツールチェーンの取得
  • • README.md には具体的なバージョンの記載なし
  • • SiFive社の以下のサイトからファイルを取得
SiFive Freedomツールチェーン

https://github.com/sifive/freedom-tools/releases

December 2020 Tools Release の取得
wget https://static.dev.sifive.com/dev-tools/freedom-tools/v2020.12/riscv64- unknown-elf-toolchain-10.2.0-2020.12.8-x86_64-linux-ubuntu14.tar.gz
適切なフォルダに展開(コンテナと共有するディレクトリ以下)
tar xzf riscv64-unknown-elf-toolchain-10.2.0-2020.12.8-x86_64-linuxubuntu14. tar.gz –c <コンテナからアクセス可能なディレクトリ>

2.6. コンテナの起動(1)前提条件

前提条件: 以下のように設定する。
<user> ユーザアカウント(sudo,およびdocker グループに入っていること)
<project> プロジェクト名
<group> ユーザが所属するグループ
<uid> ユーザのuser id <uid>は、”id –u” で取得、
<gid> ユーザのgroup id <gid>は、”id –g” で取得
共有フォルダの構成。

Caravel

2.6. コンテナの起動(2)起動

プロジェクト・フォルダから docker を起動。
cd /home/<user>/<project> docker run –it –v $PWD/$PWD ubuntu:18.04 /bin/bash
パラメータ 意味
docker run dokcer コンテナの起動
-it i: interactive t: tty
-v $PWD:$PWD コンテナとホストが/home/<user>/<project>を共有
ubuntu:18.04 Ubuntu 18.04LTSの起動(docker hubからダウンロード)
/bin/bash /bin/bashを起動

2.7. コンテナのセットアップ(1) rootでのセットアップ

必要アプリの取得(以下はrootで実行)
apt-get update apt-get install -y sudo ca-certificates curl wget locales
<user> の作成(sudo権限をもたせる)
groupadd -g <gid> <group> useradd -g<gid> -m -s /bin/bash -u <uid> <user> usermod -G sudo <user> echo '%sudo ALL=(ALL) NOPASSWD:ALL' >> /etc/sudoers
<user> に変更
su <user>

2.7. コンテナのセットアップ(2)

sbt のインストール(以降は、ユーザ権限での対応)
cd <sbtのダウンロード場所> sudo dpkg –i sbt_1.2.1_all.deb
sbt に必要なパッケージのインストール(下記の全部が必要か不明)
sudo apt-get install –y openjdk-11-jdk git scala device-tree-compiler sudo apt-get install -y autoconf automake autotools-dev bison flex build-essential sudo apt-get install -y bc gawk texinfo gperf libtool patchutils python pkg-config sudo apt-get install -y libmpc-dev libmpfr-dev libgmp-dev zlib1g-dev libexpat-dev

2.7. コンテナのセットアップ(3)

verilator のビルドとインストール
cd <verilatorのローカルリポジトリ> unset VERILATOR_ROOT autoconf ./configure make sudo make install
RISC-Vツールチェーンのパス設定
cd <RISC-Vツールチェーンの親ディレクトリ> export RISCV=$PWD/riscv64-unknown-elf-toolchain-10.2.0-2020.12.8-x86_64-linux-ubuntu14 PATH=$PATH:$RISCV/bin

2.8. ビルドの実施

sbt の事前実行
  • • make の前にsbt を単独で実行する
cd /home/<user>/<project>/freedom sbt sbt:freedom> exit
make の実行
make -f Makefile.e300artydevkit verilog

3. Arty-A7 用ビットストリーム作成

3.1. ビットストリーム作成の対応方針

作成方針
  • • ホスト側で設定変更
  • • vivado を使用するまではコンテナでビルド
  • • vivado は、ホストで実行

Caravel

3.2. ボード設定の変更

自分のボード情報に合わせて変更 ボードをartyからarty_a7_100 に変更
diff --git a/Makefile.e300artydevkit b/Makefile.e300artydevkit index 110c08a..3476a60 100644 --- a/Makefile.e300artydevkit +++ b/Makefile.e300artydevkit @@ -6,7 +6,7 @@ MODEL := E300ArtyDevKitFPGAChip PROJECT := sifive.freedom.everywhere.e300artydevkit export CONFIG_PROJECT := sifive.freedom.everywhere.e300artydevkit export CONFIG := E300ArtyDevKitConfig -export BOARD := arty +export BOARD := arty_a7_100
ボードバージョンを1.1に変更(フォルダ fpga-shells)
diff --git a/xilinx/arty_a7_100/tcl/board.tcl b/xilinx/arty_a7_100/tcl/board.tcl index 70635da..552d70f 100644 --- a/xilinx/arty_a7_100/tcl/board.tcl +++ b/xilinx/arty_a7_100/tcl/board.tcl @@ -1,5 +1,5 @@ # See LICENSE for license details. set name {arty-a7-100} set part_fpga {xc7a100ticsg324-1L} -set part_board {digilentinc.com:arty-a7-100:part0:1.0} +set part_board {digilentinc.com:arty-a7-100:part0:1.1}

3.3. romgen ビルド

コンテナ側からromgen ビルド
make -f Makefile.e300artydevkit romgen

3.4. Vivado のボード設定の確認と追加(1)

Vivado環境にarty-a7-100が含まれるか確認する (1)tclモードで起動
vivado –mode tcl
(2)get_board_parts でボード情報を取得する
xhub::refresh_catalog [xhub::get_xstores xilinx_board_store] get_port_parts ... digilentinc.com:arty-a7-100:part0:1.0 digilentinc.com:arty-a7-100:part0:1.1 ...
Red: arty-a7-100がある場合 このまま終了

(3)arty-a7-100をボード情報に追加する

arty-a7-100がない場合 -> 追加する

xhub::install [xhub::get_xitems "*arty-a7*"]
ここでvivado を一旦、終了

3.4. Vivado のボード設定の確認と追加(2)

(4)vivado 起動時の設定

追加したボード情報は、ホームディレクトリにインストールされているため、
vivado 起動時に設定が必要

echo ¥ “set_param board.repoPaths [get_property LOCAL_ROOT_DIR [xhub::get_xstores xilinx_board_store]]” ¥ >>~/.Xilinx/Vivado/2024.1/Vivado_init.tcl
(5)ボード情報の再確認

arty-a7-100が追加されていることを確認する

get_port_parts
vivado を再起動して以下を実行

3.5. mcs ビルド

mcs ビルド
  • • mcsファイルが生成されることを確認する
make -f Makefile.e300artydevkit mcs