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

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

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




步骤6:为了瓶颈对循环进行优化和修改
1.        在工具栏中选择New solution按钮或用菜单Project>New Solution来创建新的方案
2.        点击Finish并且接收默认设置来创建solution3
3.        保证C源代码显示在信息窗口中
4.        在指令标签中
a.        在dct_1d函数中,选择对DCT_Inner_Loop使用流水线指令
b.        右击,并且选择Remove Directive
c.        任然在dct_1d函数中,选择loop DCT_Outer_Loop
d.        右击,并选择Insert Directive
e.        在Directives Editor的对话框中,在上部激活Directives下拉菜单并选择PIPELINE
f.        点击OK并选择默认最大的流水线率
指令窗口展示了如下的优化指令(高亮的)如图125


5. 在工具栏里点击Run C Synthesis按钮,把设计综合成RTL级
6. 当综合完成,用Compare Reports工具栏按钮或者用菜单Project>Compare Reports来比较方案2和3
图126展示了方案2和3的比较结果。输出循环流水线有提高性能和增加资源的实际结果。
获得改善的延迟好处,因为在这个设计中有多个循环调用dct_1d这个函数很多次。在这个模块中节省延迟是翻倍的,因为这个函数在很多循环中用到。


现在所有的循环都是流水线,值得重新审视设计观察是否还有性能限制瓶颈。瓶颈就是限制数据流,并阻止逻辑块工作在最大数据速率下。
在数据流中的这些限制来自很多方面。例如I/O端口和采用块RAM实现的数组。在这两种情况。有限的端口数量(在I/O或块RAM上)限制了数据读写的速率。
另一个瓶颈源是数据依赖前面源代码。在一些例子中,这些数据依赖固有算法如何工作,因为只有完成先前的计算后面的计算才能进行。有时候采用优化指令或一个小的改动的C代码可以将瓶颈消除。
首要任务是辨别在RTL设计中存在的问题。还有一些可以采取的方法:
•启动在Module Hierarchy中的最大间隔延迟报告并导航到下一层找到一些大延迟或间隔的原因
•单击Resource Profile检查I / O和内存的使用情况。
•单击图形查看器,并查看性能视图模式,用来指示数据流的限制。
在这种情况,你可能会有一些方法。您可以使用分析视图在设计中快速识别这些地方。
7. 点击Analysis视窗按钮,开始交互式设计分析
8. 在Module Hierarchy,保证模块dct被选择。
9. 在Performance视图中,在设计中展开第一个循环。如图127.RD_Loop_Row_RD        _Loop_Col(这些循环被打平并命名,现在两个循环是串行)
在两个状态中实现循环,红色箭头在图127中,展示了路径从循环开始到循环结束。箭头几乎是垂直的(一切都发生在两个时钟周期),这个循环在延迟方面的实现也得到改善。


1.        在性能视图,扩展WR_Loop_Row执行相同的分析。它同样也为延迟优化。
2.        双击函数dct_2d并导航到函数dct_2d内部。
您可以通过使用层次相同的分析流程下来。如果您执行此分析,会发现,所有的功能块和循环也执行类似的优化(几个周期),直到dct_1d块进行检查。
3.        在Performance窗口中,双击dct_1d函数,并导航到dct_1内部
4.        扩展DCT_Outer_Loop,在图128查看
图128展示了与早期循环调度(调度仅有延迟一些时钟)非常不同观点。调度展示了从输入到输出有很长的路径。


有两件典型的事情影响调度类型:在源代码中的数据依赖性和由于I/O和RAM块的限制。现在,您将检查该块资源共享。
5.        在Performance视窗中,window底部点击Resource tab
6.        展开Memory Ports,如图129


资源共享视图显示了在设计中资源是如何在不同的控制状态中使用的。
行列出了在设计中的资源,图129,展开内存资源。
在列中展示了在状态中用到的资源。如果资源在多个状态都是激活的,这个资源在不同的时钟被重复利用。
图129展示了BRAM src内存接口被每个时钟最大的利用。(顶多,块RAM可以是双端口而且两个端口都被使用)。这是一个很好的迹象表明设计可能使用了的是带宽有限的内存资源。要确定这是否真的是这样的话,你可以进一步检查。
7.        为块RAM的src选择一个读操作。
8.        右击并选择Goto Source来查看视图如图130


图130展示出了在src变量上的读操作是从内循环DCT_Inner_Loop的读操作。当DCT_Outer_Loop被流水线化,这个循环被自动展开。而且此循环中的所有操作都可以并行发生(如果数据依赖性允许)。
八个读取被迫发生过多个周期,因为数组src为实现在RTL块RAM和RAM块可以只允许两次读取(最大)中的任何一个时钟周期。在图130中,读操作需要2个时钟周期:一个周期,以产生地址的RAM块和一个循环来读取数据。只发射(地址生成周期)被显示,因为它在下一时钟周期的操作重叠。
您可以优化使用优化指令来分割的块RAM Block RAM的访问。发挥功能dct_1d阵列存取被定义为输入参数的函数,因此,位于这个块的外部。
•输入数组dct_1d的第一个实例是函数DCT中的buf_2d_in。
•输入数组dct_1d的第二个实例是是函数dct_2d的col_inbuf。
在这两种情况下,该数组是尺寸是二维,DCT_SIZE*DCT_SIZE(8×8)。默认情况下,这结果在64元素的单端口RAM块中。因为数组中配置的代码行由列的表格,我们可以分区第二大小和创建八个独立块 RAM的:一个用于每一行,从而允许该行数据,以并行地访问。
18.点击综合按钮,返回到综合视图上。
步骤7:分区块RAM和分析并行性
1. 在工具栏里选择New Solution按钮,创建一个新的解决方案
2. 点击Finish并接受默认设置,创建解决方案4
3. 保证C源代码在信息窗口是可见的
4. 在指令标签中
a. 在函数dct中,选择数组buf_2d_in
b. 右击并选择Insert Directive
c. 在Directives Editor对话框中在上部激活Directives下拉菜单,并选择ARRAU_PARTITION
d. 保持Complete类型
E. 更改维度,设置为2,为了让数组分区保持为2维。
f. 点击OK
5. 为了在函数dct_2d中的数组col_inbuf重复此过程。
指令窗口现在展示了以下优化指令(新的指令是高亮的)如图131


6. 在工具栏中点击Run C Synthesis按钮,并把设计综合成RTL
7. 当综合完成,使用Compare Reports按钮,或使用菜单Project>Compare Reports来比较解决方案3和4
图132 展示了方案3和方案4的比较结果,在dct_1d模块的源ram块中提高对数据这样提高了整体性能因为dct_1d模块块执行频率。


您可以重新检查分布式指令在器件源中的影响
8. 点击Analysis视窗按钮,开始交互式设计分析
9. 在Module Hierarchy中,保证模块dct被选择
10. 选择Resource Profile在左下角中,选择Resource Profile标签。
11. 扩展Memories and Expressions看图133


Resource Profile显示,在当前级别的层级使用的资源(在Module Hierarchy窗格中选定的块)。如图133所示:
这个模块有端口
大多数资源是由于在该块内的实例(子块)。
• 有九个内存 ,8个用在分布式RAM块
在级别的层级内大多数逻辑(表达式)是由于加法。伴随一些比较器和选择器。
先前优化中重要的一点是你能够看到现在有额外的内存是由于数组分布式优化。
你仍然有一个目标来保证设计能够接受新设定的样本在每100个时钟周期。图132.展示了你仅仅能接受新数据在每509时钟。这个已经比先前的好多了,先前优化设计(大概3700时钟),但离优化要求还有很远。
到这一点,已经集中在提高每一个单独的循环和函数中的设计的延迟和时间间隔。现在,您必须应用数据流的优化,这使得各个环路和功能并行执行,从而提高了整体的设计周期。
12. 点击综合按钮,返回到综合视图上。
步骤8:分区块RAM和应用数据流优化
5. 在工具栏里选择New Solution按钮,创建一个新的解决方案
6. 点击Finish并接受默认设置,创建解决方案5
7. 保证C源代码在信息窗口是可见的
8. 在指令标签中
a. 选择顶层函数dct
b. 右击并选择Insert Directive
c. 在Directives Editor对话框中在上部激活Directives下拉菜单,并选择DATAFLOW.
d. 点击OK
指令窗口现在展示了以下优化指令(新的指令是高亮的)见图134


5. 在工具栏中点击Run C Synthesis按钮,并把设计综合成RTL
6. 当综合完成,使用Compare Reports按钮,或使用菜单Project>Compare Reports来比较解决方案4和5
图135 展示了方案4和方案5的比较结果,你可以看到间隔改善了。设计花费539时钟来产生结果,但是现在可以接受新的输入在每个405个时钟周期。


这个任然大于100时钟要求,因此你必须分析当前的性能
7. 点击Analysis视窗按钮,开始交互式设计分析
8. 在Module Hierarchy中,你可以看到dct_2d计数器占用了大多的时间间隔。保证模块dct_2d如图136那样被选择。


这儿,你可以看到两件事:
dct模块的间隔要少于个别延迟的和(如read_data,dct_2d,和write_data)。这个意味着模块可以并行操作。
dct的间隔是和dct_2d的时间间隔一样的,因此dct_2d模块是限制因素。
因为在Module Hierarchy中选择的dct_2d模块,在Performance Profile中为这个模块展示了细节。图136展示了间隔与延迟是同样的。因此没有模块可以并行操作。
在dct_2d中有模块并行操作的一种方法是将整个功能转化成流水线操作。然而,这会展开所有的循环,这有时会导致大面积的增加。另一种方法是使用数据流优化的函数的dcs_2b。
另一种替代方法是使用一个不太明显的技术:提高这些循环直至达到定层,在那里它们将被包括在已经施加到顶层的数据流优化的顶层。这可以通过使用一个优化指令以除去dct_2d层次结构来实现:内联dct_2d功能。
在执行这个优化前,查看因使用数据流优化的资源增加。
9. 在Module Hierarchy中,保证dct模块被选择
10. 激活Resource Profile 视图
11. 打开内存,如图137


与图133比较,你可以看到在这个层级上现在使用了2倍数量的内存,每个内存在乒乓传输下来支持数据流。在这个例子中,没有新的内存被添加,现存的内存被转换成数据流的乒乓通道。这个一倍与RAM块的数量。
12.点击综合按钮,返回到综合视图上。
步骤9:为数据流优化层次结构
9. 在工具栏里选择New Solution按钮,创建一个新的解决方案
10. 点击Finish并接受默认设置,创建解决方案6
11. 保证C源代码在信息窗口是可见的
12. 在指令标签中
a. 选择函数dct_2d
b. 右击并选择Insert Directive
c. 在Directives Editor对话框中在上部激活Directives下拉菜单,并选择INLINE.
d. 点击OK
指令窗口现在展示了以下优化指令(新的指令是高亮的)


13. 在工具栏里点击Run C Synthesis,把设计综合成RTL级
14. 当综合完成,使用Compare Reports按钮,或使用菜单Project>Compare Reports来比较解决方案5和6.
图139 展示了方案5和方案6的比较结果。你可以看到时间间隔大大改善


现在间隔低于100时钟的目标,设计能接受新的设定输入数据在每70个时钟周期。
你也可以看到在综合报告中的细节,综合报告在分析视窗中自动打开在综合结束时,如图140


结论
在本教程中,您学习:
•如何使用分析视窗分析设计。
•在显示中如何与C代码交互操作。
•如何应用和判断的优化。
•采用初步设计的结果的一种方法,创造出一种满足设计目标的实现
附件大小实验例子.rar17.21 KB


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