Vengineerの妄想(準備期間)

人生は短いけど、長いです。人生を楽しみましょう!

Zynq MPSoCで、コンピュータを学ぼう (その6)

はじめに

「Zynq MPSoCで、コンピュータを学ぼう」のその5です。

  • その1 : Xilinx社のZynqUltrascale+ MPSoC について
  • その2 : Zynq Ultrascale+ MPSoC がどのように立ち上がっていくのか
  • その3 : Linux の dts を見て、どのようなハードウェアを使っているのか?
  • その4 : Linuxデバイスドライバについて
  • その5 : Programmable Logic
  • その6 : QEMU (Zynq Ultrascale+ MPSoC の実物が無くても、Linuxが立ち上がる)

QEMU とは?

QEMUとは、オープンソースのプロセッサエミュレータです。本物のコンピュータが無くても、Windowsマシン、Linuxマシン、MacOSの上で、Zynq Ultrascale+ MPSoC が動くということです。

XilinxQEMUは、下記にあります。

github.com

このQEMUでサポートしている、Zynq Ultrascale+ MPSoC 搭載ボードとしては、zcu102 です。

github.com

zcu102 は、下記のように Ultra96/Kria KV260 よりも立派な Zynq Ultrascale+ MPSoC が搭載されています。コンピュータ部のSoCのところは同じですが、Programming Logicのサイズが全然違います。

  • Ultra96 : XCZU3EG
  • Kria KV260 : XCK26
  • zcu102 : XCZU9EG

japan.xilinx.com

Ultra96やKria KV260とは違いますが、zcu102 でも特に問題ありません。

QEMU と SystemC + Verilog HDL (Verilator)

このブログでは、XilinxQEMU と SystemC + Verilog HDL (Verilator) で Programmable Logic に実装した Verilog HDLの動作確認がデバイスドライバを含めて確認することができます。

vengineer.hatenablog.com

vengineer.hatenablog.com

vengineer.hatenablog.com

vengineer.hatenablog.com

vengineer.hatenablog.com

おわりに

6回に分けて、「Zynq MPSoCで、コンピュータを学ぼう 」について、説明してきました。

次回は、まとめ回です。コンピュータを学ぶことで得られる、

お金の余裕から心の余裕、そして。。。。 について書きますので、是非、お楽しみに。

Zynq MPSoCで、コンピュータを学ぼう (その5)

はじめに

「Zynq MPSoCで、コンピュータを学ぼう」のその5です。

  • その1 : Xilinx社のZynqUltrascale+ MPSoC について
  • その2 : Zynq Ultrascale+ MPSoC がどのように立ち上がっていくのか
  • その3 : Linux の dts を見て、どのようなハードウェアを使っているのか?
  • その4 : Linuxデバイスドライバについて
  • その5 : Programmable Logic
  • その6 : QEMU (Zynq Ultrascale+ MPSoC の実物が無くても、Linuxが立ち上がる)

Zynq Ultrascale+ MPSoC の他のコンピュータと大きな違いが、Programming Logic を内蔵しているところです。この Programming Logic にユーザが独自に回路(ハードウェア)を実装できるというのが大きなポイントです。

今回は、この Programming Logic についてみていきます。

Programming Logic

Xilinx は30年も前から FPGA を開発・販売しています。FPGAは Proggramming Logic、回路(ハードウェア)をプログラムできるというものです。 30年も前では、回路図エディタに ANDゲートやFlipflopなどを並べて回路を書き、その後、ツールには配置・配線をしていました。その後、HDLというソフトウェアっぽい言語を使って、回路を表現し、シミュレーションして機能の確認後、論理合成ツールにて ANDゲートやFlipflop、RAMに変換したものを配置・配線します。

  • 回路をHDLで表現する
  • シミュレーションして機能の確認
  • 論理合成ツールで ANDゲートやFlipflop、RAMに変換
  • 配置・配線

は、他のSoCやGPUなどのほとんどの半導体でも行っています。つまり、半導体開発とはどのようなことも学べるのです。

とはいえ、SoCやGPUなどの半導体開発では、これ以外にもいろいろなことがやらなくてはいけません。そして、決定的に違うのは何らかの不具合が発生した場合、その不具合を修正するには膨大な時間と費用が掛かるということです。Programming Logic である FPGAでは、その回路がProgramming Logic内に所望の動作周波数で入りさえすれば、修正に伴う時間と費用は SoCやGPUなどの半導体開発よりは遥かに少ないです。

ちなみに、最先端の半導体プロセスになると、半導体の修正は、数か月(長いと1年以上)という時間と億単位の費用が掛かってしまいます。

Programming Logicとコンピュータ部が一緒になったのは、2010年頃にアナウンスがあった Xilinx の Zynq です。Zynqでは、Arm Cortex-A9x2 をベースにしたコンピュータと Programming Logic が1つの半導体の中に同居することになり、今では コンピュータと一緒に使う回路を別チップのFPAG(Programming Logic)が必要に無くなりました。

Vivadoを使えば、OK!

Zynq Ultrascale+ MPSoC では、Xilinx社の Vivado という開発ツールを使えば、Programming LogicをHDL(Verilog HDL/VHDL)から開発できます。Vivadoでは、HDLで回路を表現し、シミュレーションにて機能の確認、論理合成にて、Programming Logicへの内部表現への変換、そして、配置・配線まで行い、Programming Logicを動作させるために必要な bitstream というROMデータの生成行えます。

また、HDLの代わりに、 C/C++ を使って開発できる Vitis というツールも Xilinx は提供しています。Vitis は C/C++のコードを HDL に変換し、その後、Vivado にて bitstream まで生成します。

なお、VivadoやVitisの使い方について、Xilinxのマニュアルをよく読み、困った時は、FPGAの部屋 に行けば、だいたい解決します。

ツールは使うだけでいい?

Vivado や Vitis は回路を実装するためのツール(手段)ですが、その手段であるツールがどのように動いているかなどを知るのは、いいお仕事をする上では非常に重要になるものと、あたしは思っています。

Xilinx社のマニュアルにはある程度のことは書いてありますが、実際にツールを動かしたときに生成されるファイルについてはそれほど詳しく書いてはないです。

そんな時には、あたしが調べた、「xxxx の中を調べる」という薄い本が役に立ちます。まー、宣伝です。

Vivado、シミュレーションに使う xsim/ZynqMP SoC VIP、Vitis のマニュアルには書いていないことまで、いろいろと書きましたので、是非、覗いてみてください。

おわりに

Zynq Ultrascale+ MPSoC の最大なる特徴である、Programming Logicにて、見てきました。

次回は、その6 : QEMU (Zynq Ultrascale+ MPSoC の実物が無くても、Linuxが立ち上がる) です。

Zynq MPSoCで、コンピュータを学ぼう (その4)

はじめに

「Zynq MPSoCで、コンピュータを学ぼう」のその4です。

  • その1 : Xilinx社のZynqUltrascale+ MPSoC について
  • その2 : Zynq Ultrascale+ MPSoC がどのように立ち上がっていくのか
  • その3 : Linux の dts を見て、どのようなハードウェアを使っているのか?
  • その4 : Linuxデバイスドライバについて
  • その5 : Programmable Logic
  • その6 : QEMU (Zynq Ultrascale+ MPSoC の実物が無くても、Linuxが立ち上がる)

Linuxデバイスドライバ

前回は、Linux の dts ファイルの cpus のところで、CPUを見てみました。CPUと同様に各デバイスドライバも dts ファイルの中に書いてあります。

zynqmp.dtsi ファイルGPU の部分を見ています。

gpu エントリーとして、0xfd4b0000 がレジスタのベースアドレスです。デバイスドライバとして、compatible にある "arm,mali-400", "arm,mali-utgard" を使います。ARM社のGPU Mali-400 (mali-utgard)のデバイスドライバを使います。Zynq Ultrascale+ MPSのEGとEVには、Mali-400MP2が載っています。MP2とは、GPUコアが2個載っています。そのことを示しているのが、clock-names の中の "gpu_pp0" と "gpu_pp1" です。この gpu_pp がGPUコアに対応します。

      gpu: gpu@fd4b0000 {
            status = "disabled";
            compatible = "arm,mali-400", "arm,mali-utgard";
            reg = <0x0 0xfd4b0000 0x0 0x10000>;
            interrupt-parent = <&gic>;
            interrupts = <0 132 4>, <0 132 4>, <0 132 4>, <0 132 4>, <0 132 4>, <0 132 4>;
            interrupt-names = "IRQGP", "IRQGPMMU", "IRQPP0", "IRQPPMMU0", "IRQPP1", "IRQPPMMU1";
            clock-names = "gpu", "gpu_pp0", "gpu_pp1";
            power-domains = <&zynqmp_firmware PD_GPU>;
        };

SPIに対しては、2つ (spi0/spi1) が搭載されています。compatible の "cdns,spi-r1p6" とあるように Cadence社のIPを使ってます。この compatible に対応するデバイスドライバを探せばいいのです。

      spi0: spi@ff040000 {
            compatible = "cdns,spi-r1p6";
            status = "disabled";
            interrupt-parent = <&gic>;
            interrupts = <0 19 4>;
            reg = <0x0 0xff040000 0x0 0x1000>;
            clock-names = "ref_clk", "pclk";
            #address-cells = <1>;
            #size-cells = <0>;
            power-domains = <&zynqmp_firmware PD_SPI_0>;
        };

        spi1: spi@ff050000 {
            compatible = "cdns,spi-r1p6";
            status = "disabled";
            interrupt-parent = <&gic>;
            interrupts = <0 20 4>;
            reg = <0x0 0xff050000 0x0 0x1000>;
            clock-names = "ref_clk", "pclk";
            #address-cells = <1>;
            #size-cells = <0>;
            power-domains = <&zynqmp_firmware PD_SPI_1>;
        };

Cadenceの SPI のデバイスドライバは、spi-cadence.c です。

下記のように、.compatible に、"cdns,spi-r1p6" があります。

static const struct of_device_id cdns_spi_of_match[] = {
    { .compatible = "xlnx,zynq-spi-r1p6" },
    { .compatible = "cdns,spi-r1p6" },
    { /* end of table */ }
};

他のデバイスドライバも dts ファイル内の compatible を見て、デバイスドライバディレクトリ (drivers) の下から見つければいいだけです。 見つけたら、どんなことを行っているのかを調べるだけです。

Linxuのデバイスドライバって、どうなっているの?

Linux 2.6までであれば、下記の「Linuxデバイスドライバ 第3版」を読めばよかったのですが、今のLinuxのバージョンは、6 ですから、もう 2.6 なんていつの頃?って感じですよね。

www.amazon.co.jp

第4版(英語版)ですが、3.2 ですね。

www.kinokuniya.co.jp

平田豊さんの「Linuxデバイスドライバの開発 (I/O BOOKS) 」は、5.2 対応なので、こちらの方がいいですね。

こちらのサイトも参考になりそうです。

wiki.chobits.com

おわりに

今回は、Linuxデバイスドライバについて見てみました。

Zynq Ultrascale+ MPSoC だけでなく、x86-64Apple M1 の Linux でも 各 dts を見れば、どんなデバイスが繋がっていて、そのデバイスドライバソースコードをみることができます。

Asahi LinuxApple M1/M2 の dts ファイルは、下記のところにあります。

是非、調べてみてください。

Zynq MPSoCで、コンピュータを学ぼう (その3)

はじめに

「Zynq MPSoCで、コンピュータを学ぼう」のその2です。

  • その1 : Xilinx社のZynqUltrascale+ MPSoC について
  • その2 : Zynq Ultrascale+ MPSoC がどのように立ち上がっていくのか
  • その3 : Linux の dts を見て、どのようなハードウェアを使っているのか?
  • その4 : Linuxデバイスドライバについて
  • その5 : Programmable Logic
  • その6 : QEMU (Zynq Ultrascale+ MPSoC の実物が無くても、Linuxが立ち上がる)

Linux の dts を見て、どのようなハードウェアを使っているのか?

Linuxソースコードを調べるポイントとしては、次の2つです。

  • dts ファイルの中を見て、どのようなハードウェアを使っているのか?
  • dts ファイルの中で使っているハードウェアのデバイスドライバは何をやっているのか?

今回は、この2つの内、最初の dts ファイルの中を見ていきます。

dts って何?

dts とは、device tree source の略です。Qiita に説明があります。

qiita.com

dts を DTC (Device Tree Compiler) というソフトウェアでコンパイルしたのが、DTB (Device Tree Blob) です。この DTB ファイルを Linux で使います。

Linuxで使っている DTB ファイルは、DTC にて逆アセンブルしてくれます。

Xilinx社に関係する dts の場所は、

github.com

にあります。

  • Ultra96 v1用 : avnet-ultra96-rev1.dts
  • Kria KV260用 : zynqmp-sm-k26-revA.dts / zynqmp-smk-k26-revA.dts

の dts があります。

Ultra96 v1用の avnet-ultra96-rev1.dts を見てみます。zynqmp-zcu100-revC.dts という dts ファイルを include しています。

/dts-v1/;

#include "zynqmp-zcu100-revC.dts"

/ {
    model = "Avnet Ultra96 Rev1";
    compatible = "avnet,ultra96-rev1", "avnet,ultra96",
             "xlnx,zynqmp-zcu100-revC", "xlnx,zynqmp-zcu100",
             "xlnx,zynqmp";
};

zynqmp-zcu100-revC.dts の最初で、zynqmp.dtsi ファイルを include しています。

/dts-v1/;

#include "zynqmp.dtsi"
#include "zynqmp-clk-ccf.dtsi"
#include <dt-bindings/input/input.h>
#include <dt-bindings/interrupt-controller/irq.h>
#include <dt-bindings/gpio/gpio.h>
#include <dt-bindings/pinctrl/pinctrl-zynqmp.h>
#include <dt-bindings/phy/phy.h>

zynqmp-sm-k26-revA.dts でも同様に zynqmp.dtsi ファイルを include しています。

zynqmp.dtsi の中を覗いてみますと、下記の cpus に、ARM Cortex-A53x4 のエントリーがあります。

#include <dt-bindings/dma/xlnx-zynqmp-dpdma.h>
#include <dt-bindings/gpio/gpio.h>
#include <dt-bindings/power/xlnx-zynqmp-power.h>
#include <dt-bindings/reset/xlnx-zynqmp-resets.h>

/ {
    compatible = "xlnx,zynqmp";
    #address-cells = <2>;
    #size-cells = <2>;

    cpus {
        #address-cells = <1>;
        #size-cells = <0>;

        cpu0: cpu@0 {
            compatible = "arm,cortex-a53";
            device_type = "cpu";
            enable-method = "psci";
            operating-points-v2 = <&cpu_opp_table>;
            reg = <0x0>;
            cpu-idle-states = <&CPU_SLEEP_0>;
        };

        cpu1: cpu@1 {
            compatible = "arm,cortex-a53";
            device_type = "cpu";
            enable-method = "psci";
            reg = <0x1>;
            operating-points-v2 = <&cpu_opp_table>;
            cpu-idle-states = <&CPU_SLEEP_0>;
        };

        cpu2: cpu@2 {
            compatible = "arm,cortex-a53";
            device_type = "cpu";
            enable-method = "psci";
            reg = <0x2>;
            operating-points-v2 = <&cpu_opp_table>;
            cpu-idle-states = <&CPU_SLEEP_0>;
        };

        cpu3: cpu@3 {
            compatible = "arm,cortex-a53";
            device_type = "cpu";
            enable-method = "psci";
            reg = <0x3>;
            operating-points-v2 = <&cpu_opp_table>;
            cpu-idle-states = <&CPU_SLEEP_0>;
        };

        idle-states {
            entry-method = "psci";

            CPU_SLEEP_0: cpu-sleep-0 {
                compatible = "arm,idle-state";
                arm,psci-suspend-param = <0x40000000>;
                local-timer-stop;
                entry-latency-us = <300>;
                exit-latency-us = <600>;
                min-residency-us = <10000>;
            };
        };
    };

cpus の cpu0 を詳しく見てみます。cpuX: cpu@X の X は、コアの番号です。compatible の部分がどんなコアかを示すもので、"arm,cortex-a53"、つまり、ARM Cortex-A53 だということを示しています。

      cpu0: cpu@0 {
            compatible = "arm,cortex-a53";
            device_type = "cpu";
            enable-method = "psci";
            operating-points-v2 = <&cpu_opp_table>;
            reg = <0x0>;
            cpu-idle-states = <&CPU_SLEEP_0>;
        };

この中のポイントは、enable-method です。これは、省エネの時にどのような方法を行って制御するのかを示すもので、ここでは、"psci" となっています。psci とは、Power State Coordination Interface の略で、サスペンド、シャットダウン、リブートなど、Arm プロセッサのシステ ム電源ステータスを制御するための標準インターフェイスです。psci のエントリーは、下記のようになっています。"arm,psic-0.2", method が "smc" です。

  psci {
        compatible = "arm,psci-0.2";
        method = "smc";
    };

PSCIについては、下記のスライドにまとめていますので、参考にしてくださいね。

www.slideshare.net

PSCIは、ARM v8 64ビットの標準的な省エネ機能を実現するソフトウェアです。ただし、サーバーやAppleのM1シリーズ/M2 に関しては、"psci" にはなっていません。M1 (t8103) の dts ファイル (t8103.dts) の cpu0 のエントリーを見てみます。enable-method は、"spin-table" になっています。

      cpu0: cpu@0 {
            compatible = "apple,icestorm";
            device_type = "cpu";
            reg = <0x0 0x0>;
            enable-method = "spin-table";
            cpu-release-addr = <0 0>; /* To be filled by loader */
        };

"spin-table" の時の処理は、下記の smp_spin_table.c がそのようです。

github.com

おわりに

2016年2月20日(金)のZynq Ultrasclae+ MPSoC 勉強会で使った資料です。

この時には、Zynq Ultrascale+ MPSoC の実物はまだリリースされていませんでした。

こちらには、前半はブートの説明、後半はLinuxの説明をしています。

参考までに

Zynq MPSoCで、コンピュータを学ぼう (その2)

はじめに

「Zynq MPSoCで、コンピュータを学ぼう」のその2です。

  • その1 : Xilinx社のZynqUltrascale+ MPSoC について
  • その2 : Zynq Ultrascale+ MPSoC がどのように立ち上がっていくのか
  • その3 : Linux の dts を見て、どのようなハードウェアを使っているのか?
  • その4 : Linuxデバイスドライバについて
  • その5 : Programmable Logic
  • その6 : QEMU (Zynq Ultrascale+ MPSoC の実物が無くても、Linuxが立ち上がる)

Zynq Ultrascale+ MPSoC がどのように立ち上がっていくのか

Zynq Ultrascale+ MPSoC は、次のステップで立ち上がります。

  • 内部ROMが起動
  • 内部ROMがストレージから FSBL (First Stage Boot Loader) をロードし、FSBL を起動
  • FSBL がストレージが ATF (Arm Trusted Firmware) の bl31 を DRAM にロードし、ATF (bl31) を起動
  • FSBL がストレージから U-Boot を DRAM にロードし、U-Boot を起動
  • U-Boot がストレージから LinuxDRAM にロードし、Linux を起動

Zynq Ultrascale+ MPSoC では、上記のような流れになっていますが、ARM v8 の 64bit コアの SoC ではほぼ同じ流れになっています。

x86-64Linuxマシンも同様に、x86-64の内部ROMからブートして、FSBLとU-Bootが x86-64 用のBIOSやBoot Loaderになるだけで、流れは同じです。

上記の流れの内、下記の4種類のソースコードは、公開されています。つまり、内部ROMのコード以外は全部、ソースコードが提供されていることになります。

また、これ以外に、PMU (Platform Management Unit) なるものがあり、その中にある Microblaze (Xilinx社の独自32ビットマイコン)が動いています。その Microblaze で動いている Firmware が 下記の PMU Firmware です。

おわりに

今回は、「Zynq Ultrascale+ MPSoC がどのように立ち上がっていくのか」を見てみました。

Google君に聞くと、上記な流れでブートすると書いているだけで、それぞれのソースコードの中までを解説する記事はほとんどありません。

ソースコードの中を調べて、どのようなことをやっているかを調べるだけで、いろいろなことを知ることができます。ソースコードでは、Zynq Ultrascale+ MPSoC の各種レジスタ等にアクセスしますので、そのレジスタがどんなものでなんのためにやっているかをZynq Ultrascale+ MPSoCの仕様書を読むことで理解が深まります。

コスパやタイパを考えると、そこまでやる必要がないよね。思うかもしれませんが、全く調べたことが無い人と、一回でもキチンと調べたことがある人ではその後それなりの違いが出るものだとあたしは思っています。

ということで、

ということで、コンピュータを学ぶことができるのです。

そういうことは、教科書には書いてありませんが、お仕事をする上では、絶対に必要なことです。

Zynq MPSoCで、コンピュータを学ぼう (その1)

はじめに

いつものように土曜日は、いろいろと考える日なのです。

今回は数日前に2時間ばかり 1on1 という言うか雑談をして、感じたことに関してです。

それは、コンピュータのことを学ぶにはどうすればいいのか?

結果から言うと、「Xilinx社の ZynqUlltrascale+ MPSoC搭載のボード」に関して徹底的に学ぶということです。

コンピュータのことを学ぶ

皆さんは、

などのコンピュータを使っていますね。そして、これらのコンピュータを使って、いろいろなこと(お仕事や趣味、娯楽)をしていますね。

それで、これらのコンピュータの中がどうなっているのかを知りたい、と思ってもなかなかわかりませんよね。

Google君に聞いたら、

国立情報学研究所の市民講座、「コンピュータ は どうやって動くのか?」という資料を見つけました。

この資料だけを見て、コンピュータって、こうやって動くんだ、と思えたら、天才だと思います。

話を本題に戻します。

例えば、スマホiPhoneタブレットiPad、PCの Macbook は、Appleが独自に開発したSoC(System on Chip : チップ:半導体の上にシステムを作っちゃいます)をベースに作られています。このSoC(A15とかM1/M2)のスペック(仕様)はちょっとだけ公開されていますが、具体的なものはほとんど公開されていません。Asahi Linux を移植するためにいろいろな方法を使って、機能の確認をしてはいますが、Appleは公式には一切公開していません。

また、Androidスマホタブレットでも多少は違いますが、搭載されているSoCの詳細はほとんど公開されていません。WindowsマシンやLinuxマシンもAppleのプロダクトと比べると情報は公開されてはいますが、詳細まで公開されていません。

となると、コンピュータを学ぶということになると、WindowsLinuxMacOSが搭載されているコンピュータの上でアプリケーションを書いて動かすというソフトウェア中心になってしまいます。

これではコンピュータを学ぶというより、アプリケーションを作るためのソフトウェアを学ぶになってしまいます。

ZynqUltrascale+ MPSoC とは?

Xilinx社が開発・販売している ZynqUltrascale+ MPSoC とは、どんなものでしょうか?

  • SoC
  • CPUコアに、ARM Cortex-A53x4 と Cortex-R5Fx2
  • GPUコア(EGとEVシリーズ)、ARM Mali-400MP2
  • Memory は、DDR4/3/3L, LPDDR4/3
  • Display Port
  • USB 3.0
  • SATA 3.1
  • PCIe 1.0/2.0
  • GbE

と一般的なコンピュータで使うもののほとんどが入っています。

これらに加えて、

  • Programmable Logic

というユーザーオリジナルの回路を搭載できる部分が入っています。

japan.xilinx.com

どんなボードを買えばいいのか?

まずは、ボードを買う必要はありません。

最初は、

  • ドキュメント
  • ソフトウェアのソースコード解析
  • シミュレーション

にて、学ぶのでお金を払って、ボードを買う必要はありません。

ボードを買う段階になったら、下記の2つがいいのでは?と思います。他にもいろいろありますが、最初はお手軽に使えるものがいいので、お値段と公開されている情報が多いものがいいでしょう。

Kria KV260 が出る前は、Ultra96 が一番よかったですが、開発元がXilinxではなく、AVNETであるため、Xilinx社からの情報はあまり出ていませんでした。Kria KV260 が出たことにより、Xilinx社からはKria KV260に関する情報が多く出ています。

Ultra96はXCZU3EGで、Kria KV260はXCZU5EVのようなので、Programmable Logicが多いのとビデオ コーデック ユニット (VCU)が入っています。それでお値段もKria LV260の方が1万円以上もお安いですね。

半導体としての SoC だけではない

Zynq Ultrascale+ MPSoC を使うためのソフトウェアの多くが github 公開されています。それらソフトウェアは、多くの人が使っているオープンソースコードに対して、ZynqUltrascale+ MPSoC に対応する部分を追加した感じになっています。つまり、これらのソースコードの中を調べることで、そのソースコードがどのようになっているのかも学べられるので、一石二鳥なんです。

github.com

Linux用 - Arm Trusted Firmware : ARM Cortex-A53用のFirmware - U-bool (u-boot-xlnx) - Linux (linux-xlnx), device-tree-xln - QEMU - Runtime (XRT) - Xilinx MALI repo for EGL / OpenGLES binaries and headers

スタンドアローン・ソフトウェア用 - The standalone software (embeddedsw)

Cortex-R5用 - open-amp (Cortex-R5用)

組み込みで使われている Yocto 。手間がかかって面倒ですが、組み込みではほぼ標準なので。今回は、Yocto に関しては説明しません。 - Yocto 関連 : meta-xilinx, meta-xilinx-tools, meta-petalinux

シミュレーション環境 - libsystemctlm-soc (LibSystemCTLM-SoC) および demo

Zynq ではなく、Zynq Ultrascale+ MPSoC なのか?

SoCベースのFPGAなら Zynq Ultrascale+ MPSoC じゃなくて、Zynq でいいのでは? という人もいるでしょう!

確かに、Zynq しかなければ、Zynq でいいと思っていました。2010.10.17 の ブログ「俺様SoCのアイデア、募集中」では、XilinxとAltera(当時)が ARM Cortex-A9 コアを搭載したFPGAを発表したことを受けて、自分オリジナルのSoCができるじゃん。そのSoCのことを「俺様SoC」と呼ぶことにしました。 確か、この頃、「俺様」というフレーズが流行っていたのだと思います。

vengineer.hatenablog.com

XilinxがZynq Ultrascale+ MPSoCを発表したのが、2015年の3月です。

vengineer.hatenablog.com

この時点でAltera(当時)もCortex-A53x3搭載のStratix 10 SoCを発表していました。

ZynqとZyqn Ultrascale+ MPSoC の大きな違いは、CPUコアが ARM v7 か ARM v8 ということです。CPUコアが ARM v7 から ARM v8 になったことで、32ビットから64ビットになりました。また、Linuxに関しても ARM v7 の32ビットに関しては、各SoC毎にいろいろなコードが乱立していて、当時、Linus くんがそのことに対して激怒していました

Linuxの ARM v8 の 64ビットに対しては、32ビットとはかなり違って、コードがすっきりしています。

また、スマホタブレットAppleのPCのほとんどが、ARM v8 の 64ビットのCPUコアです。ちなみに、WindowsマシンやLinuxマシンも 64ビットのCPUコア(だいたいが、x86-64IntelAMD) です。

今現在使われている 64ビットをCPUコアベースのものを学んだ方が、この先もずーと使えるということで、Zynq よりも Zynq Ultrascale+ MPSoC の方がいいんです。

このシリーズで見ていく内容

この「Zynq MPSoCで、コンピュータを学ぼう」シリーズで見ていく内容です。

  • その1 : Xilinx社のZynqUltrascale+ MPSoC について
  • その2 : Zynq Ultrascale+ MPSoC がどのように立ち上がっていくのか
  • その3 : Linux の dts を見て、どのようなハードウェアを使っているのか?
  • その4 : Linuxデバイスドライバについて
  • その5 : Programmable Logic
  • その6 : QEMU (Zynq Ultrascale+ MPSoC の実物が無くても、Linuxが立ち上がる)

おわりに

次回は、ZynqUltrascale+ MPSoC がどのように立ち上がっていくのかを学ぶにはどうしたらいいのかについて、見ていきます。

Intel Sapphire Rapidsの 1 die 版

はじめに

twitterIntel Sapphire Rapids の 1 die (MCC) のブロック図が流れてきたので、見てみました。

32 コア?

下記のtweet です。

  • Mesh: 8x6
  • Cores: 32
  • PCIe: 96L (80 PCIe + 8 DMI enabled)
  • UPI: 96L
  • DDR5: 512b+128b
  • GPIO: 4x(?)
  • Accelerators: 2 QAT + 2 DSA (Half of XCC)

4 die の Sapphire Rapids (XCC)は、

  • Mesh: 4x4 x 4
  • Core: 15 x 4 (実際は、14 x 4 = 56コア)
  • PCIe: x16 が 2個 (32 lanes) x 4 = 128 lanes
  • UPI: x24 x 4 = 96 lanes
  • DDR5 : 128b x 4 = 512b
  • Accelerator: DSA/QAT/DLB x 4

です。

コア数は、56コア => 32コア ですね。

Ice Lake の 40コア版では、

  • Mesh: 8x7
  • Core: 40
  • UPI: 3 block
  • PCIe: Gen4 x16 x 4

MCC (32コア) < Ice Lake (40コア) < XCC (64コア)

って、感じですね。UPIは、MCC と XCC で同じすね。DDR5 は、同じっぽい感じがしますね。そうなると、ピン互換になる可能性大ですね。

おわりに

Sapphire Rapds、遅れに遅れて、まだ正式リリースされていません。XCCではなく、MCCが先に出てきちゃうことになることはないでしょうかね。

Ice Lake -SP のBlock図もTweetしてくれました。

関連ブログ

vengineer.hatenablog.com