【学术论文】Stratus HLS工具在高性能双精度浮点乘法设计中的应用流程
摘要: 双精度浮点乘法部件是高性能CPU的核心运算部件之一。描述了使用Cadence Stratus HLS工具设计和实现双精度浮点乘法部件,探索新设计方法学在关键路径延时调整、数据路径优化以及低功耗优化等问题的解决方法,并探讨如何将新的设计流程结合到原有项目开发中等问题。最终,高阶综合设计的RTL,在28 nm工艺下综合实现频率为2.5 GHz、面积为28 211 μm2,基本满足高性能微处理器的开发要求,增强了在项目中更加广泛地使用新设计方法学的信心。
0 引言
数字多媒体的广泛应用、互联网的高速发展、人工智能等新兴领域的蓬勃兴起,对通用处理器的计算能力要求越来越高。采用更加复杂的算法设计、探索效率更高的架构有助于提升通用处理器的性能。然而在传统的寄存器传输级(Register Transfer level,RTL)设计流程中,设计人员完成运算功能设计时需消耗大量时间在状态机设计、流水栈划分和调整、端口协议、存储设计等复杂、难以验证和优化的部分。而且由于RTL抽象层次较低,需要大量的时间和资源验证RTL的功能,最后导致较长的设计周期。Stratus高阶综合工具(High-level Synthesis,HLS)基于高阶综合设计方法学,将设计层次抽象到算法级,将设计的低值且复杂的领域交给工具自动完成,设计人员能够将更多的时间应用在算法设计、优化、架构探索等高价值领域,提高设计效率,专注产品质量的提升。本文基于Cadence公司的高阶综合工具Stratus设计和实现高频低功耗的双精度浮点乘法模块,并在此过程中探讨高阶综合完成产品前端设计、验证、优化、性能评估的方法和流程。
1 HLS应用流程
Stratus HLS将设计抽象到算法级,对算法做硬件微架构实现的构想后,使用高级语言SystemC/C/C++描述设计,并在高级语言层对设计做充分的非时序功能验证,如图1中设计阶段1所示。在设计阶段2,首先需根据设计目标设置高阶综合的约束文件及工艺库。然后将设计阶段1完成的SystemC代码和约束文件灌入Stratus HLS工具,由工具完成状态机、寄存器插入、流水线级数设置等控制电路,生成符合时序、面积、性能要求的RTL代码。最后对RTL代码做PPA检查,选择使用逻辑综合工具再一次对HLS生成的RTL代码做性能评估,如果符合要求,则开始做RTL的完整功能验证。如果PPA检查不能达到目标要求,则需要对关键路径进行分析、优化,此时可以充分利用HLS工具自带的优化功能加速优化设计迭代的完成过程。功能验证正确后,则可以进入设计阶段3,逻辑综合后,设计交由后端做逻辑实现。
2 Fmul64 SystemC设计
双精度浮点乘法运算部件是通用CPU内最基本运算部件之一,其应用要求高阶综合获得RTL设计满足2.5 GHz的高频率,三站流水,并且其面积和功耗较小。此部分将介绍Fmul64的主要结构和SystemC设计方法。
2.1 Fmul64_hls总体结构
Fmul64的SC设计总体框图如图2所示,sc_main()是SystemC设计的top文件,连接测试环境Testbench和待测设计DUT。DUT即Fmul64,用SystemC语言中的SC_MODULE类实现,作为此次设计的顶层模块,同时在此模块内定义模块的端口、时钟信号、复位信号、输入端口、输出端口等,作为设计的头文件,并包含在其他文件内使用。SystemC语言提供两个方法用于设计功能的描述:SC_METHOD和SC_CTHREAD。其中SC_METHOD用于组合逻辑电路实现,内部不能包括wait()语句,而要实现的Fmul64是流水线设计,所以使用SC_CTHREAD用于乘法运算功能的实现,函数命名为run。
2.2 SC_CTHREAD方法实现
SC_CTHREAD进程实现如图3所示,首先设置需要复位的信号和复位值,然后是定义无限循环语句,并在内部调用输入输出信号的读写函数和含3阶波兹编码的乘法运算函数do_booth3_multply。这里用HLS命令HLS_PIPELINE_LOOP设置设计类型,即吞吐率参数PIPELINE_Ⅱ设为1,即将Fmul64_hls设置为流水线型设计,并用HLS_CONSTRAINT_LATENCY设定流水线拍数LATENCY为3。Stratus HLS允许将吞吐率和延迟使用宏定义的形式,便于架构探索时更改参数。
2.3 Fmul64行为级实现
双精度浮点乘法运算过程如图4所示。首先对输入乘法操作数做数据的预处理,然后做尾数相乘的乘法运算,在这里,本文做了架构探索,一种架构是使用3阶波兹编码算法实现双精度浮点尾数乘法运算;另一种是使用乘号“*”直接完成浮点尾数相乘运算,让工具来完成乘法运算的具体实现。两种架构的验证环境、优化流程是相同的,所以后续设计将以Fmul64波兹编码设计为例进行介绍,最后会介绍两者逻辑综合结果。设计中使用到的高阶综合指导语句(主要是HLS_DPOPT_REGION)如图5所示。
至此,SC代码设计已完成,并且按照设计目标的要求使用高阶综合指导语句设置了流水线和时序要求,可以开始后续的验证和高阶综合处理。虽然设计是使用高级语言SystemC描述,但是其微架构仍然是符合硬件设计和实现规则的,所以需要注意保持良好的SystemC代码风格非常重要。
3 功能验证
Stratus HLS工具提供统一的验证平台,所以在SC级的测试用例可以同样用于RTL代码的验证。但是,SC设计是不包含时序信息的,所以包含时序的RTL验证也是必需的,除了在Stratus内回归测试SC代码的用例,还将使用已有的UVM平台,对RTL和SC设计同时验证,一方面验证RTL的功能并收集RTL覆盖率,另一方面一定程度上验证SC设计和RTL代码的一致性。所以HLS设计的验证分为2个方面:
(1)基于Stratus HLS的验证
①SC行为级模型验证(SystemC behavioral model)
②综合的SC RTL模型验证(Synthesized SystemC RTL model)
(2)基于UVM的SystemC&RTL的验证
Verilog RTL实现验证(Verilog RTL implementation)
3.1 基于Stratus HLS的验证
基于Stratus HLS环境,本文使用SystemC建立设计的Testbench环境,其结构框图如图6所示。时钟和复位信号的定义是在主函数内,并连接到测试模块和待测设计模块。Testbench中共实现两个进程,Stimuli和Monitor。Stimuli进程里调用SystemC语言提供的随机数据生成函数,生成测试的随机数据。Monitor进程实现简单的双精度乘法运算模型,用于待测设计的参考模型,并在此处监测DUT的结果输出,获得DUT结果并与参考模型结果做比对,判断结果的正确性。Stratus HLS工具内可以自动实现对SC设计和RTL设计使用同一个Testbench验证,只要在project.tcl中定义不同的define_sim_config时,指定为RTL_C是对SC设计验证或者指定RTL_V是测试高阶综合生成的RTL模型。
3.2 基于UVM的SystemC&RTL验证
UVM验证环境是既有的乘法运算验证环境,如图7所示,可以对Fmul64_hls设计做完整的功能验证、覆盖率收集、断言监测,同时将SC设计也放到了验证环境里,但是需要对其外包一个壳,可以由Stratus工具自动生成。此部分功能验证即如图1 Stratus HLS设计流程的设计阶段2中的功能验证2,因为高阶综合生成RTL代码的可读性较差,所以如果测试用例结果不一致,尤其SC设计的结果也报错的话,则需要将测试用例转到Stratus HLS环境下进行调试。
4 性能评估
4.1 优化设计
Stratus HLS在将SC设计转化为RTL代码时,由于评估的谨慎性,会给出更加悲观的结果,因此本文选择使用逻辑综合工具评估HLS设计的PPA检查,逻辑综合约束参考设计实际实现要求,所以比HLS工具中的逻辑综合约束设置得更加细致,最后根据逻辑综合结果来决定是否做设计优化的迭代。
在时序较为紧张的时候,Stratus通常需要很长的时间来做高阶综合优化和调度,这就使设计优化迭代的时间非常长,是违背使用高阶综合工具提高设计效率初衷的。但是Stratus提供多种有效的数据路径优化方法,可以有效地改善路径延迟,提高高阶综合效率。比如在设计优化迭代过程中添加DPOPT,如图5 SC实现Fmul64过程中的主要HLS指导语句所示。DPOPT会调用内部集成的逻辑综合工具优化这部分设计,而且DPOPT通常会使Stratus综合一版RTL用时大为缩短,从而大幅提高优化设计的效率。
4.2 低功耗优化
Stratus工具自带低功耗优化选项,可以自动完成寄存器门控时钟的插入、时钟树优化、状态机优化等。本文的设计是运算功能模块,要求在没有此模块运算指令的情况下,模块完全关闭,动态功耗为零;有乘法运算指令的情况下,动态功耗和静态功耗能够尽可能小。Fmul4_booth3的初次功耗评估结果如表1所示。
通过上述数据,可以了解到Fmul64_HLS设计在无乘法运算时,满足动态功耗为零的要求,但是在有乘法运算指令时的功耗却比较大,不满足功耗要求,需要对功耗做进一步的优化。分析设计发现DPOPT功耗和资源共享都会引起功耗的增加,所以在project增加以下选项优化功耗:
(1)set_attr dpopt_with_enable on
(2)set_attr sharing_effort_parts low
dpopt_with_enable对RTL架构的影响如图8所示。
显然dpopt_with_enable=on的RTL架构是对静态功耗的优化大有帮助的。
sharing_effort_parts =low 会停止演算器的共享。经分析,这个选项可以减少不必要的演算器的共享从而可优化动态功耗以及时序。优化之后的Fmul64_booth3功耗如表2所示。
可以看到通过设置优化选项,静态功耗和动态功耗均有所优化,其中静态功耗约优化了5%,动态功耗优化了约39%。寄存器门控比率达到100%,完全由工具完成寄存器门控时钟的插入和低功耗优化,提高设计效率。
4.3 逻辑综合结果
高阶综合设计的RTL功能验证正确后,则设计可以做逻辑综合。对两种Fmul64架构分别作了逻辑综合,在28 nm工艺下,逻辑综合结果如表3所示。
Stratus HLS给出的面积评估结果与逻辑综合工具的结果有所不同,经分析,Stratus HLS综合约束并不严格,所以面积、延迟的评估数据存在误差。而对比两种架构综合结果,可以看到Fmul64用乘号代替波兹编码算法的设计面积上更优化,而时序结果相对较差,但是,其在设计时间的节省是非常显著的。
5 结论
Stratus HLS工具改变了设计的抽象层次,所以其在工程中的应用流程与传统RTL设计是有区别的,验证环境、调试流程、验证收敛的依据、逻辑综合优化的时间等问题的解决提前到了算法级,而且可以将微架构的探索加入到设计流程,不变的是设计人员仍然需要从硬件的角度考虑SC代码的微架构设计。Stratus HLS工具强大的状态机自动化设计、资源自动调度和共享、低功耗优化等功能,使设计人员能够将更多的时间用于架构探索或者算法优化,极大的缩短设计周期,拓展设计人员可控制设计规模上限,满足工程项目的时间进度要求,也增强了我们在工程项目中推广使用高阶综合工具的信心和决心。
作者信息:
苑佳红
(天津飞腾信息技术有限公司,湖南 长沙410000)