Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >高级综合工具StratusHLS学习笔记(2)

高级综合工具StratusHLS学习笔记(2)

作者头像
月见樽
发布于 2020-03-26 14:07:11
发布于 2020-03-26 14:07:11
1.1K00
代码可运行
举报
运行总次数:0
代码可运行

学习目标为:

  • 如何使用高级综合生成流水线
  • 如何使用Stratus进行层次化设计

1.生成流水线

Stratus允许指定一个主循环(while(1))中的内容为流水线方式实现,即每个时钟周期均可以进入数据执行,需要在主循环开始时添加如下语句指定使用流水线实现:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
HLS_PIPELINE_LOOP(<STALL_TYPE>, <cycle>, <name>);

上述指定该loop为流水线实现,具有三个参数,分别如下所示:

  • STALL_TYPE:实现类型,包括HARD_STALLSOFT_STALL两种
  • cycle:数据进入间隔,即“每隔多少个时钟周期可进入一个数据”,当cycle=1时表示每个周期均可进入数据
  • name:流水线配置名称,每个循环流水线名称不同即可

对于STALL_TYPE中的两种,具有以下的区别:

  • HARD_STALL:当流水线的某一级阻塞时,整条流水线停止运行
  • SOFT_STALL:当流水线的某一级阻塞时,仅阻塞级之前的流水线停止运行,阻塞级之后的流水线继续运行

对于要生成流水线的代码片(循环体),Stratus有以下的要求:

  • 循环展开(Nested Loops):循环体中仅可以嵌套次数指定的循环,且被指定生成流水线的循环要么为无限循环,要么为指定次数循环
  • 数据依赖(Data Dependencies):需要保证每一级需要的数据在运行这一级之前已经生成,即数据流向固定向前,不存在反向数据流(产生数据冲突),若发生这种情况Stratus会报错:Unable to satisfy HLS_HLS_PIPELINE_LOOP directive "main_pipeline",possibly because of a statement in this line.
  • 端口访问(Port Access Conflicts):对于端口的访问需要谨慎,需要避免连续两个周期访问一个端口的写法,因为会产生对端口的访问冲突(前一次进入loop和后一次loop在同一周期需要访问同一个接口),这种情况会报出Warning:Pipelining forces multiple assignments to output data_out
  • 非平衡流水线(Unbalanced Protocol Blocks):避免在展开为流水线的循环中使用消耗时钟周期不同的条件判断。即若在循环中使用if-else语句,两个代码块消耗的时钟周期必须一致。
  • 循环跳出(Conditional Exits in Pipelined Loops):允许使用break语句跳出循环,但用于判断是否跳出循环的逻辑消耗的时间必须少于数据进入间隔时钟周期

学习过程使用上一次使用的+1功能电路,将其执行线程改为以下按流水线展开:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
void dut_template::t() {
    {
        HLS_DEFINE_PROTOCOL("reset");
        x_in.reset();
        y_out.reset();
        wait();
    }
    while(1) {
        // HLS_PIPELINE_LOOP(HARD_STALL, 1, "main_loop");
        HLS_PIPELINE_LOOP(SOFT_STALL, 1, "main_loop");
        DT x_val = x_in.get();
        DT out_val = x_val + 1;
        y_out.put(out_val);
    }
}

这里使用了输入间隔为1个周期(每个周期均可输入)的SOFT_STALL形式的流水线。

2.层次化设计

为了观察流水线功能,这次将两个+1功能模块dut_template连在一起进行仿真,顶层为pipeline_test,代码如下所所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#ifndef _DUT_PIPE
#define _DUT_PIPE

#include "cynw_p2p.h"
#include "cynw_fifo.h"
#include "defines.h"
#include "dut_template_wrap.h"

SC_MODULE(pipeline_test) {
public:
    cynw_p2p<DT, ioConfig>::base_in x_in;
    cynw_p2p<DT, ioConfig>::base_out y_out;
    cynw_p2p<DT, ioConfig> tmp;
    sc_in_clk clk;
    sc_in<bool> rst;

    dut_template_wrapper *ut0;
    dut_template_wrapper *ut1;

    SC_CTOR(pipeline_test):
        x_in("x_in"),y_out("y_out"),tmp("tmp"),
        clk("clk"),rst("rst") {

        ut0 = new dut_template_wrapper("ut0");
        ut0->clk(clk);
        ut0->rst(rst);
        ut0->x_in(x_in);
        ut0->y_out(tmp);

        ut1 = new dut_template_wrapper("ut1");
        ut1->clk(clk);
        ut1->rst(rst);
        ut1->x_in(tmp);
        ut1->y_out(y_out);
    }   

    // void t();  不可调用函数进行连线!!!

};

#endif

首先关注使用的p2p接口如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    cynw_p2p<DT, ioConfig>::base_in x_in;
    cynw_p2p<DT, ioConfig>::base_out y_out;

需要注意的是本次使用了base_inbase_out而不是inout(参考笔记1),因为这两个端口的目的仅仅为连接使用,相当于连线,因此不需要使用inout,也不需要指定时钟与复位信号。随后关注调用部分:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    dut_template_wrapper *ut0;
    dut_template_wrapper *ut1;

这里的调用方式为调用dut_template_wrapper而不是dut_template,这是Stratus的区别,若要在高级综合中保留层次结构,则需要在这里调用wrapper而不是本身,对应的,也需要在tcl中指定子模块dut_template为待综合模块。最后一点需要注意的是,SC_CTOR中连线部分需要在本函数中编写,不可像system中一样调用函数进行连线,否则会在仿真过程中产生问题。该设计对应的project.tcl如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
...
use_tech_lib    "$LIB_PATH/$LIB_LEAF"


set_attr clock_period           10.0
set_attr message_detail         3
set_attr default_input_delay    0.1

set_attr cc_options             "  -g --std=c++0x"
enable_waveform_logging -vcd
set_attr end_of_sim_command "make saySimPassed"

define_system_module basic_ut/main.cpp
define_system_module basic_ut/system.cpp
define_system_module basic_ut/tb.cpp

define_hls_module pipeline_test dut_module/pipeline_test.cpp 
define_hls_module dut_template dut_module/dut_template.cpp # 子模块也需要指定为待综合模块

define_io_config * TLM
define_io_config * PIN

define_hls_config pipeline_test BASIC
define_hls_config dut_template BASIC # 子模块也需要指定综合等级

define_sim_config T -io_config TLM
define_sim_config B -io_config PIN

define_sim_config H {pipeline_test RTL_V BASIC}

3.仿真结果

仿真结束后使用verdi查看波形,未添加流水线的波形如下所示:

可以发现这种情况下每两个周期才能输入一个数据,添加了流水线的波形如下所示:

添加了流水线展开后,可以发现每个时钟周期均可输入新的数据。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
高级综合工具StratusHLS学习笔记(3)
存储器生成使用Stratus IDE内置的存储器模型生成器,首先使用Stratus IDE打开工程,在左侧边栏中打开project选项卡,打开libraries,右键Memories,选择New Memory Library新建存储器库,新建后可以在工程下发现同名文件夹
月见樽
2020/04/02
8990
高级综合工具StratusHLS学习笔记(3)
高级综合工具Stratus学习笔记(1)
本次学习参考Stratus内置的学习例程(simple_p2p),学习内容主要如下所示:
月见樽
2020/03/21
1.6K0
高级综合工具StratusHLS学习笔记(4)
对于指数位宽和尾数位宽,为每一个浮点数都具有的参数,不用过多解释;对于精确度,具有多种选项,每种选项具有不同的精度-代价折中,如下表所示:
月见樽
2020/09/10
7170
Verilog实现MIPS的5级流水线cpu设计(Modelsim仿真)[通俗易懂]
1.1:实验目的 (1)CPU各主要功能部件的实现 (2)CPU的封装 (3)了解提高CPU性能的方法 (4)掌握流水线MIPS微处理器的工作原理 (5)理解并掌握数据冒险、控制冒险的概念以及流水线冲突的解决方法 (6)掌握流水线MIPS微处理器的测试仿真方法 1.2:实验要求 (1)至少实现MIPS中的三类指令,即R类,I内,J类指令 (2)采用5级流水线技术 (3)完成Lw指令的数据冒险的解决 (4)在ID段完成控制冒险的解决
全栈程序员站长
2022/09/24
1.5K0
Verilog实现MIPS的5级流水线cpu设计(Modelsim仿真)[通俗易懂]
HLS最全知识库
高层次综合(High-level Synthesis)简称HLS,指的是将高层次语言描述的逻辑结构,自动转换成低抽象级语言描述的电路模型的过程。
碎碎思
2023/02/14
2K0
HLS最全知识库
3天上手,30天精通!—— 深度学习FPGA加速器设计
利用高层次综合工具,开发者只需要编写高级语言的代码完成程序功能,就能将高级语言编写的代码综合成相同功能的 RTL 级实现 (基于 Verilog 或 VHDL)。开发者还可以通过添加一些 pragma 的方式来指示和调整高层次综合工具生成的硬件模块的架构。整体而言,利用高层次综合工具进行 FPGA 硬件开发的过程,应该是利用软件语言的表达来描述硬件模块的过程。目前,高层次综合的代码都是基于 C/C++/OpenCL 的,所以对于没有硬件设计基础的朋友来说,利用高层次综合工具可以大幅度地降低学习难度,缩短开发周期,加快设计迭代速度。
机器之心
2019/06/05
3.3K1
3天上手,30天精通!—— 深度学习FPGA加速器设计
C/C++ 性能优化背后的方法论:TMAM
开发过程中我们多少都会关注服务的性能,然而性能优化是相对比较困难,往往需要多轮优化、测试,属于费时费力,有时候还未必有好的效果。但是如果有较好的性能优化方法指导、工具辅助分析可以帮助我们快速发现性能瓶颈所在,针对性地进行优化,可以事半功倍。
2020labs小助手
2021/03/17
2.6K0
SystemC入门笔记
SystemC为C++的一个库,因此C++的特性在SystemC中均可以使用,数据类型同理,除了C++中的数据类型外,SystemC也有一些自己的数据类型,如下所示:
月见樽
2019/01/28
3K0
SDAccel矩阵乘法优化(三)
承接第二篇Local Memory的实现方法,接下来进一步进行矩阵乘法的优化处理。本文主要解决gmem carry dependency的问题。在这里,不采用Max Memory Ports的方法,因为采用多个接口会消耗大量的LUT资源,并且大大的限制时钟频率的提升。其实,前面分析过了造成gmem carry dependency的原因,在矩阵乘法的实现过程中,我们完全可以将两个输入的数据分离,不需要在一个for循环中同时进行数据的读取而导致一个for循环在pipeline的过程中需要对两个接口进行读取的问题。因此我们改进代码,将两个输入数据分离并实现Burst突发传输。
AI异构
2020/07/29
6520
SDAccel矩阵乘法优化(三)
SDAccel矩阵乘法优化(四)
现在经过前面两次优化后,代码的组织结构没有什么问题了,现在的关键问题是:矩阵运算的嵌套for循环仅仅实现了内层的pipeline,因为外层for循环无法对内部的for循环flatten,所以外面两层的for循环没有实现pipeline。要解决这个问题,最直接的思路就是将最内层的for循环直接进行循环展开,进一步提高计算过程的并行度。但是在进行循环展开的过程中,需要将内层用到的数组进行切割,否则将无法进行unroll。因此,我们将用到的指令有三个:内层for循环要进行循环展开(unroll),并行计算用到的数组要进行数组切割(array partition),次外层的for循环要流水起来(pipeline)。
AI异构
2020/07/29
1.3K0
SDAccel矩阵乘法优化(四)
并发编程学习笔记03-Java并发机制的底层原理之原子操作的实现原理
处理器会自动保证基本的内存操作的原子性。处理器保证从系统内存中读取或者写入一个字节是原子的,即:当一个处理器读取一个字节时,其他处理器不能访问这个字节的内存地址。
WindCoder
2020/01/21
3950
FPGA基础知识极简教程(7)详解亚稳态与跨时钟域传输
这篇文章主要是对过去对于亚稳态以及跨时钟域传输问题的一次总结,作为这个系列博文的一次梳理吧。注:微信公众号也会更新,欢迎大家关注,我有了新文章会通过微信公众号推送通知大家,让你有选择的看到我的最新动态。
Reborn Lee
2020/06/29
1.4K0
DC的逻辑综合与优化
对进行时序路径、工作环境、设计规则等进行约束完成之后,DC就可以进行综合、优化时序了,DC的优化步骤将在下面进行讲解。然而,当普通模式下不能进行优化的,就需要我们进行编写脚本来改进DC的优化来达到时序要求。理论部分以逻辑综合为主,不涉及物理库信息。在实战部分,我们将在DC的拓扑模式下进行。(本文主要参考虞希清的《专用集成电路设计实用教程》来写的总结整理与实验拓展)主要内容有:
数字芯片社区
2020/07/20
2.9K0
DC的逻辑综合与优化
计算机组成原理笔记(二)
我们先来看一个问题,在Chrome浏览器里面通过开发者工具,打开浏览器里的Console,在里面输入“0.3 + 0.6”:
luozhiyun
2020/02/25
6940
计算机组成原理笔记(二)
利用Xilinx HLS实现LDPC译码器
为简单起见,采用了IEEE 802.16e标准中的2/3A码率的码字,并选择1536的码长作为具体的验证举例。该LDPC码是准循环码,每个循环子矩阵的行重为1。其校验矩阵可以用母矩阵表示为
sea-wind
2019/07/31
1.1K0
利用Xilinx HLS实现LDPC译码器
丛京生院士深度解读可定制计算的设计自动化:自动将代码转换成电路描述,解决开发人员最大难题
中国工程院、美国工程院双院院士丛京生教授在2020年北京召开的亚太地区设计自动化会议(ASP-DAC)上发表了关于可定制计算的演讲,指出可定制计算现在已经在各类公有、私有云上大面积铺开,并称已经做出了像Merlin编译器, HeteroCL, HeteroHalide等一系列的重大进展。(头图由ASP-DAC组委会和北京大学罗国杰教授提供。)
新智元
2020/03/06
1.6K0
丛京生院士深度解读可定制计算的设计自动化:自动将代码转换成电路描述,解决开发人员最大难题
FPGA Xilinx Zynq 系列(二十八)Vivado HLS: 近视 之 算法综合
今天给大侠带来FPGA Xilinx Zynq 系列第二十八篇,讲述Vivado HLS: 近视之算法综合等相关内容,本篇内容目录简介如下:
FPGA技术江湖
2020/12/30
1.4K0
Vivado-hls使用实例
本系列教程演示如何使用xilinx的HLS工具进行算法的硬件加速。分为三个部分,分别为HLS端IP设计,vivado硬件环境搭建,SDK端软件控制。
碎碎思
2020/06/30
2.6K0
Vivado-hls使用实例
CPU性能分析与优化(三)
本章讲性能分析中的术语和指标。如果略过本章节,很难看懂linux perf 或者 intel vTune。Linux perf 是一个性能分析器,您可以使用它来查找程序中的热点、收集各种低级 CPU 性能事件、分析调用堆栈以及许多其他事情。为什么暂时没有使用vTune,因为vTune基于GUI,隐藏了复杂性。
王很水
2024/08/07
5510
CPU性能分析与优化(三)
运维必杀技Perf -- Linux下的系统性能调优工具
来源:刘明 原文地址:https://www.ibm.com/developerworks/cn/linux/l-cn-perf1/ Perf Event 是一款随 Linux 内核代码一同发布和维
小小科
2018/05/04
2.4K0
运维必杀技Perf -- Linux下的系统性能调优工具
推荐阅读
相关推荐
高级综合工具StratusHLS学习笔记(3)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验