HLS-指令使用指南(一)

简介: HLS-指令使用指南

写在前面


本文记录了HLS的所使用的大部分指令,参考UG1270,对每个指令进行讲解,并有相关示例。

内核优化


pragma HLS allocation


说明


指定实例限制以限制已实现内核中的资源分配。这定义并可以限制用于实现特定功能、循环、操作或内核的 RTL 实例和硬件资源的数量。 ALLOCATION pragma 在函数体、循环或代码区域内指定。

例如,如果 C 源代码有四个函数 foo_sub 的实例,则 ALLOCATION pragma 可以确保最终 RTL 中只有一个 foo_sub 实例。 C 函数的所有四个实例都使用相同的 RTL 块实现。 这会减少功能使用的资源,但会对性能产生负面影响。

C 代码中的操作,例如加法、乘法、数组读取和写入,可以受 ALLOCATION 编译指示的限制。 在综合期间映射到的内核可以以与运算符相同的方式进行限制。 您可以选择限制组合乘法器内核的数量,而不是限制乘法运算的总数,从而强制使用流水线乘法器执行任何剩余的乘法(反之亦然)。

ALLOCATION pragma 适用于它在其中指定的范围:函数、循环或代码区域。 但是,您可以使用 config_bind 命令的 -min_op 参数在整个设计中全局最小化运算符。

语法


将 pragma 放在将应用的函数、循环或区域的主体内。

#pragma HLS allocation instances=<list>  limit=<value> <type>

其中:

  • instances=:指定函数、运算符或内核的名称。
  • limit=:可选地指定要在内核中使用的实例的限制。
  • :指定分配应用于用于创建设计(例如加法器、乘法器、流水线乘法器和块 RAM)的功能、操作或内核(硬件组件)。 类型指定为以下之一:

image.png

示例


示例1

给定具有多个函数 foo 实例的设计,此示例将硬件内核的 RTL 中的 foo 实例数限制为 2。

#pragma HLS allocation instances=foo limit=2 function

示例2

将函数 my_func 的实现中使用的乘法器操作数限制为 1。此限制不适用于 my_func 之外的任何乘法器,或可能驻留在 my_func 子函数中的乘法器。

void my_func(data_t angle) { 
#pragma HLS allocation instances=mul limit=1 operation 
...
}

pragma HLS clock


说明


将命名时钟应用于指定函数。

C 和 C++ 设计仅支持单个时钟。 create_clock 指定的时钟周期应用于设计中的所有功能。SystemC 设计支持多个时钟。 可以使用 create_clock 命令指定多个命名时钟,并使用 pragma HLS 时钟应用于各个 SC_MODULE。每个 SC_MODULE 都使用单个时钟进行综合。

语法


将编译指示放在函数体内的 C 源代码中。

#pragma HLS clock domain=<clock>  

其中,domain=,指定时钟名称。

示例


示例1

假设一个 SystemC 设计,其中顶层 foo_top 具有时钟端口 fast_clock 和 slow_clock。 但是, foo_top 在其函数中仅使用 fast_clock。 子块 foo_sub 仅使用 slow_clock。在此示例中,在启动 Vivado HLS 工具时指定的 script.tcl 文件中指定了以下 create_clock 命令:

create_clock -period 15 fast_clk 
create_clock -period 60 slow_clk

然后在 C 源文件中指定以下编译指示以将时钟分配给指定的函数 foo_sub 和 foo_top:

foo_sub (p, q) {
#pragma HLS clock domain=slow_clock
...
}
void foo_top { a, b, c, d} {
#pragma HLS clock domain=fast_clock
...

pragma HLS expression_balance


说明


有时,基于 C 的规范是用一系列操作编写的,从而导致 RTL 中的一长串操作。 如果时钟周期较短,这会增加设计中的延迟。

默认情况下,Vivado HLS 使用关联和交换属性重新排列操作。

这种重新排列创建了一个平衡树,可以缩短链,潜在地以额外硬件为代价减少设计中的延迟。EXPRESSION_BALANCE 编译指示允许在指定范围内禁用或明确启用此表达式平衡。

语法


将编译指示放在 C 源代码中所需位置的边界内。

#pragma HLS expression_balance off

其中,off:在此位置关闭表达式平衡。将此选项排除在编译指示之外会启用表达式平衡,这是默认模式。

示例


示例1

此示例在函数 my_Func 中显式启用表达式平衡:

void my_func(char inval, char incr) { 
#pragma HLS expression_balance

示例2

在函数 my_Func 中禁用表达式平衡:

void my_func(char inval, char incr) { 
 #pragma HLS expression_balance off

pragma HLS latency


说明


为函数、循环和区域的完成指定最小或最大延迟值或两者。 延迟定义为产生输出所需的时钟周期数。函数延迟是函数计算所有输出值并返回所需的时钟周期数。 循环延迟是执行循环的所有迭代的周期数。

Vivado HLS 始终尝试将设计中的延迟降至最低。 当指定 LATENCY pragma 时,工具行为如下:

  • 延迟大于最小值或小于最大值:满足约束。 没有执行进一步的优化。
  • 延迟小于最小值:如果 Vivado HLS 可以实现小于最小指定延迟,它会将延迟扩展到指定值,从而可能增加共享。
  • 延迟大于最大值:如果 Vivado HLS 无法在最大限制内进行调度,则会增加实现指定约束的工作量。 如果它仍然无法满足最大延迟,它会发出警告,并生成超过最大延迟的最小可实现延迟的设计。

语法


将pragma放在必须管理延迟的函数、循环或代码区域的边界内。

#pragma HLS latency min=<int> max=<int>

其中:

  • min=:可选地指定函数、循环或代码区域的最小延迟。
  • max=:可选地指定函数、循环或代码区域的最大延迟。

尽管最小值和最大值都是可选的,但必须指定一个。

示例


示例1

函数foo的最小延迟为4,最大延迟为8:

int foo(char x, char a, char b, char c) { 
    #pragma HLS latency min=4 max=8 
    char y; 
    y = x*a+b+c; 
    return y 
}

示例2

以下示例中的指定循环_1的最大延迟为12。将pragma放置在循环体中,如图所示:

void foo (num_samples, ...) {
    int i;
    ...
    loop_1: for(i=0;i< num_samples;i++) {
    #pragma HLS latency max=12
        ...
        result = a + b;
    }
}

示例3

以下示例通过指定零延迟创建代码区域并对需要在同一时钟周期内更改的信号进行分组:

// create a region { } with a latency = 0
{
    #pragma HLS LATENCY max=0 min=0
    *data = 0xFF;
    *data_vld = 1;
}

pragma HLS reset


说明


添加或删除特定状态变量(全局或静态)的重置。复位端口在FPGA中用于在任何时候应用复位信号时将连接到复位端口的寄存器和块RAM恢复为初始值。RTL重置端口的存在和行为由config_RTL配置文件控制。重置设置包括设置重置极性的能力,并指定重置是同步还是异步,但更重要的是,它通过重置选项控制在应用重置信号时重置哪些寄存器。

通过 RESET pragma 可以更好地控制复位。 如果变量是静态或全局变量,则 RESET 编译指示用于显式添加重置,或者可以通过关闭编译指示将变量从重置中移除。 当设计中存在静态或全局数组时,这可能特别有用。

语法


将pragma放在变量生命周期边界内的C源代码中。

#pragma HLS reset variable=<a> off

其中:

示例


示例1

此示例将reset添加到函数foo中的变量a,即使全局重置设置为none或control:

void foo(int in[3], char a, char b, char c, int out[3]) { 
#pragma HLS reset variable=a

示例2

即使全局重置设置为state或all,也会从函数foo中的变量a中移除重置。

void foo(int in[3],char a,char b,char c,int out[3]){
#pragma HLS reset variable=a off

pragma HLS resource


说明


指定特定的库资源(核心)用于在RTL中实现变量(数组、算术运算或函数参数)。如果未指定资源pragma,Vivado HLS将确定要使用的资源。Vivado HLS使用硬件内核实现代码中的操作。当库中的多个核心可以实现该操作时,可以指定要与资源pragma一起使用的核心。要生成可用核心的列表,请使用list_core命令。

list_core命令用于获取库中可用核心的详细信息。list_core只能在Vivado HLS Tcl命令界面中使用,必须使用set_part命令指定Xilinx设备。如果未选择设备,则list_core命令不起任何作用。

例如,要指定库中用于实现数组的内存元素,请使用资源pragma。这使您可以控制阵列是作为单端口RAM还是双端口RAM实现。这种用法对于顶级函数接口上的数组非常重要,因为与数组关联的内存类型决定了RTL中所需的端口。

可以使用latency=选项指定内核的延迟。对于接口上的块RAM,latency=选项允许您在接口上建模片外非标准SRAM,例如支持延迟为2或3的SRAM。对于内部操作,latency=选项允许使用更多流水线阶段来实现操作。这些额外的流水阶段可以帮助解决RTL合成过程中的时间问题。要使用latency=选项,操作必须具有可用的多级内核。Vivado HLS为所有基本算术运算(加、减、乘、除)、所有浮点运算和所有块RAM提供多级内核。

为获得最佳结果,赛灵思建议您对 C 使用 -std=c99,对 C 和 C++ 使用 -fno-builtin。 要指定 C 编译选项,例如 -std=c99,请使用带有 -cflags 选项的 Tcl 命令 add_files。 或者,使用项目设置中的编辑 CFLAG 按钮 对话框。

语法


将pragma放在定义变量的函数体中的C源代码中。

#pragma HLS resource variable=<variable> core=<core> latency=<int>

其中,

  • variable=:指定要将资源pragma分配到的数组、算术运算或函数参数的必需参数。
  • core=:指定核心的必需参数,如技术库中所定义。
  • latency=:指定核心的延迟。

示例


示例1

在下面的示例中,指定了一个2级流水线乘法器来实现函数foo的变量c的乘法。由Vivado HLS决定变量d使用哪个内核。

int foo (int a, int b) {
int c, d;
#pragma HLS RESOURCE variable=c latency=2
c = a*b;
d = a*c;
return d;
}

示例2

在下面的示例中,变量coefs[128]是顶级函数foo_top的参数。此示例指定使用库中的核心RAM_1P实现系数:

#pragma HLS resource variable=coeffs core=RAM_1P

在RTL中创建的用于访问系数值的端口在RAM_1P核心中定义。

目录
相关文章
|
存储 Cloud Native Linux
音视频 FFmpeg如何查询命令帮助文档
音视频 FFmpeg如何查询命令帮助文档
|
4月前
|
编解码 Java Android开发
FFmpeg开发笔记(四十五)使用SRT Streamer开启APP直播推流
​SRT Streamer是一个安卓手机端的开源SRT协议直播推流框架,可用于RTMP直播和SRT直播。SRT Streamer支持的视频编码包括H264、H265等等,支持的音频编码包括AAC、OPUS等等,可谓功能强大的APP直播框架。另一款APP直播框架RTMP Streamer支持RTMP直播和RTSP直播,不支持SRT协议的直播。而本文讲述的SRT Streamer支持RTMP直播和SRT直播,不支持RTSP协议的直播。有关RTMP Streamer的说明参见之前的文章《使用RTMP Streamer开启APP直播推流》,下面介绍如何使用SRT Streamer开启手机直播。
94 4
FFmpeg开发笔记(四十五)使用SRT Streamer开启APP直播推流
|
4月前
|
缓存 视频直播 Linux
FFmpeg开发笔记(四十三)使用SRS开启SRT协议的视频直播服务
《FFmpeg开发实战》书中介绍了轻量级流媒体服务器MediaMTX,适合测试但不适用于生产环境。SRS是一款国产开源服务器,支持RTMP、SRT等协议,适合生产使用。要启用SRS的SRT推流,需配置`srt.conf`,开启SRT服务并配置端口。在确保FFmpeg集成libsrt后,拉流则使用类似但带有`m=request`的地址。在Windows上,同样需要集成libsrt的FFmpeg来使用ffplay拉流。SRS的日志确认了推拉流的成功。书中提供更深入的FFmpeg开发知识。
179 2
FFmpeg开发笔记(四十三)使用SRS开启SRT协议的视频直播服务
|
5月前
|
Web App开发 缓存 编解码
FFmpeg开发笔记(三十八)APP如何访问SRS推流的RTMP直播地址
《FFmpeg开发实战》书中介绍了轻量级流媒体服务器MediaMTX,适合测试RTSP/RTMP协议,但不适用于复杂直播场景。SRS是一款强大的开源流媒体服务器,支持多种协议,起初为RTMP,现扩展至HLS、SRT等。在FFmpeg 6.1之前,推送给SRS的HEVC流不受支持。要播放RTMP流,Android应用可使用ExoPlayer,需在`build.gradle`导入ExoPlayer及RTMP扩展,并根据URL类型创建MediaSource。若SRS播放黑屏,需在配置文件中开启`gop_cache`以缓存关键帧。
173 2
FFmpeg开发笔记(三十八)APP如何访问SRS推流的RTMP直播地址
|
5月前
|
Web App开发 缓存 Linux
FFmpeg开发笔记(三十六)Linux环境安装SRS实现视频直播推流
《FFmpeg开发实战》书中第10章提及轻量级流媒体服务器MediaMTX,适合测试RTSP/RTMP协议,但不适合生产环境。推荐使用SRS或ZLMediaKit,其中SRS是国产开源实时视频服务器,支持多种流媒体协议。本文简述在华为欧拉系统上编译安装SRS和FFmpeg的步骤,包括安装依赖、下载源码、配置、编译以及启动SRS服务。此外,还展示了如何通过FFmpeg进行RTMP推流,并使用VLC播放器测试拉流。更多FFmpeg开发内容可参考相关书籍。
139 2
FFmpeg开发笔记(三十六)Linux环境安装SRS实现视频直播推流
|
4月前
|
视频直播 Linux Windows
FFmpeg开发笔记(四十二)使用ZLMediaKit开启SRT视频直播服务
《FFmpeg开发实战》书中介绍了使用MediaMTX测试RTSP/RTMP,但该工具简单,不适合生产环境。ZLMediaKit,一个支持RTSP/RTMP/SRT的国产流媒体服务器,是更好的选择。要通过ZLMediaKit和FFmpeg实现SRT推流,需确保FFmpeg已集成libsrt。ZLMediaKit默认配置文件中,SRT监听9000端口。日志显示推流和拉流成功。ZLMediaKit支持多种音视频编码,如H264、AAC等。要了解更多FFmpeg开发信息,可参考该书。
136 0
FFmpeg开发笔记(四十二)使用ZLMediaKit开启SRT视频直播服务
|
6月前
|
编解码 Java Android开发
FFmpeg开发笔记(三十一)使用RTMP Streamer开启APP直播推流
RTMP Streamer是一款开源的安卓直播推流框架,支持RTMP、RTSP和SRT协议,适用于各种直播场景。它支持H264、H265、AV1视频编码和AAC、G711、OPUS音频编码。本文档介绍了如何使用Java版的RTMP Streamer,建议使用小海豚版本的Android Studio (Dolphin)。加载项目时,可添加国内仓库加速依赖下载。RTMP Streamer包含五个模块:app、encoder、rtmp、rtplibrary和rtsp。完成加载后,可以在手机上安装并运行APP,提供多种直播方式。开发者可以从《FFmpeg开发实战:从零基础到短视频上线》获取更多信息。
141 7
FFmpeg开发笔记(三十一)使用RTMP Streamer开启APP直播推流
|
6月前
|
编解码 Linux iOS开发
FFmpeg开发笔记(二十三)使用OBS Studio开启RTMP直播推流
OBS(Open Broadcaster Software)是一款开源、跨平台的直播和和Linux。官网为<https://obsproject.com/>。要使用OBS进行直播,需执行四步:1) 下载并安装OBS Studio(<https://obsproject.com/download>),2) 启动流媒体服务器如MediaMTX,生成RTMP推流地址,3) 打开OBS Studio,设置直播服务为自定义RTMP服务器(127.0.0.1:1935/stream),调整视频分辨率,4) 添加视频来源并开始直播。同时,通过FFmpeg的拉流程序验证直播功能正常。
220 4
FFmpeg开发笔记(二十三)使用OBS Studio开启RTMP直播推流
|
7月前
FFmpeg开发笔记(十八)FFmpeg兼容各种音频格式的播放
《FFmpeg开发实战》一书中,第10章示例程序playaudio.c原本仅支持mp3和aac音频播放。为支持ogg、amr、wma等非固定帧率音频,需进行三处修改:1)当frame_size为0时,将输出采样数量设为512;2)遍历音频帧时,计算实际采样位数以确定播放数据大小;3)在SDL音频回调函数中,确保每次发送len字节数据。改进后的代码在chapter10/playaudio2.c,可编译运行播放ring.ogg测试,成功则显示日志并播放铃声。
132 1
FFmpeg开发笔记(十八)FFmpeg兼容各种音频格式的播放
|
6月前
|
数据安全/隐私保护 索引 Python
详尽分享视频相关的hls协议、VLC播放器、m3u文件的播放
详尽分享视频相关的hls协议、VLC播放器、m3u文件的播放
124 0