首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

学习vivado第6章Lab1——设计分析

学习vivado第6章Lab1——设计分析




概述
从C,C++或者SystemC用一般的设计方法来创建的RTL实现包括以下任务:
•综合设计
•查看最初实现的结果
•应用优化指令提高性能
你可以重复上述步骤直到要求的性能已经达到。随后,你可以重新设计,以提高资源使用率。
这个过程关键部分是对结果的分析。教程解释了如何使用报告和用户分析视图来分析设计和决定优化的应用。
教程由一个lab练习组成:
• 体现了HLS交互分析功能
• 带你经历一个设计从最初的实施,通过六个步骤,并多次优化,产生最终优化设计的过程
在整个教程中证明在一个项目中执行这些步骤使您可以轻松地比较不同的解决方案的能力
Lab1
综合和分析DCT设计,使用从设计分析的见解来进行优化,并判断该最优化的效果。
教程设计描述
从xilinx 网站下载教程设计文件,在教程设计中查看信息。教程所用的设计文件在教程目录vivado_HLS_Tutorial\Design_Analysis
用在Lab练习中的设计样本是2-D DCT函数。为了突出设计分析功能,您的目标是让这个设计在100或更小的间隔内操作。设计应该能够在每100时钟 周期内处理新设定的输入数据。
Lab1:设计优化
这个练习解释了用户分析界面视角的基本操作,还有你如何用这个界面来驱动设计优化。
重要:在教程中的图片和命令假设教程数据路径vivado_HLS_Tutorial被解压放置在c:\vivado_HLS_Tutorial中。
如果教程数据目录解压缩到不同的位置,或者在Linux系统上,调整一些路径名引用到的位置您选择放置Vivado_HLS_Tutorial目录。
步骤1:创建并打开工程
1.打开Vivado HLS 命令提示符
a.在windows系统中,采用Start>All Programs>Xilinx Design Tools>Vivado2014.2>Vivado HLS>Vivado HLS 2014.2 Command Prompt,如下图
b.在linux系统下,打开新的shell,

2. 用命令提示符窗口,如图107,从lab1中将目录切换到设计分析教程。
3. 执行TCL并建立vivado HLS Project,采用的是vivado_hls –f run_hls.tcl 如图107所示


4. 当vivado HLS 完成,在用户界面里打开工程。用vivado_hls –p dct_prj 命令打开,如图108


步骤2:查看源代码并创建最初的设计
1.        双击原文件夹中的dct.cpp文件,打开原文件代码并查看。本例使用的DCT函数。图109示出了该代码的概述。


•在图109的左边显示了代码的层次
•dct顶层函数有三个子函数:read_data、dct_2d、write_data.
•函数dct_2d有一个子函数dct_1d
•图109的中间展示了在每个函数中的循环
•在图109的右边展示了数据是如何通过函数和循环被处理的
•执行read_data函数,数据通过循环RD_Loop_Row处理,RD_Loop_Row有一个子循环RD_Loop_Col.
•在read_data函数完成后,dct_2d函数执行。
•在函数dct_2d中,Row_DCT_Loop处理数据,Row_DCT_Loop里面嵌套了两个循环:DCT_output_loop和DCT_inner_loop
•DCT_inner_loop调用函数dct_1d
等等,直到函数write_data处理数据
2. 在工具栏中点击Run C Synthesis来把设计综合成RTL级
步骤3:用综合报告查看性能
当综合完成后,综合报告会自动打开,见图110在报告的部分展示了性能


图110突出了下列信息:
•满足8ns的时钟频率
•顶层设计花费3959个时钟周期用来写所有的输出
•在3960个时钟周期后你可以采用新的输入,在输出数据已经完成后的一个时钟。这立即显示,设计不是流水线,但这一事实也注意到报告中:类型设置为none,而不是流水线。
•顶层有一个实例,其中有3668等待时间和启动时间间隔。
这个模块也不是流水线,占大多数的时钟周期。
•注意read_data函数和write_data函数没有被作为顶层的实例所注意到。
图111展示了,在综合过程中,这个模块被自动内联起来。(层次被删除)
高层次综合必须自动内联小的函数为了提高结果的质量。你可以通过添加内联指令与-off选项的功能,防止这种情况。


•在read_data和write_data函数中的循环,因在顶层中实现,因作为在顶层函数中的循环被报告。
•每个循环有144时钟周期的延迟。(因为循环不是流水线,没有启动间隔。)
•用RD_Loop_Col作为一个例子,你可以看到为什么循环延迟了144个周期
•子循环RD_Loop_Col有两个周期的延迟,在每次循环间隔中(循环等待时间)和8个trip count:循环总延迟为2×8=16个时钟周期。(这个循环要迭代8次,每次花费2个时钟周期。所以这次循环结束需要花费8*2=16个时钟周期)
•从RD_Loop_Row中,需花费1个时钟进入到循环RD_Loop_Col中,还需花费1个时钟周期返回到RD_Loop_Row中。因此对于RD_Loop_Row间隔延迟为(1+16+1)18个时钟周期。
•RD_Loop_Row有8个tripcount,因此总循环延迟为8*18=144时钟周期。
•因此DCT模块总的延迟为:
•RD_Loop_Row为144时钟
•加dct_2d 3668个时钟
•加WR_Loop_Row 144个时钟
•加进入每个模块的1个时钟
要查看实例子块dct_2d和dct_1d的细节,从资源管理器中的soltion1下的SYN/reports文件夹,打开各自的报告。
您也可以使用设计分析的角度来看,以更互动的方式查看这些细节。
步骤4:用分析视窗查看性能
在综合完成后的任意时间都可使用分析视窗
1.        点击Analysis视窗按钮(图112),来开始交互设计分析。


分析视窗有5个窗口组成,每一个都在图113中高亮显示。您在教程中使用它们。模块和循环层次显示扩展(默认情况下,它们显示收起)。


使用模块的层次结构窗格浏览层次结构。该模块层次结构窗格显示既为整个设计的性能和资源使用的信息。性能配置窗格显示这个层次级的性能细节。你刚才在报告中查看的信息(顶级DCT块),在这两个窗格里是相似的。
性能的视图还被示出(图113右侧)。该图显示了在特定模块中的操作是如何调度时钟周期的。
•左列列出的资源。
•子模块是绿色的
•在源代码中的循环操作结果是黄色的。
•标准作业是紫色
•请注意,DCT有三个主要的资源
•调用RD_Loop_Row的循环。+符号表示这个循环下层结构,你可以展开这个循环并查看。
•调用dct_2d的子模块
•调用WR_Loop_Row的循环
最上面一行列出了在设计中的控制状态。控制状态的内部状态,高层次综合使用操作计划转成时钟周期。在RTL有限状态机(FSM)的最终状态和控制状态之间有密切的关系,但没有一个一对一的映射。
2.        点击RD_Loop_Row和子循环RD_Loop_Col,全展开循环层次如图114


由此看来,你可以看到,在RD_Loop_Row的第一状态(C1),检查循环退出条件并添加操作执行。该加法可能是循环迭代的计数,我们可以证实这一点。
3.        在C1状态中选择加号,右击并选择C源代码图115。
高亮显示打开C源代码,这个操作在C源代码中创建一个加法器。在屏幕上更多细节如图115,你能确定它的确是循环计数器。它是唯一在这行,而变量被命名为“r”。


RD_Loop_Row循环下个状态中(状态2),循环RD_Loop_Col开始执行。
4.        在RD_Loop_Col里点击任何操作,看见高亮源代码更新。
这将有助于确认在C源代码的操作如何在RTL的实现理解。
•检查循环退出情况
•一个加法器,用于循环计数变量“c”的。
•从RAM中执行读(一个周期用以产生地址,一个周期用来读的数据)。
•向RAM中执行写
5.        在C源代码窗口中点击X,关闭窗口。
6.        在Module Hierarchy窗口中,点dct_2d函数导航到这个函数的视图。如图116


同样,你可以看到一些循环(图116显示为黄色)。循环确保设计将有小资源,但设计需要多个迭代的状态来完成:循环的每次迭代都会在下一次迭代开始前完成。
您可以对循环使用流水线,以改善性能。在性能配置文件的细节中显示大部分延迟是由循环Row_DCT_Loop和Col_DCT_Loop造成的。
7. 点击循环Row_DCT_Loop和Col_DCT_Loop,在性能窗口中完全展开它们,如图117。
在性能视图中展开这些循环显示了两个循环调用函数dct_1d。除非这个功能本身是流水线,否则流水线对这个循环来说没有好处。 该模块的层次结构显示dct_1d的时间间隔为210个时钟周期,这意味着它只能接受一个新的输入每210个时钟周期后。
8. 在模块层次结构,单击函数dct_1d导航到这个函数的视图中。
9 . 展开在Performance Profile和Performance中的循环来看到如图117。


在图117中,你可以看到一系列嵌套循环可变为流水线。
您可以选择执行下列操作之一:
•您可以用流水线函数,然后流水线调用它的循环。 (由于该函数是流水线,循环可以利用流水线部分的优点。)
•您可以流水线此函数内的循环,使该功能执行得更快。
用流水线方式函数将展开所有的循环,从而大大增加了资源的使用。如果目标是获得尽可能高的性能,没有考虑资源,这可能是要执行的最佳优化。
你可以找到关于流水线循环和函数教程优化设计的更多细节。 对于这种情况下,该方法是优化循环,并保持资源使用在最低限度。
10,点击综合按钮,返回到主综合图上。


步骤5:应用循环流水线并查看循环优化
在这步中,你创建一个新的解决方案,并向循环添加流水线指令。
当流水线嵌套循环时,在内部循环中采用流水线通常来说是最好的。通常,高层次综合一般可以自动展开的循环嵌套(允许外循环简单地反馈内循环)。为什么执行某些循环优化比其他循环更好,请参阅教程“优化设计”的更多信息。
1.        在工具栏上选择New Solution按钮,或者用菜单Project>New Solution来创建一个新的方案
2.        点击Finish,接受默认。
3.        保证能在信息窗口中看见C源代码
4.        在指令标签中,向函数dct_1d中的循环DCT_Inner_Loop中添加流水线指令。
a.        在指令窗中右击DCT_Inner_Loop,并选择Insert Directive
b.        在指令编辑对话框中激活上部的指令下拉菜单并选择PIPELINW
c.        点击OK并选择默认的最大流水线率
5.        重复步骤4,对以下循环
a.        在函数dct_2d中,循环Xpose_Row_Inner_Loop
b.        在函数dct_2d中,循环Xpose_Col_Inner_Loop
c.        在函数read_data中,循环RD_Loop_Col
d.        在函数write_data中,循环WR_Loop_Col
指令窗口展示了以下(高亮)优化指令的应用图119


6.        在工具栏里点击Run C Synthesis按钮,把设计综合成RTL级
7.        当综合完成,用Compare Reports工具栏按钮或者用菜单Project>Compare Reports来比较方案1和2
图120展示了方案1和2的比较结果。流水线的循环降低设计的延迟,在solution2的减少了近50%。


接下来,您再一次打开分析视窗,分析结果,并决定是否有更多进行优化的机会。
8.        点击Analysis视窗按钮,开始交互设计分析。
当分析视窗打开,您可以观察到延迟主要还是由于模块dct_2d。在继续前一步分析之前,可以查看在这个层次的循环如何都得到了优化。
Performance Profile(图121)展示了这两个循环的延迟已经从方案1的144个时钟减少到65个时钟。


流水线循环传输延迟从
Latency=iteration latency * (tripcount * interval)到Latency=iteration latency + (tripcount * interval)
HLS也使这一切成为可能,通过自动执行循环打散(不再有任何循环层次)。您可以通过查看控制台窗格中看到这一点,或solution2的日志文件。图122显示已自动优化的循环。


9.        在Module Hierarchy中,点击函数dct_2d,导航到这个函数的显示上。
在Performance Profile中,您可以看到所有循环的延迟已经被大幅减少。(Row_DCT_Loop和Col_DCT_loop已经大约从早先的报告减少了一半,如图116)。但是,主要的延迟任然由于这两个循环,每次在调用dct_1b模块的时候.
10. 在Module Hierarchy中,点击函数dct_1d,导航到这个函数的显示上。
在Performance Profile中,图123。显示循环延迟已经减少。但在这仍然有循环层次。(仍然有的循环DCT_Outer_Loop,如图123,因此没有循环打散发生)


在性能视图中查看这些循环说明了为什么这个循环没有进一步的优化。
11. 在Performance视图中,点击循环DCT_Outer_Loop和DCT_Inner_Loop打开循环层次。如124
12. 选择write operation in state C5.
13. 右击并选择Goto Source
图124展示出了这个循环是有层次的,因为在DCT_Outer_Loop的水平上,DCT_Inner_Loop以外还有其他操作,阻止了循环展开。一个防止循环展开的操作,如图124高亮显示,如下。


向数组中写不能够在内部循环中展开。为了实现关于DCT Outer Loop有1的间隔,则您需要在外循环实现流水线 - 内循环本身实现流水线并没有好处。
你应该用流水线取代外循环。这会导致内部循环被完全展开。增加资源使用的结果,但你仍然远离100的目标,还没有准备好为整个函数用流水线来操作(当外循环也是完全展开,会使用更多的资源)。
14. 点击综合按钮,返回到综合视图上。
附件大小实验例子.rar17.21 KB


记录学习中的点点滴滴,让每一天过的更加有意义!
返回列表