原创 可配置处理器的优化方法及其在多处理器SoC设计上的应用

2006-8-14 16:13 5719 9 6 分类: MCU/ 嵌入式

当今的系统开发工具已经非常先进,完全可以允许设计工程师根据具体的应用目标任务来定制微处理器核。处理器定制可以在非常短的时间内,甚至几分钟就可以根据具体应用完成片上系统处理器核的设计。由于根据具体任务来定制处理器的速度非常快,因此可配置处理器可以具有非常优异的高性能来构建片上系统的设计,并且经常用于快速建立一些功能模块,而这些功能模块如果采用人工RTL方式设计的话,则可能需要几个月的时间。正是由于可配置处理器技术的高性能和快速开发能力,使得许多最终产品在多个可配置处理器核的基础上实现了SoC。这些最终产品包括最大和最小的网络路由器以及诸如便携式摄像机、打印机和低成本视频游戏机等消费类电子产品。
   
    两种最新的开发技术已经嵌入到可配置处理器甚至SoC设计中,即全自动化、专用指令集定制技术和对处理器内部执行部件的多口访问技术。前者允许片上系统设计工程师更加专注系统体系结构方面的问题,而通过依赖自动化设计工具来完成某些单一功能模块以达到性能目标;后者则克服了存在已久的总线瓶颈问题,而这种问题从1971年第一个微处理器出现以来就一直阻碍着微处理器性能的提高。
    
    处理器定制
   
    十多年来,硬件设计工程师一直在用C或者C++对系统进行描述,进而转换成有效的硬件。最初的系统描述通常是用C或者C++写成的,因为采用这些高级语言描述的系统可以在廉价的PC上执行和评价。然而,廉价的PC并不适合许多嵌入式系统的设计,尤其是在消费电子领域,因为其功耗太大。因此,设计工程师开始希望找到一种工具来将用C或者C++写成的系统描述转换成硬件。
   
    许多像“行为综合”、“C语言硬件综合”和“ESL”设计方法都有一些不足,因为它们都试图解决在本质上很复杂的问题:用时序可执行语言写成的系统描述转换成并行互操作和非可编程的硬件模块。
   
    Tensilica公司的XPRES编译器采用一种更加简单、更加直接的方法来解决这一设计问题。XPRES编译器不是试图从头开始进行与应用相关的硬件设计,而是从一个完整的功能处理器核开始设计,然后以添加硬件执行部件和相应的机器指令的方式来增加硬件,以加速处理器上目标应用程序的执行速度。因此,XPRES编译器从一个正在工作的硬件(Xtensa微处理器核)开始设计,同时使得目标程序代码运行得更快。这种搜索的结果是完成一个微处理器的配置,此配置有一个性能/硬件开销的特性曲线。
   
    性能优化的三种技术途径
   
    XPRES编译器采用三种技术来建立优化的Xtensa处理器配置:操作数融合、单指令流多数据流(SIMD)和FLIX(可变长度指令扩展)。操作数融合技术记录程序循环语句中简单操作出现的频度。XPRES编译器将这些指令序列合并成一条增强型指令,这种增强型指令通过减少循环内部的指令条数来加速程序代码的执行。
   
    应用程序中的许多循环语句对一个数据阵列执行相同的操作,XPRES编译器可以将这些循环语句进行向量化,建立一条由多个相同执行部件并行执行多个数据项的指令。对Xtensa处理器增加SIMD指令与Tensilica的XCC C/C++编译器是一致的,该编译器能够将应用程序代码中的内循环展开并且进行向量化。通过向量化可以加速循环语句的执行,这通常和增强型指令内部SIMD运算部件的序号有关。
   
    XPRES编译器采用的第三种加速程序代码执行的技术是Tensilica的FLIX技术。FLIX指令是一种类似于融合和SIMD指令的多操作指令。然而,FLIX指令由多个独立的操作组成,而融合(fused)和SIMD指令则均为相关多操作。FLIX指令中的每一个操作都是和其它操作互相独立的,XCC C/C++编译器将彼此独立的操作压缩成一条FLIX格式的指令,而这种压缩后的指令能够显著加速程序代码的执行速度。
   
    采用可配置处理器设计MPSoC
   
    在当今的应用中,很少只用一个处理器就能满足系统的性能指标,即使采用面向目标应用的可配置处理器也很难做到。然而,多处理器MP指令集、高带宽接口和小面积使得在一个SoC设计中可以集成多个可配置处理器。
   
    SoC中处理器模块之间硬件互连机制的选择对系统性能和硅片成本产生很大影响,而且这些硬件互连机制必须直接支持多处理器系统设计的互连要求。消息传递软件通信机制直接影响到数据队列。类似地,共享存储器软件通信模式也影响到基于总线的硬件系统。可配置处理器可以提供系统以很大的灵活性,提供对共享设备和存储器进行访问所需的仲裁机制。共享存储器总线的基本拓扑结构有如下几种:
   
    1. 通过通用处理器总线访问系统全局存储器:微处理器设计一个通用接口以便实现多种总线事务处理。在读操作时,如果处理器认为相应的数据在读操作期间不在本地存储器(根据地址或者高速缓存缺失进行判断),那么处理器必须要进行全局存储器访问。处理器请求总线控制权,当控制权得到应答后,处理器通过总线发送读操作的目标地址。相应的器件(例如,存储器或者输入/输出接口)对地址进行译码,然后通过总线对处理器所需要的数据进行传送。
   
    当两个处理器通过总线对全局共享存储器进行访问时,一个处理器获得总线控制权对数据进行写操作,另一个处理器就必须稍后才能获得总线控制权以便进行读操作。按照这种方式,每个字传输需要两个总线操作周期才能完成。该方法需要适度的硬件支持,并且具有较高的灵活性,因为全局存储器和输入/输出接口通过公共总线进行访问。然而,对全局存储器的使用却难以根据处理器和器件的数量进行很好的伸缩调整,因为总线流量会使得访问时间变长以及产生不可预测的竞争延时。
   
    2. 通过通用处理器总线对处理器本地局部存储器进行访问:可配置处理器可以允许局部数据存储器参与通用总线事务处理。这些处理器基本上是由本地的处理器使用,并且二者是紧密耦合的。然而,控制局部数据存储器的处理器可以按照总线从设备的方式进行操作,如图1所示。


图1:一个处理器通过总线访问第二个处理器的局部数据存储器。
图1:一个处理器通过总线访问第二个处理器的局部数据存储器。


    第一个处理器和第二个处理器之间访问时间的不对称性适合采用“推入(push)”通信,即当第一个处理器向第二个处理器发送数据时,它将数据通过总线写到第二个处理器的局部存储器。如果写操作经过缓冲器,那么第一个处理器不必等到写操作完成就可以继续执行后面的操作。因此,到第二个处理器数据传输的长时间延时就被隐藏了。
   
    3. 通过局部总线访问多口局部存储器:当数据流在处理器之间双向传输且对时延要求比较严格时,那么对任务间通信而言,采用本地共享数据存储器通常是最好的选择。每个处理器使用自己的本地数据存储器接口来访问共享存储器,如图2所示。存储器可以有两个物理访问端口(每个时钟周期可以访问两次存储器),或者通过一个简单的仲裁器来控制。


图2:两个处理器共享局部数据存储器。
图2:两个处理器共享局部数据存储器。


    直接互连的数据端口
   
    处理器直接相连可以减少通信开销和时间。这种连接方式将数据从一个处理器的寄存器传送到另一个处理器的寄存器和执行功能部件,直接互连的一个简单例子如图3所示。当第一个处理器向输出寄存器写一个数值(通常作为计算的一部分)时,该值将自动出现在处理器的输出端口上,同样的数值可以立即输入到第二个处理器进行相应的数据操作。


图3:处理器到处理器之间通过端口直接进行访问。
图3:处理器到处理器之间通过端口直接进行访问。


    数据队列
   
    任务之间通信的最高带宽机制是数据队列的硬件实现。一个数据队列可以使系统获得每个时钟周期传输一次的数据速率,或者在宽操作数位数的情况下可以达到每秒10GB的传输速率(每个操作数几十个字节,时钟速率为几百兆赫)。生产者和消费者之间的握手信号隐含在处理器之间的接口和数据队列的头信息和尾信息之中。
   
    专用处理器允许数据队列作为指令集扩展的一部分直接进行硬件实现。数据队列可以通过一条专门指令来说明,队列可以作为结果值的目的或者使用输入队列值作为源。这种形式的队列接口方式如图4所示,该队列允许用户建立一个新的数据值,或者每个队列接口使用一个时钟周期。


图4:硬件数据队列机制。
图4:硬件数据队列机制。


    数据队列对任务间的性能有一定的影响。如果数据队列的产生和使用的速率高度一致,那么队列长度可以比较短。如果队列产生和使用的速率具有高度的可变性,那么需要设计深度队列来解决二者之间的失配问题。
   
    由于处理器执行部件的队列接口对商用处理器核而言具有极其重要的特性,因此更加深入地对接口机制进行一些探讨是非常必要的。数据队列接口通过如下TIE语法格式添加到Xtensa LX处理器中:
   
    queue in|out
   
    上面语法格式定义了数据队列的名称、宽度和队列的方向。一个Xtensa LX处理器可以包含300多个队列,每个队列宽度可以高达1024位。设计工程师可以采用数据队列来对处理器性能进行折中,即在快速、窄带处理器接口和慢速、宽带接口之间进行折中以获得系统高带宽和高性能的目的。
   
    图5为TIE队列和简单的Designware FIFO队列之间的连接,这种连接方式非常容易。TIE队列的push和pop操作由FIFO的队列空和队列满状态信号进行门控,这样可以使设计与Designware的FIFO控制模式保持一致。


图5:采用TIE队列的Designware同步FIFO示意图(diag_n输入为高,almost_full、 half_full、almost_empty和error输出均未用)。
图5:采用TIE队列的Designware同步FIFO示意图(diag_n输入为高,almost_full、 half_full、almost_empty和error输出均未用)。


    TIE队列可以和寄存器操作数、系统状态或者存储器接口那样直接为TIE指令提供输入和输出操作数。下面的TIE语法格式建立了一条新的指令,该指令对输入数据队列中的数据进行累加,然后送给寄存器文件。
   
      operation QACC {inout AR ACC} {in IQ1} {
          assign ACC = ACC + IQ1;
      }
   
    图6表示TIE队列是如何像其它指令操作数那样在Xtensa LX处理器中使用的。


图6:TIE队列用作指令操作数使用。
图6:TIE队列用作指令操作数使用。


    Xtensa LX处理器本身包括一个两项的数据缓冲器,用于缓冲系统设计工程师定义的每个TIE队列。每个队列的两项数据缓冲器所占用的面积大大小于一个加载/存储处理单元。因此,TIE队列接口所占的处理器面积是完全受到设计工程师所控制的,并且可以按照需要增大或者减小。
   
    数据流直通处理
   
    数据端口和数据队列与可配置处理器执行部件直接相连,这种互连允许处理器应用数据流直通(Flow-Through)技术进行处理,而那些应用在以前是为手工编写的RTL代码逻辑块预留的。将数据队列和输出队列接口与设计工程师定义的执行部件相结合就可以建立一个在处理器内部由固件控制的处理模块,该模块可以从输入数据队列中读取数据,对这些数据执行计算,然后按照流水线方式每完成一个“输入-计算-输出”周期就将计算结果输出。
   
    即使在处理器扩展中使用大量的硬件,但在定义时也只是仅仅写如下四行TIE代码而已:
   
      queue InData1 256 in
      queue InData2 256 in
      queue OutData 256 out
      operation QADD {} { in InData1, in InData2, in SumCtrl, out OutData} { assign OutData = SumCtrl ? (InData1 + InData2) : InData1; }
   
    前三行代码定义了一个256位的输入队列和一个256位的输出队列,第四行定义了一条新的处理器指令QADD,该指令执行256位的加法运算或者将256位的数据从输入队列送到输出队列。通过TIE语言定义的指令告诉Xtensa处理器产生器自动为处理器增加相应的硬件,同时为处理器软件开发工具增添一条新指令。
   
    可配置处理器的出现使得SoC设计工程师可以建立起一种崭新,而且非常灵活的硬件模块构建方法。同传统的固定指令集架构ISA处理器相比,可配置处理器通过添加用户定制的执行功能部件、寄存器和寄存器堆以及专用通信接口能够获得很高的系统性能。
   
    自从1971年第一个微处理器研制成功至今已经30多年,由于受固定处理器核的束缚,导致可配置处理器的发明无法实现。对于现在的SoC设计而言,这些制约因素已经不再存在,而且这些过时的约束也不再限制系统设计工程师对处理器的使用。

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
9
关闭 站长推荐上一条 /3 下一条