给自己学习vivado-HLS留下痕迹
---朱磊
第四章接口综合
概述
接口综合是将RTL接口添加到C设计的过程。另外还把物理接口添加到RTL设计中,接口综合包括了相关联的I/O协议,容许数据通过接口传输并自动与内部优化的逻辑同步。
本教程由4实验练习组成涵盖的主要功能和接口综合。
• Lab1: 查看函数的返回和块级协议
• Lab2: 理解默认端口的I/O协议,并学会怎么选择I/O协议
• Lab3: 查看一下数组端口实现,可以进行分区。
• Lab4: 为设计创建一个优化的实现并添加AXI4接口
教程设计描述
从xilinx网站下载教程的设计文件,参考信息中获取教程设计。
本教程使用教程目录中的设计文件
Vivado_HLS_Tutorial\ Interface_Synthesis。
关于实验
•使用前两个实验室在本教程中的示例的设计很简单,这有助于将焦点保持在接口。
•最后两个实验练习使用多通道累加器。
•本教程介绍如何实现采用高层次综合实现I/O端口和协议。
•在实验4中,创建一个在Lab3中使用最优实现的设计
接口综合 lab1:块级I/O协议
概述
这个实验解释了什么是块级I/O协议,并控制它们
重点:在本教程中的图片和命令假定了教程数据目录
Vivado_HLS_Tutorial 被解压并放置在c:\vivado_HLS_Tutorial
如果教程数据路径解压到不同的位置,或者在linux系统上,调整路径名称指向你选择放置Vivado_HLS_Tutorial目录位置。
步骤1:创建并打开工程
1.打开Vivado HLS 命令提示符
a.在windows系统中,采用Start>AllPrograms>Xilinx Design Tools>Vivado2014.2>Vivado HLS>Vivado HLS2014.2 Command Prompt,如下图
b.在linux系统下,打开新的shell,
2. 用命令提示符窗口,如图55,把接口综合教程的路径变为lab1
3. 执行TCL并建立vivado HLS Project,采用的是vivado_hls –f run_hls.tcl 如图55所示
4. 当vivado HLS 完成,在用户界面里打开工程。用vivado_hls–p vivado_hls –p adders_prj 命令打开,如图56
步骤2:创建和查看默认的块级I/O协议
1.在源文件夹中双击adders.c,打开源代码,并查看如图57
这个例子用了一个简单的设计,把焦点集中在I/O实现上(在设计中没有逻辑)这段代码的重要点如下:
•编译格式的指令被添加到源代码中,为了防止任何I/O协议被综合成为一些数据结构(inA,inB,和inC),I / O端口的协议将在接下来的实验练习中复习。。
•这个函数返回一个值并且从这个函数中只有唯一的输出。正如在后面的练习,不是所有的函数都返回一个值。在本实验练习中讨论该函数返回创建的端口。
2.用工具栏中的按钮执行Run C Synthesis命令,或Solution菜单
当综合完成,综合报告会自动打开
3.查看RTL接口,滚动到综合报告摘要的结尾处。接口摘要和Outline选项卡如图58
有三种类型的端口可以查看
•设计完成花费超过一个时钟周期,因此时钟和复位已经添加到设计中:ap_clk和ap_rst.这两个信号都是一位输入。
•块级I/O协议为了控制RTL设计已经添加端口:ap_start,ap_done,ap_idle和ap_ready。这些端口随后会被详细说明
•设计还有4个数据端口
•输入端口In1,In2和In3,都是32位输入,和指定I/O协议的ap_done(如在图58中指定的指令)
•该设计还具有对函数返回一个32位的输出端口,ap_return。
块级I / O协议允许通过附加的端口、独立数据I / O端口对RTL设计进行控制。但此I / O协议是与函数本身相关联,不与任何数据端口相关联。默认的块级I/O协议被称为ap_ctrl_hs。图58显示了这个协议是与函数的返回值相关联(即使函数中的代码没有指定返回值这也可以)
表1概括了用于块级I / O协议ap_ctrl_hs的信号的行为。
注:解释一下使用术语“交易”。在高层次综合的情况下,一个事务是相当于一个执行C函数(或在综合RTL设计中的等效操作)
应用 |
描述 |
ap_start |
该信号控制模块执行,逻辑为1时设计开始运行。 它应保持逻辑1直到相应的输出握手ap_ready被置位。当ap_ready变高时,决定了是否继续保持ap_start置位并执行其他事物或设置ap_start为逻辑0,当前事务的结束时允许设计暂停,。 如果在ap_ready为逻辑1 之前ap_start被置为低,设计有可能没有把所有输入端口读完,并可能拖延下一个输入读取操作。 |
ap_ready |
这个输出信号表明设计已经准备好接受新数据 当准备好接受新的输入时,ap_ready 信号设置为逻辑1。表明所有为这次事物的输入读已经完成。 如果设计不是流水线操作,直到下一次事物才开始执行新的读。 这个信号是用来决定何时在端口上用新的值,决定是否用一个ap_start输入信号来启动一个新的事务。 如果ap_start信号没有被设置为高,当设计在当前事务完成中所有的操作,这个信号变为低电平。 |
ap_done |
这个信号表明设计在当前的事务中完成所有的操作。输出逻辑1表明设计已经完成了这个事务的所有操作。因为在事务结束时,该信号为逻辑1还表示ap_return端口上的数据是有效的。 不是所有的函数都有函数返回值,因此并非所有的RTL设计都有一个ap_return端口 |
ap_idle |
这个信号表示设计正在操作或闲置状态(无操作)。 输出端口上用逻辑1表明是空闲状态。一旦设计开始运行,该信号为低电平。 该信号为高电平时,设计完成操作,未进行任何进一步的操作。 |
您可以通过查看由RTL协同仿真生成的跟踪文件,观察这些信号的行为。这是在教程的RTL验证所讨论的,但图59示出了用于当前合成的结果的波形。
图59的波形图,表现了块级I/O信号的行为
•设计直到ap_start设置为逻辑1才开始启动。
•通过设置端口ap_idle为低,表明设计不再空闲
•展示了五个事务,首先3个输入值(10,20,和30)被各自用在端口in1,in2和in3.
•输出信号ap_ready变为高表明设计准备好在下个时钟下接受新输入。
•输出信号ap_done表明设计结束,输出端口ap_return的值是有效(首先输出值 60,是三个输入的和)
•因为ap_start保持高电平,下一次事务开始于下一个时钟周期。
注意:在RTL的协同仿真,所有的设计和端口输入控制信号始终处于启用状态。例如,在图59的信号ap_start始终是高的。
在第二个事务,观察ap_return端口,在这个端口上第一个输出的值是70,直到ap_done信号为高电平这个结果才有效。
步骤3:改变块级I/O协议
默认的块级I/O协议是ap_ctrl_hs协议(控制握手协议),在这一步中,您可以创建新的解决方案和改变这个协议。
1. 从工具栏或者工程菜单选择新解决方案(New Solution)来创建一个新的解决方案。
2. 保持所有新解决方案对话框所有设定,这些设定都是默认的,点击完成
3. 在信息窗口中选择C源代码标签(或如果C源代码关闭重新打开)
4. 激活指令选项卡(Directives tab),选择顶层函数,如图60所示
因为块级I/O协议与函数相关联,您必须通过选定顶层函数来指定他们。
5. 在指令选项卡中,鼠标移到顶层函数adders上,右键单击,然后选择插入指令Insert Directives。
打开指令编辑器对话框。
图61展示的对话框,对话框中的下拉菜单为了激活接口模式。
下来菜单为块级接口协议展示了三种选择
ap_ctrl_none: 没有块级I/O控制协议
ap_ctrl_hs: 块级I/O控制握手协议,我们已经采用的
ap_ctrl_chain: 块级I/O协议的控制链。这个I/O协议主要是用于把流水线块链接在一起。
块级I/O协议ap_ctrl_chain不包含在这个教程中。这个协议与ap_ctrl_hs协议类似,但增加了额外的输入信号,ap_continue,它必须为高,当ap_done为了继续下次事务被置位时。这允许下游模块在系统上施加回压,并进一步停止处理,这是不能接受新的数据。
6. 在Directives Editor对话框中的Destination Editor部分中,选择Source File
默认情况下,指令被放置在directives.tcl文件。在这个例子中,该指令被放置在现有的I / O指令的源文件中。
7. 从下拉菜单中选择ap_ctrl_none
8. 点击OK
源文件现在有新的指令,在源文件代码和指令选项卡中都是高亮的。如图62
新指令表示与函数参数/接口相关联被称为返回。所有接口指令与函数参数相连接。对于块级I/O协议,返回参数被用于具体的块级接口。如果函数在源代码里没有返回参数也是可能的。
Figure 62: Block-LevelInterface Directive ap_ctrl_none
9. 在工具栏里点击Run C Synthesis按钮,或者用菜单Solution>Run C Synthesis来综合设计。
在源文件中添加的指令改变的源文件。图62所示源文件名为*adders.c。这个标记表明文件已经更改,但没有保存。
10. 点击YES 来接受对源文件的更改。
当报告打开时,接口概述出现,如图63
Figure 63: Interface summary for ap_ctrl_none
当接口协议ap_ctrl_none被采用时,没有块级接口协议被添加到设计中。仅有诸如clock、reset和data端口。
注意,也没有ap_done信号,consumer模块接收来自ap_return的数据,当数据有效时,ap_return端口现在不能表明
另外,RTL协同仿真的功能需要一个块级I/O协议,为了自动协同仿真安排测试平台和RTL设计。任何试图用RTL协同仿真的结果在下面的错误信息中,停止RTL协同仿真
(理解上有误差)
@E [SIM-345] Cosim only supports the following 'ap_ctrl_none'designs: (1) combinational designs; (2) pipelined design with task interval of1; (3) designs with array streaming or hls_stream ports.
@E [SIM-4] *** C/RTLco-simulation finished: FAIL ***
退出vivado HLS GUI返回命令提示框