Vitis:初探软硬件协同

less than 1 minute read

Published:

初探软硬件协同相关知识

Xilinx的遗产和AMD的现状

Xilinx作为FPGA的龙头,自然FPGA是最主要的产品。但是近几年也逐渐开始向异构的SoC进军,比如出名的ZYNQ,Versal等,ZYNQ就是CPU+FPGA的SoC,Versal是CPU+FPGA+AIE的SoC,AIE有第一代,还有第二代,后面还将其用在笔记本电脑上作为NPU。还有剩下的传统FPGA(Spartan® / Artix® / Kintex® / Virtex®)就不赘述了。

那么对其进行开发,就需要Xilinx(以下称为AMD)的全家桶,主要是Vitis和Vivado,分别做软件开发和硬件开发;据我的理解,AMD提供了一些已有的IP,可供开发者基于这些IP来设计硬件电路,生成Verilog代码甚至编译的产物,这里我还不太清楚,在操作的过程中看到过xspm的文件(预先定义好的硬件平台),以及在一些视频教程中导出的xsa文件,似乎是和硬件相关的,之后软件开发就是基于这个硬件平台的,代码也可以是在这个上面运行。

在Vitis中,实际包装好了编译所需要的全部环境(其实也就是一般IDE的功能),需要先编译平台platform,再编译应用,应用可以分为裸机,Linux系统和freeRTOS系统的版本。可以使用SW仿真,HW仿真或者直接用开发板。

Vitis初探

  1. Windows
  • 如果没有板子,不建议使用Windows。因为仿真需要petalinux,这个只有linux平台可以安装
  • 较新的版本删除了AIE相关的示例,旧一些的也挺好的
  1. Linux
  • 由于是WSL,所以直接用命令行操作了
  • 使用v++进行编译,需要指定kernel,这个就是一个函数;主机代码运行在PS,kernel运行在PL/AIE
  • kernel被编译位a.xo的文件,通过链接可以生成a.xclbin,这里包含了在PL/AIE上执行的代码

参考

听了一个ZYNQ的课程:https://www.bilibili.com/video/BV1Et421H75m/

计算机连接

/*
 *                    [CPU]
 *                     │
 *                     ├─[内存控制器]─┬─[内存条A] (16GB 3200MHz)
 *                     │            └─[内存条B] (16GB 3200MHz)
 *                     │
 *                     └─[PCIe 4.0根复合体]
 *                        │
 *                        ├─[PCIe x16]─────[独立显卡] (GPU)
 *                        │   ├─ VRAM: 8GB GDDR6
 *                        │   └─ 显示输出: DP/HDMI
 *                        │
 *                        ├─[PCIe x4]─────[NVMe SSD]
 *                        │   ├─ 容量: 1TB
 *                        │   └─ 接口: M.2 2280
 *                        │
 *                        ├─[PCIe x1]─────[网卡] (2.5G Ethernet)
 *                        │
 *                        └─[芯片组] (PCH/南桥)
 *                           │
 *                           ├─[SATA控制器]─┬─[SATA SSD] (500GB)
 *                           │             ├─[HDD] (2TB 7200RPM)
 *                           │             └─[光驱]
 *                           │
 *                           ├─[USB控制器]─┬─[USB 3.2 Gen2]
 *                           │            ├─[键盘]
 *                           │            ├─[鼠标]
 *                           │            ├─[外置存储]
 *                           │            └─[其他USB设备]
 *                           │
 *                           ├─[音频编解码器]─┬─[扬声器]
 *                           │              ├─[麦克风]
 *                           │              └─[耳机]
 *                           │
 *                           ├─[PS/2接口]──[传统键盘/鼠标]
 *                           │
 *                           └─[传统PCI]──[扩展卡]
 */

知识点:

  1. CPU只有2个出口,一个是IMC(内存控制器),另一个是PCIe根复合体。
  2. CPU和内存是异步的,所以CPU和内存的时钟频率可以不同。
    1. 内存的传输速度公式:传输速度 = 内存频率 * 数据宽度 / 8;例如3200MHz的内存,数据宽度为64位,那么传输速度为3200MHz * 64位 / 8位 = 25.6GB/s。数据宽度64是最常见的。
    2. CPU的IMC决定了双通道内存,4个内存条中1和2是一个通道,3和4是另一个通道,所以插2个要插在1和3,或者2和4。双通道的话速度可以翻倍,从25.6GB/s提升到51.2GB/s
  3. CPU和PCIe也是异步的,CPU的时钟频率和PCIe的时钟频率可以不同。
    1. PCIe的传输速度公式:传输速度 =(传输速率 × 编码方式 × 通道数)÷ 8;例如PCIe 4.0的传输速率为16GT/s,编码方式为128b/130b,通道数为16,那么传输速度为(16GT/s × 128b/130b × 16)÷ 8 = 31.5GB/s
    2. 显卡和固态硬盘都是用这个传输。
  4. USB顾名思义就是串行,所以也需要有编码方式,计算公式和PCIe类似,只不过没有多个通道。USB的速度5Gbps指经过编码后的,而PCIe的16GT/s是原始的,他们只差一个编码效率的系数,USB 3.0的传输速约为500MB/s。因为串行传输,所以需要编码。