不断增加的复杂性和异质化正在衍生出一些新的方法,能够避免在设计周期结束时出现意外。
在一个系统中,硬件的表现是否优秀取决于运行在其上的软件。随着系统复杂性的增加,总是软件在拖后腿。
缩小硬件和软件差距的方法是不断改进软件开发的方法。在把软件部署运行在硬件上之前,确保软件升级都进行了验证和测试,并进行之前芯片制造商开发硬件时进行的同类的详细检查。
试图将软件开发过程提前并不是什么新主意。多年来,业界开发了一系列的方法解决这个问题。比如敏捷软件开发方法,它试图通过两个或更多的软件开发者同时进行同一个代码的开发来降低错误。此外还包括持续集成方法,它是从另外一个角度解决这个问题的,这个方法的本质是,将代码持续不断地加入共享的代码库或开发分支中,进行频繁的自动构建,以在早期发现和验证问题。
Mentor嵌入式部门产品管理总监Warren Kurisu说:“越来越多的开发团队正在使用持续集成方法作为简化整体开发流程的手段,并避免在开发集成阶段出现令人讨厌的意外。基于模型的设计方法通过模拟和自动代码生成进行了大量的工作,可以支持这种方法过程。”
通过持续集成,可以在构建硬件设备的同时,构建一个单纯从概念出发的数字映像。在这种方法的加持下,多个更加独立的团队可以同时开发,这时,更好地践行持续集成概念就变成了各个团队的代码“何时”准备好集成进系统的问题。
“多团队同时开发的方法是对持续集成模式的一种认可,这种方法使开发商能够更早地对设计进行验证,并允许开发人员根据数字映像模型验证其代码和测试系统配置。”Kurisu说。“举一个简单的例子吧,比如Linux进程。这种架构设计使应用程序开发人员能够在其桌面开发系统上创建应用程序,只要它们遵守Linux编程模型,这些应用程序就可以在最终阶段顺利集成,甚至可以在系统部署后加载。如果系统架构师需要更严格的分离模型,则可以使用独立的执行环境,如Linux容器或Docker容器。这种模式不仅适用于Linux,实时操作系统也和Linux进程很像,包括一个允许代码分离的进程模型。”
一旦在进程或分区中运行的代码就绪,就可以将其纳入到连续集成工作流中。虽然这似乎是一个显而易见的步骤,但它的效果很好,可以很快地将各种异构组件融合在一起。
“例如,集成了四核ARM Cortex-A53内核、Cortex-R5内核和FPGA架构,并具有可实现功能分离的多个电源层的Xilinx UltraScale + MPSoC,”Kurisu说。“可以预计的情景是多个开发团队同时为这个SoC编写代码,一个团队在应用内核上开发Linux,一个团队在实时内核上开发安全应用程序,另一个团队在FPGA架构上实现算法。在总体架构上,这些应用可以通过已定义的接口进行通信。一方面,这些独立团队自身可能会使用持续集成方法来构建在其内核上运行的代码,另一方面,当系统所有内核上的代码都就绪后,主要的集成工作就会开始。和上面一样,持续集成的问题就是进行全系统集成的代码何时准备就绪。”
基础问题
系统的复杂性一直在稳步增长,部分原因是没有人确定虚拟/增强现实、汽车、医疗、工业物联网和深度学习等各种新兴市场需要什么样的芯片或功能。在这种情况下,一种常见的方法是将多个类型的处理器和功能集成在一颗芯片上,通过软件把各个组件融合在一起,这比将所有组件放入各个分立的ASIC中更便宜。
Aldec硬件部总经理Zibi Zalewski表示:“最终配置是根据目标市场或客户要求创建的。“子系统的可扩展性使您可以快速增加系统规模和复杂性。现在,把一个系统从双核扩展到四核不算什么大问题,没有适当的工具才是真正的问题所在。此外,硬件部分不再是决定项目的主要元素,系统复杂性主要来自于软件层。所以不单单是晶体管数量问题,还包括功能要求。”
这与系统整体质量有直接的关系,最终是衡量创建该系统的各种方法的有效性。
ARM模型技术总监Bill Neifert说:“评估质量时,挑战在于它不仅仅涉及芯片的质量。它衡量的是整个系统,会衍生出区段问题。每个设计中都有你关心的东西,但对于汽车、工业和企业计算而言,关心对象又有所不同。一些涉及不同的硬件,另外一些则是相同硬件上的不同应用。如果您正在处理需要记录和证据的安全相关问题,你需要关心的就是软件过程和底层硬件。记住,你能证明到什么程度,质量就是什么水平。”
最大限度降低意外
不管选择的方法有多好,总会有一些错误发生。所以,这里的目标是尽量减少项目开发最终阶段的意外,记住,没有任何一种方法能够完全消除意外。
“当您编写应用程序时,您真的必须在真实的目标上运行一下它,因为您可能没有正确地分配内存,或者您可能只有只能在ARM上使用的二进制库,而很多人却试图在x86上测试嵌入式系统,“Imperas Software首席执行官Simon Davidmann说。“Jenkins是一个经常被提及的开源自动化服务器,代码可以在ARM、MIPS或瑞萨处理器上运行,不需要任何管理工作,在几分钟之内就可以得到一个“测试通过”的结果。你可以把Jenkins看做运行对象,你可以说,'这是我的机器。我有四台机器可以运行测试',其他人也可以共享Jenkins资源。它可以简化最简单的程序,即便你的程序只有一个只包含一个算法的文件,它也允许你构建工程并运行,当你修改了代码,它可以自动化地充分测试并记录。当然,您必须了解Jenkins的产品如何工作或模拟器的工作原理,但是只需要几千美元,您就能获得可以非常有效地进行编译、构建、测试和验证的系统。”
Synopsys的MetaWare产品经理Allen Watson说:“我们生产的软件是允许人们开发软件的工具。我们的客户使用我们的工具编写嵌入式软件,但同时我们的工具本身也是软件。虽然有一些差异,但归根结底我们和客户们都在编写软件,这是一个非常复杂的软件。我们自己也在小组内采用持续集成方法,没有其它方法能够替代这种开发方式。我们有多个开发人员编写同一个产品的软件,但他们承担不同的任务。通常,他们先写自己的代码,在本地进行一些单元测试,准备好后,就把代码并到软件的主线开发分支上。
但是,并不是每个人都认可这个概念。Uniquify营销副总裁Graham Bell认为,重点应该是反复性而不是持续集成。
“持续意味着不间断地继续下去,而反复意味着活动之间可以暂停,”他说。“当然,嵌入式软件的集成工作会反复经历一系列的集成-测试 - 修改活动,直到特征漂移结束或者bug数量达到了设计签收级别。这就是这个过程中暂停的地方。随着设计从硅虚拟原型转移到硬件原型,最终再转移到消费者手中的产品,这种集成循环会一再发生。有些人可能会认为,集成工作的这些阶段现在是重叠的,因为各个设计团队需要尽早获得有关工作设计的知识,以加速自己工作的设计签收。如果是这种情况,那么也许我们可以说,这些同步进行的工作正在导致嵌入式软件的持续整合。”
这不仅仅是定义上的分歧,它影响着基础方法论。和支持反复整合的企业相比,支持持续整合的企业数量增长更多。
Austemper设计系统公司首席执行官Sanjay Pillay认为,持续集成是实现最佳上市时间的唯一途径。“目前复杂的SoC及其开发时间表无法通过使用硬件-固件-软件的串行开发方法来实现。工程团队现在必须包括硬件开发人员和嵌入式软件设计人员,而且软件设计人员的数量往往超过硬件设计人员。他们一起开始这个项目,并在整个项目周期中并肩协作。”
但是,随着设计中异构组件的数量不断增多,持续集成也只是简化开发流程的其中一个选择。
Mentor的Kurisu说:“人们可以争辩说,今天最先进的软件和硬件不再需要持续集成方法。但是我认为,基于模型的设计实际上激发了持续集成方法的活力,并放大了这种方法的作用。”