作为RTL设计方法的一种替代,可配置处理器和传统RTL设计方法一样采用相同的数据通路结构,如深度流水、并行执行部件、专用任务状态寄存器和与本地和全局存储器相连接的数据总线。这些扩展的处理器能够保持相同的高计算吞吐量,并和典型的RTL设计一样支持相同的数据接口。
然而,可配置处理器对数据通路的控制和RTL设计方法相比是截然不同的。对处理器数据通路而言,一个周期一个周期的控制机制体现在处理器的固件执行方式,但对硬线状态转换而言是不固定的,如图2所示。程序的控制流判决发生在分支指令;访问存储器以加载和存储操作方式实现;计算则是通用处理器和专用处理器计算操作的时序实现。
从RTL硬线状态机转移到采用固件进行控制的可配置处理器有许多重要的含义:
l 灵活性:芯片开发人员和系统架构师可以只根据固件就可以修改一个模块的功能,即使在产品交付后也可以这么做。
l 基于软件的开发:芯片开发人员能够以相对较快的速度和较低成本的软件工具就可以实现大多数芯片的特性。
l 更快、更完整的系统建模:对于一个一千万门的芯片设计,即使采用最快的基于软件的逻辑仿真器,其仿真速度也不会超过每秒几个时钟周期。相比较而言,运行在扩展处理器上的固件仿真器在执行指令集仿真时其仿真速度则可达到每秒上百万条指令。
l 控制和数据一体化:没有一个现代系统会仅仅包含硬线逻辑。总是要有软件在处理器上运行。将基于RTL功能的模块移到处理器内将剔除在控制处理和数据处理之间的人为隔阂。
l 市场化时间:将系统中关键的功能模块从RTL移到可配置处理器简化了SOC的设计时间、加速了系统建模、加快了完成整个芯片硬件的速度。基于固件的状态机可以很容易地进行修改,因为该设计方式对硬件的实现细节不是一成不变的。
l 设计效率:尤其重要的是,将基于RTL的设计转移到专用处理器,这种方式极大地提高了工程师团队的设计效率。因为这种设计方式与RTL开发方式相比既节省了人力又节省了系统验证的时间。
基于处理器的设计方法通过改变软件而不是改变硬件所带来的好处一点也不夸张。可配置处理器减少了状态机设计的风险,不再采用那种难于设计、难于验证的状态机逻辑模块设计方法,而是采用预先定义好的、验证好的的处理器核和应用程序固件。
第一个可配置处理器诞生于二十世纪九十年代中期,它有一个缺点:一旦指令添加到处理器后没有一种自动化的方法来确保软件开发工具能够使用那些指令。因此,那些选择使用可配置处理器的用户就不得不用手工方法来修改软件开发工具。
早在一九九九年,Tensilica公司引入了它的第一个Xtensa处理器,该处理器有一个重要的发明,即自动化产生芯片硬件和软件。芯片设计人员可以通过基于因特网的浏览器来说明芯片的配置选项。一些新加的、由设计人员定义的指令就自动地通过Xtensa处理器产生器集成到系统中,产生了一个经过验证的硬件实现以及经过裁减的处理器芯片版本,包括了所有可能的软件开发工具。这些软件开发工具包括编译器、调试器、指令集仿真器以及更多的软件工具。软件工具能够正确地和配置选项相匹配,并且不需要额外的工作来匹配软件工具和处理器。
Tensilica公司的Xtensa处理器及其能够自动化产生硬件和软件的技术在业界引起了强烈反响。超过75多家公司正在利用Tensilica公司的Xtensa处理器设计片上系统SOC。他们其中的许多家公司还使用了多个Xtensa处理器,有些设计采用了一个处理器的多个拷贝来执行相同的任务,而其它设计则利用Xtensa处理器的不同裁减版本来执行芯片上的多种不同任务。
在软件开发时采用可配置处理器
现在让我们来看一下当前用于开发嵌入式应用的软件开发过程。图3表示一个典型的嵌入式应用软件的开发流程。设计工作不是从处理器开始,而是从算法开始。应用程序开发人员一般从高级设计工具和诸如C或者C++这样的高级语言开始,他们可能需要购买采用这些高级语言已经开发好的算法。高级编程语言和其它类型的开发包允许开发人员建立、测试和验证基本的算法思想、较小的独立算法和子算法,采用一些工具来处理这些与处理器体系结构无关的算法。
下一步,开发人员将这些用C语言写的主要算法和子算法转换成一种方便的、与处理器独立的应用程序代码。然后在PC或者工作站上运行基于C的仿真,以证明经过重新编写的代码算法能够按照理想的要求运行。在将子算法和其它应用软件模块集成到一起后,整个程序(现在采用C或者C++编写)可以重新编译,作为目标处理器,得到的应用程序代码经过测试和检查。
如果开发团队非常幸运的话,经过编译的算法代码可以按照理想速度执行。然而,为了满足工程性能指标,一旦选定某个固定ISA(指令集体系结构)处理器之后,应用程序团队通常必须将代码中的关键部分转换成 人工可调的汇编代码。软件开发团队一般必须将汇编代码手工映象到处理器。否则,对于指定的嵌入式应用而言,所选定的处理器可能成本太高、速度太快或者功耗太大。汇编代码开发人员必须仔细将代码中的变量与系统中现有的寄存器进行吻合比较,因为对于一个固定指令集体系结构而言,如果现有的寄存器证明不够的话,那么是没有办法为处理器增添更多的寄存器的。
文章评论(0条评论)
登录后参与讨论