Sébastien Fuhrmann,理学硕士
研发工程师
巴黎CNRS-ENSEA-UCP ETIS实验室(现就职于Elsys Design) se.fuhrmann@gmail.com
Bertrand Granado,博士
教授
巴黎CNRS-ENSEA-UCP ETIS实验室和UPMC LIP6 实验室 bertrand.granado@lip6.fr
采用自动方法为两种图像处理IP核实现类似于手工RTL编码的效果
FPGA被广泛用作信号处理应用中的原型设计或SoC实现工具。它们具备大规模并行处理功能、丰富的片上存储器异构模块以及DSP构建块,是一款高 效的实现方案,往往能够比肩标准的微处理器、DSP和GPU。而集成ARM® 硬处理器和可编程逻辑的赛灵思28nm Zynq®-7000 All Programmable SoC的问世,则使赛灵思器件对嵌入式系统来说更富吸引力。
尽管FPGA具有优异的特性,极富吸引力,但一些设计人员出于对编程复杂性(编程工作晦涩难懂而且涉及VHDL和Verilog等硬件描述语言)的 顾虑仍然避免使用该器件。而实用的电子系统级(ESL)设计的问世则有望确保简化设计任务并使更多设计工程师掌握FPGA编程技术。
ESL工具在业内由来已久,其可将设计抽象提高到主流寄存器传输级(RTL)之上的水平。[1]在经过无数次失败之后,这些高层次的设计工具最终在 实际应用中得到了广泛采用。赛灵思已经在其最新设计工具Vivado® 设计套件中采用ESL方法来解决FPGA的可编程性问题。Vivado HLS是一种内置ESL的高层次综合工具,能够自动将C、C++或SystemC转换为HDL语言设计。
Vivado HLS与Zynq SoC的推出激发了我们团队在工业学术合作项目IP图像处理解决方案研发过程中对ESL方法和手工编码进行对比分析的想法。我们希望我们的工作能够为其他 有兴趣的设计团队提供公正独立的案例研究结果,因为这些工具仍然比较新,而且有关一般用户使用体验的参考文献也不是很多。BDTI实验 [2, 3]从总体上很好地反映了在更高层面将ESL工具用于FPGA的性能和潜力。但为了能通过ESL工具来实现,BDTI团队以最佳方式对源应用 (source application)程序进行了重写。
相比之下,我们则采用针对PC编写的最初算法的源代码。
在将IP的手工编码模块(之前曾在赛灵思竞争对手的40nm中端产品上验证过)与Zynq SoC上的ESL编程方法进行对比时我们发现,ESL结果在多个方面都可以媲美手动实现方案,唯有时延明显例外。此外,ESL方案还能显著缩短开发时间。
我们的关键目标是:
• 在不修改或者尽可能少改动的情况下,评估现有(C/C++)代码向硬件移植的工作量/质量;
• 进行具体的设计空间探索(ESL与手工编码IP);
• 研究生产力权衡因素(效率与设计时间);
• 检查可移植性问题(移植到其它FPGA或ASIC上);
• 衡量ESL工具对硬件、软件和系统设计人员的易用性。
基于VIVADO的方法
我们采用赛灵思Vivado HLS 2012.4 (ISE® 14.4)设计工具和基于Zynq SoC的ZedBoard(XC7z20clg484-1)对所提出的实验进行原型设计。我们从针对扫描应用的现行图像处理FPGA-SoC合作项目中的 10个IP核中选出两个。所选IP均为项目中最复杂的IP核。这些IP采用Verilog优化设计并在赛灵思竞争对手的40nm产品上进行过验证,可针对 业界合作伙伴Sagemcom公司的扫描产品执行特定的图像处理功能。
图1概括说明了使用赛灵思工具的实验流程。为达到实验目的,我们从算法最初的C源代码开始。值得注意的是,该代码通过传统方式针对PC进行编写,而且就嵌入式系统高效移植而言并非最佳代码。
我们的目标是,理想情况下对代码进行最少修改甚至不修改。尽管Vivado HLS可支持ANSI C/C++,我们仍需针对动态存储器分配和复杂结构体指针等问题做一些基本调整。根据赛灵思技术文档的建议,我们在没有触及核心编码的情况下完成了这一任 务。我们在函数自变量上创建AXI4主/从(AXI-Lite)接口,并利用各种约束条件在Vivado HLS中处理代码。我们使用指令来指定这些约束条件,以便创建不同的解决方案,并利用ZedBoard在Zynq Z20 SoC上对其进行验证。
为便于比较,我们必须设定涉及时延的唯一约束条件。我们必须假定:在相同的频率下,Zynq SoC的AXI4接口与手工编码设计中竞争对手FPGA总线的时延具有可比较性。将RTL代码(IP核)移植到赛灵思环境非常简单直观,但对接口进行重新 设计则超出了我们的工作范围。
在开发板上进行原型设计之前,我们利用Vivado HLS工具的内置SystemC协同仿真功能来验证生成的硬件。事实上Vivado HLS也为IP生成软件驱动器(访问函数),这会进一步加快IP验证与调试的速度。
我们使用Zynq器件中ARM Cortex™-A9 MPCore的666.7 MHz Core 0以及一个533.3 MHz
的DDR3接口,并通过AXI4定时器进行时延测量。图2给出了FPGA原型设计所采用的验证流程。首先在ARM上利用初始的C源代码对图像进行处理,以
获得“黄金”参考结果。然后利用IP处理相同的图像,将它们进行比较并验证结果。
作为独立项目,我们还评估了100-MHz MicroBlaze™处理器的两个IP模块的时延测量值。该处理器带有8+8KB I+D高速缓存,以及通过AXI4总线与DDR3直接相连的硬件乘法器和除法器单元。我们将MicroBlaze上两个IP核的时延测量值作为参考值,用 以比较由Vivado HLS生成IP和ARM处理器所实现的加速效果。这种加速性能为FPGA设计人员带来了可观的软件计算能力。
实验结果
现在我们来具体看一下两个IP核的设计空间探索问题,并利用HLS工具将它们标记为IP1和IP2。我们已经详细概述了IP1 的实验,但为了简便起见,对于IP2,我们只给出其结果。最后,我们还将针对赛灵思专家就赛灵思ESL工具中AXI4 “Burst”实现效率问题所给出的反馈意见进行讨论。
表1和表2按步骤(表示为S1、S2等)列出了IP1设计空间探索的细节。在实验中,我们采用了256 x
256像素的灰度测试图。需要注意的是时钟周期、时延和功耗数据仅为在对多次实现结果交叉分析进行快速综合后,通过工具给出的参考值。正如您在FPGA原
型设计结果(表2)的讨论中所看到的,最终实现后,实际值会发生显著变化。
表2 – 针对IP1探索的FPGA原型设计结果
*参考值,请参阅方法章节
**从XPower分析器得到的动态功耗
S1:源代码转换
在第一步中,我们首先编译没有最优约束条件的代码(除了前面所述的必须修改项)。从表1中可以看到,硬件占用了大量资源。当我们根据Vivado HLS快速综合报告和GUI设计查看器工具分析资源分配详情时,可以很清楚地看出算法中的几个除法运算占用了绝大部分资源。与乘法器不同,在FPGA中没 有用于除法的硬模块,因此除法运算会占用大量逻辑。因此,我们首先要解决的就是优化这个问题。
S2:S1结合共享除法器
直观地说,对于如何减少除法硬件资源消耗问题,我们首先想到的是采用资源共享的方式来解决,但这同时也会降低性能。不幸的是,在我们所使用的工具版 本中很难甚至是不太可能直接将定制约束条件应用于运算符。不过解决方法也很简单,我们可以用函数来替代除法运算(/),这样就可将约束条件应用于函数。在 默认情况下,此工具可将函数作为内联函数来使用,可为每个除法运算生成完整的除法硬件。我们在除法函数上应用“Allocation”指令,运用不同的值 来进行实验,并监控其对时延的影响。最后我们选择了一个共享除法硬件。正如您在表1中所看到的,这种方式显著减少了查找表(LUT)、触发器(FF)和其 它逻辑资源的使用量,而且对时延的影响也可以忽略不计,完全达到了双赢效果。
S3:S2结合除数到乘法的转换
接下来我们选择将除法运算转换为乘法。这种转换是可行的,因为该应用使用的是常数值除法。我们这样做的目的有两方面:首先,尽管已决定采用一个共享 除法器来完成所有的除法运算,但除法硬件依然比较昂贵(约2000个LUT和触发器);其次,这种共享除法器完成除法运算的速度相当缓慢,需要34个周 期,而且我们所使用的赛灵思工具仅支持HLS库中的一种除法器类型。但在接下来的步骤中,我们可以看到实现乘法则有多种选择。
因此,在本步骤中,我们将除法运算转换为乘法运算(我们通过使用C语言的#ifdef指令来保持代码的可移植性)。通过AXI-Lite从寄存器将 近似值作为函数参数提供。这就是在此步骤中表1能够显示性能和资源使用量得到显著改善的原因,但乘法运算量的加大必须采用更多DSP。
S4:S3结合缓冲存储器分区
源算法采用统一布置在存储器分配(malloc)模块中的多个内存缓冲器(8位、16位和32位)。在准备好算法Vivado HLS这一转换初始阶段(图1)中 ,存储器模块会转变为内部片上存储器(Block RAM)。
尽管对于共享外部存储器来说采用统一的存储器分配模块是一种比较普遍的选择,但是当使用内部片上存储器时,更好的做法则是利用存储器分区来实现更快 的吞吐量。因此在这个步骤中,我们将比较大的存储器模块分成若干独立的小存储器(8位、16位和32位)。表1显示的结果突出了明显的性能改善效果,而且 分区也只是少量增加了BRAM数量(表2)。此外,这种技术还大幅减少了逻辑资源占用,原因可能是用于存储器访问的控制逻辑得到了简化。
S5:S4结合共享32/64位带符号或无符号乘法器
在这个步骤中,我们受S2中共享除法器实验的启发,使用共享资源对DSP模块进行了优化。首先,我们使用设计查看器实用工具详细分析生成的硬件,并 将其与C源代码进行相互参考。分析结果显示在原始模式下硬件正在使用的26个不同种类的乘法器单元,可被分为无符号16/32/64位乘法和32位带符号 乘法。与S2实验一样,我们构建了一个由32位带符号、32位无符号和64位无符号乘法器(用函数替代“*”运算)组成的系统。然后,我们应用了一个分配 约束条件,即只用一个单元来完成这三种截然不同的运算。表1显示尽管性能有些损失,但是DSP的使用量显著减少。这一结果激发我们进一步研究智能共享方 案。
S6:S5结合智能乘法共享
为减少由乘法器共享带来的性能损失,需要以更加巧妙的方式对其加以利用。我们创建了两个附加乘法器类型,即16位无符号乘法器和具有64位返回值的 32位无符号乘法器。我们以相互独立的方式使用这些乘法器并改变它们的数量,经过多次实验后得出的最终解决方案包含两个无符号64位乘法器、两个无符号 32位乘法器、一个带符号32位乘法器、一个无符号16位乘法器以及一个独立的带64位返回值的无符号32位乘法器。这种技术可使性能得到小幅改善(如表 1所示),但是也会小幅增加DSP的使用量。
S7:S6结合乘法器时延实验(组合乘法器)
在乘法器优化的最后阶段,我们完成了两次用以改变乘法器时延值的实验。默认情况下,Vivado HLS所使用的乘法器的延迟时间介于2至5个时钟周期之间。硬IP核中的乘法器要么是单时钟周期要么是组合乘法器。在这个步骤中,我们使用“资源”指令并 从库中选择相应的组合乘法器,将乘法器的时延设定为0。结果如表1中所示,延迟时间得到了改善。然而,从时序的角度来看设计明显变差了许多,因此FPGA 设计的时钟速度减慢可能会将性能提高变为降低性能。
S8:S6结合乘法器时延实验(1时钟周期乘法器)
在这个步骤中,我们不使用组合乘法器,而是从库中选择一个单时钟周期乘法器。结果如表1所示。我们可以看到时延略有增加,但出人意料的是时钟周期显著增大,从而导致硬件变慢。
S9、S10、S11:Burst访问实验
到目前为止,所有探索步骤对C代码功能方面的知识要求很少或者根本不要求。在最后的实验中,我们探索了Burst访问。对基于共享存储器系统的IP 来说Burst访问几乎是必不可少的,因为用于小块数据或随机数据访问的总线具有较高的时延。为此,我们分析了C代码的算法结构,以便探究实现Burst 访问的可能性,因为从一般的软件角度来说根本就没有Burst访问这一概念。但是值得格外关注的是,即便是在Burst访问实验中,我们也从未改变过软件 的代码结构。
Burst访问实验分两个步骤执行。首先我们使用转储方法(尽管并不实用,但不失为获得技术信息的良好途径),此时整个图像被快速送到内部存储器缓 冲器中,并在实施最后快速输出完整结果。通过使用较小的图像并确保FPGA中有充足的片上存储器,就可以很轻松做到这点。我们将此迭代步骤称为 “superburst”(S9)。
在第二阶段,我们在确保不改变源代码结构的限制条件下实现了智能的交互式Burst(S10,S11)。结果如表1中所示。我们根据赛灵思提供的实 例教程,利用标准的“memcpy”函数在C语言中实现了Burst功能。遗憾的是,当在代码中插入memcpy 函数时无法看到时延值。但FPGA的实现结果 (表 2)可以说明实验所获得的性能。
所选步骤的FPGA原型设计
使用ESL工具的最大优势之一是能够实现快速的设计空间探索。我们可在几分钟之内评估以上列出的所有探索步骤和表1所示结果,从而避免针对少数最终 所选迭代执行冗长的FPGA实现阶段。表2给出了表1中部分所选步骤在Zynq Z20 SoC上的最终实现结果;同时也给出了在MicroBlaze处理器上(作为参考)和ARM Cortex-A9上实现初始源代码所获得的等效结果(时延), 以体现出Zynq SoC带给FPGA设计人员的强大计算能力。该表还给出了由赛灵思XPower分析器计算得出的动态功耗估计值。
我们利用赛灵思工具将最优手工编码IP转化为RTL,从而获得手工编码IP在Zynq SoC上的实现结果。我们不得不使用之前实验得到的时延测量结果并将竞争对手的FPGA作为参考,因为向AXI4总线进行移植超出了我们的实验范围。这进 一步凸显了HLS工具的潜力,即可帮助设计人员更加轻松地向多种协议移植。
如果我们将表2与表1中的结果进行比较,会发现几个有意思的现象。首先,ESL的快速综合会得出比实际情况(尤其是对于LUT和触发器)更好的估计结果;对存储器和DSP而言,综合器有时可显著改变资源数量以进行优化。
其次,时序收敛会成为最后实现阶段的大问题。我们可以看到FPGA实现后获得的频率与HLS估计结果相比发生了显著变化。最后,令人惊讶的是,即便 对于Burst访问实验, HLS预计值与手工编码IP得到的时延值也存在明显差别。这也使我们对HLS工具生成的DMA的质量更加感兴趣。
新的IP,相似的结果
我们以类似方式来研究第二个IP(即IP2)。根据之前对IP1的深入讨论,表3和表4中所列结果也就不言自明。值得注意的一点是表3中的步骤8。
与IP1的情况一样(详见S2和S3讨论内容),无论从资源使用还是时延的角度来说,除法器都是高消耗器件。与IP1不同的是,IP2使用实数除法运算,
因此除法器不能移除。但遗憾的是,当前版本的ESL工具只有一种除法器,其延迟时间为34个时钟周期。S8表明,如果使用时延为一个时钟周期的除法器(就
像手工编码IP中提供的除法器),理论上其可实现30%的性能提升。表4显示了所选步骤的FPGA原型设计结果。
VIVADO HLS的DMA/BURST效率问题
通过比较手工编码IP和ESL技术得到的结果可得出一些结论。尽管研究嵌入式系统所用的初始源代码(几乎不做修改)并非以最佳方式编写,但ESL工 具所提供的结果仍可以在资源利用率方面与经过优化的手工编码IP相媲美。ESL与手工编码IP在实验结果上的显著区别在于时延,后者得到的时延性能要远远 优于前者。
针对这一问题,我们观察到手工编码IP与ESL IP在构建方式上存在较大差异,(这也是IP2的资源消耗量存在较大差异的原因)。由于源代码类型不同,在ESL IP中只有一条用于输入和输出的数据总线,相比之下,在手工编码IP中则有两条。此外,手工编码IP中的FIFO更适合处理Burst访问。而ESL IP则由于其源代码的固有特性,很难建立一个理想高效的Burst处理机制,因而只能通过缓冲器来实现Burst。由于ESL硬件需要根据代码结构将这些 存储器作为任务缓冲器和Burst缓冲器,因此ESL方案会影响BRAM的使用。此外,Burst是根据赛灵思AXI4主接口教程,通过C语言的 memcpy函数来完成的。
我们还与赛灵思专家交换了意见,他们建议使用外部DMA来实现最佳性能。因为就我们所使用的Vivado HLS版本而言,其生成的AXI4主接口尚处于测试阶段,但会在未来得到升级。这些因素可能会导致时延值的显著差异,同时也是未来实验研究的良好出发点。
生产力与效率
这次的具体实验工作揭示出ESL设计的几个重要方面,同时也清除了一些误区。ESL工具自推出以来已取得了长足进步,现可支持ANSI C/C++,并能给出具有竞争力结果,还可依照硬件/系统设计实践方法,采用约束指令的形式开发出多种设计方案(不仅限于过去的循环开发)。
事实上,我们发现用ESL获得的所有结果(延迟时间除外)都可达到最佳值。此外,若通过工具的高级特性实现精确位类型(而非实验中使用的一般C语言类型),还能进一步优化资源使用,即类似于代码部分重写所取得的效果。
研究工作还使我们了解到生产力与效率间的权衡问题。图3给出了IP模块开发时间(包括设计、软件、FPGA实现及验证等)的对比情况。ESL设计能 快速转化为解决方案,尤其是对于验证工作,其所获得的结果不亚于最佳实现方案。值得注意的是设计与验证时间高度依赖于设计人员的技术水平。因此,手工编码 设计与ESL设计都由同一组人员完成。
图3对流程的实现效果进行了公正的比较。考虑到设计人员对IP设计与集成的传统RTL方法更加熟悉,而对ESL工具比较陌生,因此从长期来看一旦这种新工具被人们所熟悉,其开发设计所需时间很可能会显著缩短。
ESL的未来发展?
从技术和商业角度来看,应该会制定一些针对ESL工具约束结构的EDA标准,以便轻松地向其它FPGA或ASIC移植设计(这种灵活性是RTL工具 所固有的,从原则上讲,采用ESL工具应该更容易做到这一点)。ESL工具供应商应该像对待RTL工具一样,提高ESL工具的质量和效果。
这是一个复杂、需要长时间探讨的论题,我们不再在这篇短文中对以下问题做出详细解答:软件设计人员是否能利用ESL工具对FPGA进行编程?ESL 是否将取代RTL设计/工作?谁是ESL工具的最大受益者?但从本次实验所获得的经验来看,我们认为ESL工具可以让所有相关人员受益,尤其是系统设计人 员。
对硬件设计人员而言,这种工具在创建或评估设计片段时非常有效,其有助于快速构建可支持总线接口的测试用基础设施。尝试设计硬件的软件设计人员也是 ESL工具的主要受众之一。尽管ESL工具为此已取得了很大进步,但仍有很长的路要走。例如在我们的项目中, ELS工具为软件设计人员将硬件复杂性降到了非常低的程度。然而,当涉及到约束和优化工作时,要实现好的设计仍需要从硬件方面进行考虑。这个问题将随着 ESL工具的进一步发展而得到逐步好转。
随着软硬件协同设计在SoC领域中不断推广采用,系统设计人员也变得越来越普遍,对于他们来说,ESL工具可能形成一种双赢局面。系统设计人员可在多个层面上探索这些工具。
在硬件方面,之所以选择赛灵思28nm 7系列FPGA中的Zynq-7000 All Programmable SoC,关键原因之一就是要探究将ARM硬核与FPGA逻辑集成在同一芯片上到底有多大潜力。正如我们在实验结果中所看到的, ARM双核为FPGA设计人员带来了前所未有的计算性能。而事实上,Zynq SoC为嵌入式设计人员带来了一款微型超级计算机,而且可利用紧密集成的FPGA架构对其进行定制。
鸣谢
我们感谢产业合作伙伴Sagemcom为我们提供的资金支持与技术协助。同时,我们还要感谢赛灵思欧洲公司的专家Kester Aernoudt和Olivier Tremois为本次项目提供及时的技术指导。
参考资料
1. G. Martin,G. Smith,“高层次综合:过去、现在及未来”,IEEE 计算机设计与测试,2009年7/8月
2. BDTI 报告,“赛灵思FPGA的高层次综合工具”,2010年
3. BDTI报告,“AutoESL AutoPilot高层次综合工具”,2010年
本视频基于Xilinx公司的Artix-7FPGA器件以及各种丰富的入门和进阶外设,提供了一些典型的工程实例,帮助读者从FPGA基础知识、逻辑设计概念
本课程为“从零开始大战FPGA”系列课程的基础篇。课程通俗易懂、逻辑性强、示例丰富,课程中尤其强调在设计过程中对“时序”和“逻辑”的把控,以及硬件描述语言与硬件电路相对应的“
课程中首先会给大家讲解在企业中一般数字电路从算法到流片这整个过程中会涉及到哪些流程,都分别使用什么工具,以及其中每个流程都分别做了
@2003-2020 中国电子顶级开发网