大数跨境
0
0

英飞凌Aurix™ TC4x 并行处理单元(PPU)模块详解

英飞凌Aurix™ TC4x 并行处理单元(PPU)模块详解 刚哥的运营笔记
2025-09-28
13
导读:并行处理单元(PPU)是TC4x系列的重磅功能,其引入的专用向量DSP计算集群,将向量处理能力融入传统的安全微控制器架构。在区域控制器的模型预测控制、ADAS传感器的信号处理,以及EV的电池管理算法等


#01

简  介


当今的汽车产业正经历一场百年未有的深刻变革,其核心是从传统的机械定义软件定义汽车(Software Defined Vehicles, SDV的范式转移。在这一背景下,汽车不再是单纯的交通工具,而是逐渐演进为一个集成了高性能计算、复杂感知、智能决策和万物互联的移动智能终端。这一转变对汽车电子系统的计算能力、能效和灵活性提出了前所未有的苛刻要求。


在诸多关键技术挑战中,对海量实时数据的处理能力已成为核心瓶颈。无论是自动驾驶的传感器融合(摄像头、激光雷达、毫米波雷达)、高级驾驶辅助系统(ADAS)的实时图像与信号处理,还是智能座舱的多模态人机交互(语音识别、手势控制)、车辆动力与底盘系统的精密控制,都需要在极低的功耗和严格的实时性约束下,完成巨量的数学计算(如矩阵运算、傅里叶变换、滤波、卷积等)。


传统的通用处理器(CPU)因其架构特点,在处理这些密集型计算时往往效率不足,难以兼顾性能与功耗。因此,专为高效处理数学运算而设计的数字信号处理器(DSP)计算核,其重要性在汽车嵌入式领域日益凸显。DSP凭借其并行的硬件乘法累加单元(MAC)、优化的哈佛架构、以及针对特定算法设计的指令集,能够在相同主频下提供远超CPU的计算吞吐量和能效比,成为实现上述复杂功能的理想算力基石。其应用前景正从传统的音频处理等单一功能,迅速扩展到自动驾驶、智能座舱、区域控制等汽车E/E架构的核心领域,成为新一代汽车SoC(系统级芯片)中不可或缺的关键计算单元。


为迎接这一趋势,英飞凌科技(Infineon)作为全球汽车半导体领域的领导者,推出了其新一代AURIX™ TC4x系列微控制器。TC4x系列不仅继承了AURIX家族在功能安全(ISO 26262 ASIL-D)和网络安全方面的卓越基因,更是在计算架构上实现了重大飞跃,旨在为下一代软件定义汽车提供强大的、可扩展的硬件平台。


TC4x系列的诸多创新中,并行处理单元(Parallel Processing Unit, PPU 的引入尤为亮眼。PPU并非一个独立的DSP内核,而是一个高度专业化、可灵活配置的计算加速器集群。它紧密地集成在AURIX TriCore™主核的旁边,专门用于卸载主核的高计算负载任务,特别是那些高度并行、规则且计算密集的信号处理和数学运算。



本文将探讨TC4x模块中的PPU。我们将详细介绍其设计理念、架构组成、工作原理以及如何通过其强大的并行计算能力,并进行调试示例演示。




#02

功能介绍


2.1 PPU总览


PPU模块内核选择的是新思科技(Synopsys)的DesignWare ARC EV71处理器,是新思科技的ARC EV系列内核。ARC EV系列是Synopsys专门为嵌入式视觉、传感器融合和人工智能处理而设计的高性能DSP处理器家族。


其内核是一种超长指令字(VLIW)向量架构,能将标量和向量指令组合在一个指令包中,支持双精度浮点运算,向量核支持单指令多数据(SIMD)处理。具备分散/聚集(scatter/gather)功能的多存储体L1向量存储器,同时集成了流传输单元(具有DMA功能),配备多个物理通道,具备多存储体L2集群共享存储器(CSM)。支持来自多种源的中断和异常处理,具有配置与状态报告接口,同时支持低功耗特性。


其内部结构如下图所示。



从图中可以看出,PPU模块主要包含标量单元组向量DSP单元组流传输单元(Streaming Transfer UnitSTU,簇共享内存(Cluster Shared MemoryCSM),以及总线接口单元等连接模块组成。


其中标量单元组负责获取并解码指令,作为标量单元组成部分的中断单元,负责处理来自系统中断路由器的中断请求以及来自定时器等内部组件的中断请求。PPU可接收中断路由模块IR的中断信号,同时也能够向其发送相关中断请求。


向量DSP单元与标量核心紧密集成。向量指令被转发至向量DSP单元,并在其三个执行槽之一中执行。向量指令通常对向量寄存器文件中的向量进行操作,而向量与内存之间的数据移动则通过向量寄存器文件和向量内存(VMEM)之间的向量加载和存储指令完成。部分向量指令可以返回标量值,该值会被写入标量单元寄存器文件中的标量寄存器。


VMEMCSMPPU外部内存之间的数据传输由流传输单元(STU处理。STU可通过标量核心编程配置,也可通过STU-DMI接口由外部主机进行配置。


集群共享内存(CSM)提供大容量、高吞吐量的存储空间。它可用于存储指令和数据,支持可缓存和不可缓存模式。外部主机可通过CSM-DMI接口访问CSM


实时跟踪单元(RTT)用于跟踪PPU处理器的程序流。其配置由标量核心通过辅助寄存器完成。出于调试目的,可使用内存映射调试寄存器接口来访问所有内部核心寄存器。


ARConnect模块是系统功能的集合,例如全局定时器和中断分发单元。


要访问PPU的安全相关信息,可使用安全监控器接口来访问诊断寄存器。


特殊功能寄存器(SFR)接口包含控制和状态信息,允许应用软件配置基本的PPU选项(例如运行或停止控制)并读取当前处理器状态。


2.2 时钟


在介绍子模块之前,我们先介绍PPU模块的时钟。


在时钟系统文章中我们介绍过,PPU与系统时钟共用一个锁相环,但是具有独立的时钟分频计算。


图片


对于PPU时钟源,这里我们主要关注三个参数,也就是预分频值P-DIV、反馈分频值NDIV和输出分频值K3PREK3-DIV系统时钟的计算主要依赖这三个参数。其运算公式如下:


图片


  • P预分频值P-DIV+1P-DIV对应寄存器SYSPLLCON0.PDIV


  • N反馈分频值NDIV+1NDIV对应寄存器SYSPLLCON0.NDIV


  • K3PRE分数输出分频值,对应寄存器为SYSPLLCON1.K3PREDIV,具有一定的分数映射关系


  • K3输出分频值K3-DIV+1K3-DIV对应寄存器SYSPLLCON1.K3DIV


本文环境的系统晶振为25MHzP-DIV设置为0,也就是fREF25MHzNDIV设置为19K3PRE具有如下映射关系:


图片


将其设置为10,即二分频;然后将K3-DIV设置为0,进行一倍分频,最终得到fPLLPPU=250MHz


2.3 标量运算单元Scalar unit


PPU是一个异构计算模块,其内部计算单元包括标量运算单元(Scalar Unit)和向量DSP运算单元。其中标量计算单元(Scalar Unit)是该模块的控制核心和命令中心。可以将其理解为PPU内部的大脑管理者


TC4xPPU模块中的标量单元是其核心控制中枢。它不直接处理繁重计算,而是负责整个PPU的指令读取、解码与流程控制。该单元管理任务调度、处理中断异常,并通过特殊功能寄存器接口与主TriCore CPU通信,接收命令和上报状态。其内核寄存器如图所示。


图片


同时,标量单元作为数据调度中心,能编程控制流传输单元(STU)进行高效数据搬运,并为向量计算单元分派任务。其与向量单元采用紧密耦合设计,确保控制与计算高效协同,使PPU成为一个能独立运作的自治性协处理器,满足汽车功能安全的高可靠性要求。


标量单元采用多级流水线结构,实现了ARCv2指令集架构。在ARC EV处理器家族中,标量单元与向量DSP单元协同工作(向量单元将在后续章节详细阐述)。


下图展示了标量单元的流水线结构概览:前半部分呈现指令获取单元的执行步骤,后半部分展示执行单元的工作流程。执行单元包含实现乘加运算(MAC)、乘法、除法、算术逻辑(ALU)、加载/存储及浮点指令的功能模块。标量单元的指令获取部分既服务于标量指令获取,也承担向量指令的获取任务,该获取单元支持超长指令字(VLIW)的获取。


图片


标量单元采用具备高预测精度的复杂分支预测逻辑及早期分支解析机制,从而显著降低平均误预测代价。该分支预测逻辑可推测分支目标地址,有效减少流水线停滞,进而优化每指令时钟周期数(CPI)。标量单元的整体运行特性表现为高度活跃的流水线,在典型程序中可实现接近每周期一条指令的吞吐效率。


该标量核与TriCore™主核采用相同的内存地址映射,也是将内存分配为16Segment,每个256M,且与主核处于相同的地址空间。同时其内部地址具备Cache,具备双地址映射,支持直接跨过Cache访问。


该标量核还具备WatchDog功能,同时其内部相关失效都会传递到SMU模块,以保证功能安全特性。


图片


有关PPU标量核的内核原理及相关指令集,这里就不展开介绍了,感兴趣的读者可阅读《DesignWare ARCv2 ISA Programmer’s Reference Manual for ARC EV7xFS Processors》。


2.4 向量DSP单元(VDSP


向量DSP单元是PPU(并行处理单元)的核心组成部分,它支持基于512/256/128位宽向量寄存器的SIMD(单指令多数据)运算。该单元专门执行ARCv2架构的向量DSP指令集。


向量DSP单元采用512/256/128位宽架构,包含向量寄存器文件和向量存储器。该单元采用Load/Store体系结构:向量指令(如加法或乘法)在向量寄存器文件中的向量上进行操作,而向量与内存之间的数据传输则通过向量加载和存储指令在向量寄存器文件与向量存储器之间完成。


PPU向量DSP单元包含64个向量寄存器,其命名方式为"vr"后接索引号(例如vr0)。向量存储器在系统内存层次结构中作为向量的Level 1L1)数据存储器。向量寄存器有512/256/128位宽,具体看芯片型号。


图片


单个向量寄存器可容纳的向量元素数量取决于元素大小element_size)。例如,一个512位的向量寄存器可包含:648位元素,或3216位元素,或1632位元素。图34-1展示了每向量寄存器可容纳的元素数量示意图。


图片


向量DSP单元与标量单元紧密集成:标量单元负责获取和解码指令,执行包括分支和跳转指令在内的标量指令,并由分支预测单元进行分支预测。当指令解码器识别出向量指令时,该指令会连同最多三个标量操作数被发送至向量DSP单元。向量DSP单元以SIMD方式执行向量指令(即对所有向量元素执行相同操作),通常对向量寄存器文件中的向量进行操作。部分向量指令可返回标量值,该值将被写入标量单元寄存器文件中的标量寄存器。


向量DSP单元支持向量指令的多发射:当标量单元向向量DSP单元发射指令时,该指令可编码为一个包含多条向量指令的指令包,这些指令可由向量DSP单元同时执行,同时标量单元还可执行一条标量指令。此类指令包被称为超级指令。该内核最多支持16字节的超长指令。


向量DSP单元拥有多个可并行运行的功能单元,包括加载/存储单元、乘累加单元、算术逻辑单元(ALU)和浮点单元。向量寄存器文件的高位寄存器用作向量累加器寄存器。DSP指令支持饱和处理、缩放和舍入操作。


下图框图更详细地展示了向量DSP单元中不同功能单元的组成结构。



向量DSP单元的功能单元分为三个执行槽,共同对向量寄存器文件中的操作数进行处理。该向量DSP配备三条ALU流水线(每个执行槽一条),支持每个指令包最多包含三条ALU指令。


执行槽0和执行槽1各包含一个MAC流水线,这意味着每个超级指令包最多可打包两条乘法/MAC类指令。执行槽2中的VMEM加载/存储流水线支持单条非对齐向量加载/存储指令。跨元素指令(如混洗指令)在向量存储器的聚集/散列网络上执行,这些指令会占用加载/存储流水线。


MAC流水线支持单次发射32x3216x168x8乘法或乘累加类指令。每个32位向量元素对应一个32x32乘法器,每个16位元素对应一个16x16 MPY/MAC单元,每个8位元素对应一个8x8 MPY/MAC单元。


整数除法在向量ALU功能单元中通过基-2算法实现,每个时钟周期计算一位结果。ALU还通过迭代算法执行平方根指令,同样每个时钟周期计算一位结果。


向量寄存器单元包含八个双倍宽累加器。每个双倍宽累加器占用两个向量寄存器(例如:16x16乘法运算产生的32位结果需要使用双倍宽累加器)。每个双倍宽累加器可拆分为两个标准尺寸的累加器。


ARV V2的向量指令集并不复杂,类似RISC指令集,例如vvadd指令,表示两个向量相加,存放到另一个向量中。


图片


读者可查询DesignWare EV71手册,此处不展开介绍,下文会有实践。


2.5 流传输单元 Streaming Transfer Unit (STU)


PPU集成有流传输单元(STU),该单元可用于在以下存储器之间进行数据传输:


  • 向量存储器(VMEM


  • 集群共享存储器(CSM


  • PPU功能模块外部存储器


STU可通过STU-DMI接口接收来自处理器核心及外部主设备的数据传输请求,并根据源地址、目标地址、传输数据量和寻址模式等控制信息,将数据从一个存储位置传输至另一个存储位置。STU会从系统内存空间的角度区分每个事务的地址。


STU模块的结构如下图所示。


图片


处理器核心与外部主设备可通过虚拟通道(Entry)同时发起多个数据传输。每个核心的Entry数量可软件配置,每个Entry对应请求FIFO中的一个条目,包含源/目标地址、寻址模式和传输数据量等控制信息。所有Entry按序存储在请求FIFO中处理。


请求分发器将数据传输请求分配给物理通道。物理通道通过读取STU_CTRLSTU_SRC_L/H等系统寄存器获取控制信息,将传输任务分块交给内部引擎执行。传输引擎通过IBP总线实现数据搬运, burst长度和起始地址根据控制信息计算。


每个物理通道每次处理一个Entry,但多个物理通道可并行工作。当多个请求FIFO发起请求时,采用轮询仲裁机制分配至空闲物理通道。物理通道必须完成当前FIFO权重(STU_WEIGHT)规定的最少Entry数量后,方可服务其他FIFO请求。


STU通道的控制采用的类似Geth模块中的描述符机制,利用一个基地址指针指向一个结构体,结构体中定义了每个Entry的信息,如目标地址、源地址、长度等。


图片


STU的传输支持线性地址buffer模式和块地址Buffer模式,线性地址模式中,地址为连续值。


图片


而块地址模式中,地址可以是二维视图中间某块区域。


图片


STU模块会向IR模块发出中断请求信号,如通道完成中断、通道错误中断等。


图片


2.6 簇共享地址 Cluster shared memory (CSM)


簇共享存储器(CSM)在ARC EV处理器内部提供大容量、高吞吐的内存资源。它可用于存储指令和数据,支持可缓存与不可缓存地址空间。因此,处理器核心可通过内存访问指令和取指操作来访问CSM


如下图是TC4Dx系列中PPU CSM的地址映射。


图片


图片


ARC EV处理器内部组件(如标量单元、STU)通过IBP(内部总线协议)接口访问CSM,而外部主设备则通过CSM-DMI接口并经由SRI接口访问CSM


CSM根据地址字的[5:3]位划分为八个存储体(memory bank),每个存储体位宽为64位。因此,来自不同接口的多个事务可同时访问CSM


当访问地址落在CSM空间区域时:


  • 处理器核心的事务通过BIU(总线接口单元)路由至CSM


  • 流传输单元(STU)的事务直接路由至CSM


若两个及以上端口同时读写同一RAM存储体,则采用轮询仲裁策略实现随机公平性。当没有待处理的IBP事务时,CSM时钟将被门控以降低动态功耗。


由于CSM采用内存ECC保护,内部存储体增加了额外位用于存储ECC校验位。该机制可检测全零和全一错误模式。




#03

代码及调试示例


本文使用的代码示例来自英飞凌iLLD BaseFramework_TC4DA_Ppu,版本为V2.3.0,读者可自行前往官网下载。


3.1 开发环境


本文使用的开发调试IDE为英飞凌官方的BIFACES,下载iLLD之后,在其中导入示例工程,然后修改编译器配置。



同样Config.mk文件中需要修改对应的编译器位置。


图片


编译器使用的是Tasking公司针对Aurix™ TC4x芯片TriCore™ 1.8内核专门推出的SmartCode编译器,嵌入在ADS软件中,注意需要使用License,可以向官方申请试用版。


另外SmartCode还支持编译ARV EV7X内核代码,以支持开发者进行PPU模块的工程开发。


调试使用的软件是ADS或者SmartCode内置的WinIDEA,调试器硬件是开发板自带的miniWiggler JDS调试器,通过USB直接连接电脑即可。


3.2 工程及代码解析


本文的示例中,使用TriCore™主核于PPU进行通信,并使用PPU进行一组向量运算。


3.2.1 镜像链接


PPU模块在架构上是独立于TriCore™内核的,因此其具有单独的镜像,该工程包含了TriCore™部分代码和PPU代码,会分两部分编译,TriCore™PPU分别有各自的编译产物,需要通过调试器将两个Hex文件分别刷入控制器。


不过工程中还提供了iHex2Array.exe工具,能够将PPU镜像转换成C语言常量数组,笔者这里是将该数组链接到PPU指定代码区域,然后编译到TriCore™镜像中,这样直接调试ELF文件即可完成两部分的刷新。


前文提到PPU有专有的CSM,可以作为PPU专用的RAM进行访问,TriCore™主核也能够直接通过地址进行访问。


工程中将Flash0x81300000的位置分配给PPU作为镜像编译链接地址,用于存放代码及向量表等。示意图如下。



首先对PPU工程进行编译,然后通过iHex2Array.exePPU工程的hex文件转换为C语言数组,然后对数组进行地址定义,映射到0x81300000位置。


C/* 链接文件描述 */group{    /* Fixed memory Allocations for PPU code placement in PFLS5 */    group ppu_code (ordered, run_addr= mem:pfls5[sizeof(mem:pfls5)-LCF_PPU_FLASH_SIZE])    {        select "*.ppu_code";    }    "__PPU_IF_CONSTANTS"= addressof(group:ppu_code);    "__PPU_CODE_START""_lc_gb_ppu_code";    "__PPU_CODE_END""_lc_ge_ppu_code";}


C#pragma protect#pragma section farrom "ppu_code"__attribute__ ((aligned(32))) const unsigned char PPU_Image_Array[]= {  /*0x000000:@0x81300000*/ 0x10U, 0x00U, 0x30U, 0x81U, 0x00U, 0x00U, 0x08U, 0xB2U, 0x50U, 0x01U, 0x00U, 0x00U, ......};#pragma section farrom restore#pragma endprotect


然后编译TriCore™工程,此时PPU工程的镜像将被定位到0x81300000位置,并被包含于TriCore™镜像中,此时刷写TriCore™工程即可将PPU工程附带更新到芯片中。


但是TriCore™在启动后,需要将PPU模块的向量表搬运到CSM的开头位置,之后才能启动PPU核。


3.2.2 数据结构


主核对于TriCore核没有复杂的配置逻辑,只需要复制PPU的向量表,然后启动该核就可以了,所以没有特殊的配置结构体,仅有一个PPU核镜像Header结构体,放在PPU镜像的头部,TriCore™主核用来识别其向量表信息。


C++typedef struct{    void *const    sourceAddress;    void *const    destinationAddress;    const uint32   size;} SharedData_PpuCopyTable;typedef struct{    /* !!! Don't alter the position of structure members !!! */    SharedData_PpuCopyTable  ppuCopyTable;     /**< \brief PPU Copy-table for TriCore*/    TcPpuIpcData *const      ppuIpcDataPtr;    /**< \brief Data pointer for PPU IPC */} SharedData_PpuIfConstants;


其中sourceAddress定义了向量表在镜像中的位置,destinationAddress定义了向量表需要被搬运到的地方,可以通过VECBASE寄存器来定义PPU向量表的位置,本文示例中放置在CSM的开头,即0xB2080000size则定义了向量表的大小,单位字节,一个入口4字节。


3.2.3 初始化


由于PPU内核启动逻辑比较简单,这里将TriCore™主核和PPU画到同一个图上。



主核会在启动后,会通过IfxPpucCore_enableModule使能PPU模块,即启动PPU模块时钟,但此时PPU并未真正工作。


然后主核会对CSM内存进行一次清零,并进行PPU向量表的加载。


然后主核通过IfxPpucCore_startCore操作PPU_CTRL.REQR寄存器,真正启动PPU内核。


然后主核通过while循环调用PpuInterface_isPpuBootedUp,等待PPU启动,这里使用的是GPSR中断位,而PPU启动之后在main中通过调用TriCoreInterface_flagPpuBootedUp通知主核,即设置GPSR中断位。


至此两个核都完成了初始化。


3.2.4 向量运算


下面通过向量运算,来演示PPU模块的DSP特性。


如前所述,PPU模块的寄存器尺寸跟随芯片型号,本文使用的是TC4D9PPU寄存器尺寸为256bit位宽。


不同的编译器厂商会对向量运算的指令进行封装,在编译器的include文件arc_vector.h文件中会定义各个数据类型,以及各种向量运算接口。


C#define vvadd(x, y)                   __builtin_vvadd(x, y)#define vvsub(x, y)                   __builtin_vvsub(x, y)#define vvmpy(x, y)                   __builtin_vvmpy(x, y)#define vvdiv(x, y)                   __builtin_vvdiv(x, y)


然后我们进行基本的数据类型定义,声明了两个向量,用于进行数据计算;为了便于观测,我们声明了两个向量指针,指向CSM区域的0xB20900200xB2090040,使用指针将最终结果保存到该地址。


C++volatile __vector(8) signed int *VAR_VectorMon1 = (__vector(8) signed int *)0xB2090020;volatile __vector(8) signed int *VAR_VectorMon2 = (__vector(8) signed int *)0xB2090040;volatile __vector(8) signed int TestVector1 = {0x01010101, 0x02020202, 0x03030303, 0x04040404, 0x05050505, 0x06060606, 0x07070707, 0x08080808};volatile __vector(8) signed int TestVector2 = {0x01010101, 0x01010101, 0x01010101, 0x01010101, 0x01010101, 0x01010101, 0x01010101, 0x01010101};


前文提到寄存器位宽为256,因此一个寄存器能够处理的元素数量为832-bit位宽)、1616-bit位宽)和328-bit位宽)。这里使用__vector(8)表示定义长度为8的向量,使用81632以外的数据在256bitPPU模块是不被允许的。


然后进行向量的加法运算和乘法运算。在向量运算中,如果使用标量,意味着向量的每个元素都会与该标量进行运算,如代码中TestVector1中的每个元素都会乘以2


C*VAR_VectorMon1 = vvadd(TestVector1, TestVector2);*VAR_VectorMon2 = vvmpy(TestVector1, 2);


然后我们调试,并观察内存数据。



如图所示,红框中的两行为两组运算的结果,从图中可以看出,第一行中两个向量的结果进行了相加,第二行中对向量进行了乘法,使向量中的每个元素都乘以2,读者也可使用两个向量相乘,这里不做演示。


以上就是本次示例全部内容,主要是为了给读者提供具体的工程化开发方法。PPU可以用来实现傅里叶变换、神经网络算法、卡尔曼滤波等计算,卸载MCU的计算工作,并进行加速,感兴趣的读者可以自行编码实现,也可以使用Simulink@中英飞凌提供的模型库,或者新思科技(Synopsys)提供的DSP和数据库。




#04

小  结


本文系统阐述了英飞凌AURIX™ TC4x微控制器中创新的并行处理单元(PPU)。文章详述了其以ARC EV71为核心、集标量控制与向量DSP计算于一体的异构架构,深入分析了标量单元、向量DSP单元、流传输单元(STU)及簇共享内存(CSM)等关键子模块的工作原理与协同机制,并通过实际的向量运算调试示例展示了具体的工程化开发方法。


并行处理单元(PPU)是TC4x系列的重磅功能,其引入的专用向量DSP计算集群,将向量处理能力融入传统的安全微控制器架构。在区域控制器的模型预测控制、ADAS传感器的信号处理,以及EV的电池管理算法等应用场景中,PPU以可承受的成本赋能人工智能应用,通过优化性能、降低成本和加速上市时间,推动汽车领域的创新。


【声明】内容源于网络
0
0
刚哥的运营笔记
跨境分享舍 | 长期分享行业参考
内容 42972
粉丝 0
刚哥的运营笔记 跨境分享舍 | 长期分享行业参考
总阅读270.2k
粉丝0
内容43.0k