Vitis:初探软硬件协同
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初探
- Windows
- 如果没有板子,不建议使用Windows。因为仿真需要petalinux,这个只有linux平台可以安装
- 较新的版本删除了AIE相关的示例,旧一些的也挺好的
- 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]──[扩展卡]
*/
知识点:
- CPU只有2个出口,一个是IMC(内存控制器),另一个是PCIe根复合体。
- CPU和内存是异步的,所以CPU和内存的时钟频率可以不同。
- 内存的传输速度公式:传输速度 = 内存频率 * 数据宽度 / 8;例如3200MHz的内存,数据宽度为64位,那么传输速度为3200MHz * 64位 / 8位 = 25.6GB/s。数据宽度64是最常见的。
- CPU的IMC决定了双通道内存,4个内存条中1和2是一个通道,3和4是另一个通道,所以插2个要插在1和3,或者2和4。双通道的话速度可以翻倍,从25.6GB/s提升到51.2GB/s。
- CPU和PCIe也是异步的,CPU的时钟频率和PCIe的时钟频率可以不同。
- PCIe的传输速度公式:传输速度 =(传输速率 × 编码方式 × 通道数)÷ 8;例如PCIe 4.0的传输速率为16GT/s,编码方式为128b/130b,通道数为16,那么传输速度为(16GT/s × 128b/130b × 16)÷ 8 = 31.5GB/s。
- 显卡和固态硬盘都是用这个传输。
- USB顾名思义就是串行,所以也需要有编码方式,计算公式和PCIe类似,只不过没有多个通道。USB的速度5Gbps指经过编码后的,而PCIe的16GT/s是原始的,他们只差一个编码效率的系数,USB 3.0的传输速约为500MB/s。因为串行传输,所以需要编码。
