《关于赛灵思高层次综合工具加速FPGA设计的介绍和分享.docx》由会员分享,可在线阅读,更多相关《关于赛灵思高层次综合工具加速FPGA设计的介绍和分享.docx(14页珍藏版)》请在第一文库网上搜索。
1、关于赛灵思高层次综合工具加速FPGA设计的介绍和分享VivadoH1S配合C语言等高级语言能帮助您在FPGA上快速实现算法。高层次综合(H1S)是指自动综合最初用C、Cti或SyStemC语言描述的数字设计。工程师之所以对高层次综合如此感兴趣,不仅是因为它能让工程师在较高的抽象层面上工作,而且还因为它能方便地生成多种设计解决方案。利用H1S,您能探索各种可能性,分析面积和性能特点,最终确定一个方案在FPGA苣出上实现算法。举例来说,您能探索将存储器映射到B1OCkRAM(BRAM)或分布式RAM上有什么不同的影响,或者分析回路展开以及其它回路相关优化有什么效果,而且不必手动生成不同的寄谴传输级
2、(RT1)设计。您所要做的仅仅是在CC+SystemC设计中设置相关指令而已。赛灵思在其最新发布的ViVaCk)TM工具套件中推出了H1S工具。VivadoH1S是AutoES1工具的品牌转型重塑,可提供众多技术帮助您优化CC+SystemC代码以实现目标性能。这样的H1S工具就能帮助您在FPGA上快速实现算法,无需借助基于VeriIog和VHD1等硬件描述语言的非常耗时的RT1设计方法。为了帮助用户了解ViVadoH1S如何工作,我们不妨以矩阵乘法设计为例逐步剖析从设计描述(C/C+/SyStemC)到FPGA实现整个端对端综合流程。矩阵乘法在许多应用中都很常见,并广泛用于图像和视频处理、科
3、学计算和数字通信。本项目中的所有结果均使用ViVadoH1S2012.4生成,搭配使用赛灵思ISE软件(14.4版)进行物理综合和布局布线。此外,这一流程还采用了Mode1Sim和GCC4.2.1-mingw32vc9进行RT1协同仿真。图1显示了简单的综合流程,从C/C+/SyS拄mC设计开始。CC+SystemCtestbench用于验证设计功能的正确性,同时还可用于RT1和C的协同仿真。协同仿真包括验证生成的RT1设计(.v或.vhd)功能,这要使用CC+SystemC测试平台而不是RT1测试平台或者采用e或Vera验证语言编写的测试平台。电钟周期约束设置了设计应该运行的目标时钟周期。设
4、计将被映射到目标FPGA器件一一赛灵思FPGA上。(XRSyStenCVivadoH1S.W.vhdDeSgnXiIinxISEFPGAbtstream_C1ockPeriodConstraintCC+SystemCTestoenchTargetFPGADevce时钟周期约束CC+-SystemCtestbench目标FPGA器件FPGA比特流:田咱氏i旦图1-采用ViVadOH1S进行FPGA综合的流程C语言的矩阵乘法为了充分利用我们的矩阵乘法实例,我们将探索矩阵乘法C语言实现方案的各种修订版本,从而展示它们对综合设计的影响。这一过程将凸显您在使用H1S进行原型设计和实际设计时需要注意的重要
5、问题。我们将跳过创建工程的有关步骤,因为您能很方便地在工具文档中找到相关参考材料。我们将重点介绍设计和实现等方面。在典型的ViVaeIOH1S流程中,我们需要三个C/C+文件:源文件(包括待综合的C函数)、头文件和通过main。函数调用描述testbench的文件。头文件不仅包括源文件中使用的函数的声明,也包括支持具有特定位宽的用户定义数据类型的指令。这也使得设计人员能够采用与C/C+所定义标准位宽不同的位宽。举例来说,整形数据类型(int)在C语言中通常为32位长,但是在ViVacIOH1S中您可指定用户定义的数据类型,例如只使用16位的“data”o图2显示了用于矩阵乘法的简单C函数。两个
6、矩阵mat1和mat2进行乘法。为了简单起见,两个矩阵大小一样,都是两行两列。voidmatrixmu1tip1y(datamat1eft(22rdataraatright(22fdataproduct(2(2)datai,j,k;for(i0ji2i*)(for(j-0;j2;j*)for(k0;k2;k*)(product(i)(j)producti(j*mat1eft(ik*matright(k)(j);图2用于2*2矩阵乘法的简单C代码在H1S流程中执行的步骤如下: 第一步:创建工程 第二步:测试功能 第三步:综合 第四步:RT1协同仿真 第五步:导出RT1/RT1实现第一步编译工程并
7、在不同的设计文件中测试语法错误等。第二步测试待实现的函数(在源文件中)功能是否正确。在这一步骤中您将使用testbench执行函数调用,验证其功能是否正确。如果功能验证失败,您就需要返回来修改设计文件。第三步进行综合,VivadoH1S综合源文件中定义的函数。这一步的输出包括C函数的Veri1og和VHD1代码(RT1设计),也包括目标FPGA的资源利用率估算和时钟周期估算。此外,VivadoH1S还可生成IatenCy估算和回路相关的度量指标等。第四步是使用Ctestbench仿真生成的RT1。这一步叫做RT1协同仿真,因为工具采用的就是之前用于验证C源代码的testbench,现在则测试R
8、T1的功能正确性。要成功完成这一步,您系统(WinCioWS或1inUX)中的PATH环境变量应包含ModeISim安装的路径。此外,您还应在ModeISim安装文件夹中包含GCC-4.2.1-mingw32vc9套件。最后,第五步就要将RT1导出为IP模块,用于更大的设计中,并由其它赛灵思工具进行处理。您可将RT1导出为IP-XT格式的IP模块,也可导出为SystemGeneratorIP模块或PCore格式的IP模块,进而用于赛灵思嵌入式设计套件。导出ViVado生成的RT1时,您可以选择工具的“评估”选项来评估布局布线后的性能并且运行RT1实现。在此情况下,ViVadoH1S工具会调用赛
9、灵思ISE工具。要实现这一目的,您的系统PATH环境变量需包括ISE安装路径,VivadoH1S将会搜索ISE安装。当然,您也不一定非要将Vivado生成的RT1导出为以上三种格式之一的IP模块不可。导出的格式文件可放在三个不同路径下:此外,您也可在较大设计中使用ViVado生成的RT1,或者将其本身用作顶层设计。当较大设计中例化导出的RT1时,您应注意相关接口要求。mat1eftceproductaddress1:0product_dO15:0matright_ceOmat1eftaddressO1:Oproduct-q15:0matrigh1qO1505aight_addrossO1:0m
10、atrxmu1tip1yprcduct-cap-c1kProdUCt_weOap_rstap_startap-doneapid1eap_ready图3-从图所示代码中产生的设计当综合图2中的C函数时,您将获得如图3所示的RT1级实现方案。您会发现,实现方案中的矩阵1和矩阵2的元素被读取到函数,并且积矩阵的元素被写出。这样,实现方案假定“矩阵乘法”实体以外的存储器能用来存储矩阵1、矩阵2和乘积矩阵的元素。表1介绍了信号描述,表2则介绍了设计度量指标。表2:用于图3所示设计的设计度量指标设计度量指标器件:XC6VCX75TFF784-2DSP48E1查找表44触发器61实现的最佳时钟周期(ns)2
11、. 856时延69吞吐量(初始I可隔)69表1面向图3中设计的信号描述信号描述mat1eft_ceO矩阵1存储器的芯片使能mat1eftq15:0矩阵1的16位元素matIeft_address1:0矩阵1存储器的读地址matright_ceO矩阵2存储器的芯片使能matright_q015:0矩阵2的16位元素matright_address1:0矩阵2存储器的读地址product_ceO积矩阵的存储器的芯片使能product_weO积矩阵的存储器的写使能product_d015:0积矩阵存储器的写数据productq015:0积矩阵存储器的读数据product_addressO1:0积矩阵
12、要读写数据的地址ape1k设计的时钟信号ap_rst设计的高有效同步复位信号ap_start开始计算的开始信号ap_done计算结束和输出就绪的完成信号ap_id1e表示实体(设计)空闲的空闲信号ap_ready表示设计为新输入数据做好准备,与ap_id1e配合使用在表1中,start、done和id1e信号与设计中控制数据路径的有限状态机(FSM)有关。您会发现,VivadoH1S生成的Veri1og假定运算始于Start信号,并且输出数据在ap_done信号从低变高开始有效。ViVadOH1S生成的Veri1og/VHD1将始终保持至少三个基本信号:ap_start、ap_done和ap_
13、id1e,此外还有ap_c1k信号。这意味着不管您使用ViVadOH1S实现什么设计,设计IatCnCy都会限制您的流吞吐量。图2中的设计IatenCy为69个时钟周期,目标时钟周期为3纳秒。这意味着在此特定案例中,所有积矩阵元素需要69个时钟周期可输出。这样,您在至少69个时钟周期前不能为设计提供新一组的输入矩阵。图3中所示的实现方案现在可能并不是您在FPGA上实现矩阵乘法时所预想的结果。您或许希望一款实现方案能让您输入矩阵,并在内部进行存储和计算,随后读取积矩阵元素。这显然是图2所示实现方案无法做到的。该实现方案需要外部存储器提供矩阵数据的输入和输出。调整代码图4中的代码能够满足您的需求,
14、它是源文件的一部分,应该属于C+文件而非此前的C文件。您应在头文件matrixmu1tip1y.h中包含另外两个相关头文件:h1s_stream.h和ap_int.h。请注意,在图2中,当源文件为C文件时,头文件包含了ap_cint.ho头文件ap_int.h和ap_cint.h有助于分别为C+和C源文件定义用户定义的任意位宽的薮据类型。需要头文件h1s.stream.h来充分利用流接口,并且只有在源文件为C+语言时才能使用。tinc1ude,matrixu1cip1ystream.husingnamespacehis;streamstreamd二mat2;streamd_prodmat;vo
15、idmatrixnu1tIp1ystream(stream&d_ma匕1,strea&d_ma匕2,streamdPrOdmaBdatamatrix1eft(2)(20;datamatrixright(2)(2)b0;datamatrixproduct(2(20;datae1ementtnac1;datae1ementtnat2;datai,j,p,q,k;for(i0;i2;i+*)(for(j0;j2;j+)matrix1eft:(1)(j)-d-mat1.read();for(p0;p2;p*)for(q0;q2;q*)matrixright(pqdmat2.readO;)for(i0;i2;i)for(j-0;j2;j*)for(k0;k2;k*