vivado_hls
文章平均质量分 60
hahaha6016
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
axilite + ap_memory约束数组-突破单口RAM限制
2.只不过这个RAM对外,这里的对外指的是CPU或者ARM,对外的接口是axilite,通过axilite来访问RAM的地址,从而实现对RAM的读写操作。使用上面的两条约束指令,从而将一个单口RAM变成两个单口RAM,同时操作两个RAM这样来实现乒乓访问,从而能够提高吞吐量,也就是II变小,但是。1.在这种情况下,会将接口数组综合为内部RAM,不再是单纯的接口了,而是实实在在的要消耗资源的。2.可以将一个RAM变成两个RAM,从而得到类似或者近似双口RAM的功能。1.首先,实现不了双口RAM。原创 2026-04-28 13:49:55 · 6 阅读 · 0 评论 -
宏观颗粒度流水设计-子函数之间
本案例中,默认这些参数都被综合为depth比较小的FIFO,上述代码中的width和height全部都被综合为FIFO,其中mem除外,2.这三个子模块在不进行约束的时候是串行执行的,使用dataflow优化后,就是并行执行的;3.模块之间传递的参数变量全部变成管道,管道的类型为FIFO或者pingpang ram;1.使用dataflow优化,注意hls::stream变量,需要使用static修饰。1.上述代码架构为dataflow设计的比较常见的案例,核心实现模块中有三个子模块;原创 2026-04-28 13:41:18 · 290 阅读 · 0 评论 -
axilite + ap_memory修饰数组
最终综合出的 RTL,CPU 看到的始终是一块平铺开的、可随机访问的、但同一时刻只能进行读或写操作的存储空间。这个自动生成的适配器,才是单端口RAM限制的根源。即使 HLS 允许你强制将这个阵列的内部存储设为双端口(比如用 #pragma HLS RESOURCE variable=arr core=RAM_2P),从外部 CPU 看来,它依然是一个单端口的效果。同时指定了接口模式为 'bram' 和 's_axilite',但这两个是冲突的,工具丢弃了 'bram' 模式,保留 's_axilite'。原创 2026-04-28 11:22:53 · 286 阅读 · 0 评论 -
hls某案例分析和总结
3.使用了dataflow优化后,模块之间的参数也会被综合为FIFO或者pingpang ram,本案例被综合为depth=2或者depth=3的FIFO。指定为单口RAM,没啥问题,但是如果你优化为双口RAM,那么就会顶层函数和子函数优化冲突,所以中间。子函数和顶层函数共用数组的时候,子函数的数组会被综合为端口RAM,用户不能修改,如果顶层的数组。RAM的读取和模块的运算是顺序执行的,也不需要进行并行运算,使用串行流处理就行,也就是RAM中。实际上我使用了axilite+bram,没有任何问题!原创 2026-04-27 22:24:37 · 373 阅读 · 0 评论 -
参数传递规则问题-类型匹配
pragma HLS RESOURCE variable=param_mem core=RAM_2P_BRAM//这里指定为双口RAM会出问题。//注意param_cfg中接收¶m_mem[0]的数组或者指针,将会自动的被综合综合工具综合为RAM_1P_BRAM,也就是单口RAM。//注意param_cfg中接收¶m_mem[0]的数组或者指针,将会自动的被综合综合工具综合为RAM_1P_BRAM,也就是单口RAM。上述代码综合也会失败,因为这种强制类型转换会出问题,所以老实的把类型搞对才好。原创 2026-04-27 18:09:10 · 161 阅读 · 0 评论 -
顶层指定RAM和sub_fun指定RAM规则问题
上述代码会出现问题,因为子函数param_cfg和顶层函数my_top都会对param_mem指定规则,用户和vivado hls工具指定的规则冲突了,会报错。//注意param_cfg中接收¶m_mem[0]的数组或者指针,将会自动的被综合综合工具综合为RAM_1P_BRAM,也就是单口RAM。//注意param_cfg中接收¶m_mem[0]的数组或者指针,将会自动的被综合综合工具综合为RAM_1P_BRAM,也就是单口RAM。1.顶层函数的参数是可以指定IO port的,设计者可以指定。原创 2026-04-27 17:58:59 · 180 阅读 · 0 评论 -
高层次综合设计模式
虽然 Vitis HLS 支持对顶层函数使用 hls::tasks,但对于顶层函数中的接口,则无法使用。在 Vitis HLS 工具中实现数据驱动的 TLP 会使用简单的类来进行任务建模 (hls::task) 和通道建模 (hls::stream/数据驱动任务模式是比较合适的。如果应用需要和外部存储器进行交互,并且执行的任务存在数据依赖关系,那么适合使用控制驱动任务的模型。纯数据驱动,不需要和外部存储器进行任何交互,函数可以并行执行,没有数据依赖关系,这种情况下使用。四、数据驱动的任务级别并行度。原创 2026-04-27 14:10:25 · 461 阅读 · 0 评论 -
RTL设计和HLS高层次设计
1.在函数级别实现任务级并行度。为实现任务级并行度,需将循环推送到多个独立的函数中。访问全局存储器会产生更高的时延成本,可耗时大量周期,而访问本地存储器通常十分快速,只需一个或多个周期。1.rtl设计需要关注微架构的决策,高层次设计不需要制定微架构决策,关注的是宏框架设计;2.FSM状态机的创建、数据的路径、寄存器流水线这些细节留给HLS工具编译器来处理;根据经验法则,顺序函数可并发执行,顺序循环则可采用流水打拍。3.高层次综合通过提供的约束来生成优化的rtl;一、RTL设计和HLS高层次设计。原创 2026-04-27 12:53:55 · 392 阅读 · 0 评论 -
hls和hls4ml学习问题
对于学习HLS高层次综合设计的任意,适合对verilog,FPGA有很好的理解,并且对c/c++语言有了解的人员。HLS设计并不是是使用c/c++来实现电路或者功能,需要了解代码背后的硬件,从而对代码进行优化,如果你刚开始,建议你直接vitis hls吧,不要停留在vivado hls;否则,你学习起来比较吃亏,一个模块要做好久,那么就没有必要了。认真的将这个文档学习几遍,好好研究这里面的例子,并进行体会。并行的设计+指令优化+模块理解创新。并行的方式写代码,来实现算法设计。并行的设计+指令优化设计。原创 2026-04-26 21:49:50 · 17 阅读 · 0 评论 -
循环优化方法-Polyhedral Model
多面体模型的应用非常广泛,在HLS里主要被用来将循环语句以空间多面体表示(见下图),然后根据边界约束和依赖关系,通过几何操作进行语句调度,从而实现循环的变换。国外大学视频:https://www.cs.cornell.edu/courses/cs6120/2020fa/lesson/流行的循环优化方法,就是所谓的多面体模型,即Polyhedral Model。原创 2026-04-26 21:25:15 · 15 阅读 · 0 评论 -
高层次综合设计流程
如果你没有hls高层次设计的经验,请花点时间将ug871文档的所有例子一个个步骤全部玩一遍,感受一下。Latency=34,表示输入样本,经过处理,需要34个clock才输出结果;可以从上述波形看出,每两个clock,输入接口后产生一个新的输入数据样本。包括工程的创建,C的验证,C的综合,RTL的仿真,IP的导出。2.循环的优化试图最大的并行化,或者尽可能的流水化。1.优化设计试图采用最小的循环和最小的函数延迟。2.循环内部的依赖和循环之间的依赖。7.hls的ip core的集成。原创 2026-04-26 19:10:03 · 24 阅读 · 0 评论 -
可综合设计框架(二)
vivado hls工具主要从上述四个层面对C/C++代码进行分析。只有一条路径的存在,这个和FPGA设计是不一样的,FPGA设计中这。其中line buffer是使用block ram来实现的;wind buffer是使用Flip-Flop来实现的。if-else条件语言在软件中是分支运算,二选一的设计,FPGA编译器会产生两个路径。二、line buffer和win buffer。依据判定条件选择那个路径来执行。五、case语句产生FSM状态机。一、HLS对程序进行分析。三、控制路径和数据路径。原创 2026-04-26 15:58:59 · 12 阅读 · 0 评论 -
可综合设计框架(一)
多指令集可以流水的方式处理,但是单个时刻只能执行一个exe,这个收到处理器的核的影响,一个核使用多指令集,一次也只能执行一个EXE,所以需要多核处理。这种情况有多个核,但是处理器的核心数毕竟有限,所以同时执行多指令集,虽然有提升性能,但是毕竟还是有限。上图无流水线设计的FPGA流程,时延需要5个clock,但是,这个设计的时钟频率跑不高。流水线设计之后,时钟频率可以跑很高,但是时延变得很大,插入的寄存器会引入延时。1.传统的FPGA编程模型的核心是寄存器的传输级RTL描述。3.多核心多治理集的处理方式。原创 2026-04-26 15:27:01 · 187 阅读 · 0 评论 -
hls高层次综合总结
1.在DATAFLOW优化时,HLS不优化条件执行的tasks。所以在编程中要注意一些问题,典型的就是 if-else 必须放在loop里面,而不是放在loop外面。4.不同接口模式的使用,ap_ctrl_none,ap_ctrl_hs,ap_ctrl_chain。2.使用纯C时,有一个典型的坑,就是数学运算时 一定要注意边界位宽。能用一个loop循环搞定的,就要拆成两个循环来进行串行设计了;能用一个loop循环搞定的,就不要弄成多个循环嵌套设计了;标识接口的端口,也就是优化对象。8.指针多次访问处理。原创 2026-04-26 12:11:23 · 136 阅读 · 0 评论 -
循环优化设计
循环变量的边界是影响unroll展开设计,也影响latency和II的综合显示;2.第二个策略:从代码层面对循环结构进行有效的修改,主体为优化代码结构,然后。但是,由于边界为变量,迭代的次数是不确定的,工具无法静态的判断变量的位宽,循环的边界影响综合报告的原因:虽然单次迭代所需要的时延是可以确定的,方案三:使用一个可以预测的固定的最大值作为边界,然后内部使用条件判断。1.循环在高层次综合设计中是广泛被应用的,得到全面的综合支持;依赖关系的存在会阻止循环流水线化设计,需要判断依赖的真实性,并。原创 2026-04-26 10:42:13 · 102 阅读 · 0 评论 -
RTL黑盒设计
在 C 语言中使用此构造时,请针对 RTL 黑盒 IP 中的对应实参使用。• C 语言标量和输入指针:RTL 黑盒 IP 仅支持在顺序区域和流水线区域中使用 C 语言标量和输入指针,不支持在。• 输入输出指针和输出指针:RTL 黑盒 IP 仅支持在顺序区域和流水线区域中使用输入输出指针和输出指针,不支。1.rtl支持将预先设计的RTL IP集成到HLS设计中,从而通过HLS来设计更加复杂的设计。在 C 语言中使用此构造时,请在 RTL IP 中使用 wire。2.rtl ip可以在顺序区域中使用。原创 2026-04-24 22:41:25 · 43 阅读 · 0 评论 -
C/RTL协同仿真
设置FIFO的detph,先设置比较大的FIFO通道大小,然后不断的减少FIFO的通道大小,1.当C/RTL协同仿真完成,一般是会显示仿真成功,并且和C仿真的功能匹配;然后检测当不指定FIFO通道大小的情况下,C/RTL协同仿真是否成功。如果你设置的数组大小是N-1,但是你执行了N次访问,这个就会出现问题。查看c/rtl协同仿真是否成功,如果成功,说明依赖的使用设置不正确。确认所有的array的数组大小都说设置正确的,以便匹配所有的样本或者。2.C/RTL仿真如果失败,会爆出仿真失败的警告。原创 2026-04-24 21:02:46 · 35 阅读 · 0 评论 -
HLS流传输说明
1.vivado hls的c/rtl协同仿真不支持在顶层接口中包含hls::strem<>成员的结构体或者类;2.hls::stream在顶层接口上默认为ap_fifo接口,你可以使用阻塞访问,也可以使用非阻塞访问;4.在函数内部的hls::stream<>是作为FIFO来实现的,这个FIFO的depth=2.5.如果在设计的函数中使用hls::stream,并且将其综合到硬件中,那么将会作为内部FIFO。1.在c语言代码中,使用hls::stream<>的行为和无限深度的FIFO比较类似。原创 2026-04-24 21:01:56 · 333 阅读 · 0 评论 -
时延Latency和II
对于流水线设计,仅当设计针对多个传输事务进行仿真时,C/RTL 协同仿真的 II 值才有效。在非pipiline设计中,C/RTL协同仿真的ap_start和ap_done之间的。在流水线设计中,在传输事务完成之前可能存在多次ap_start和ap_ready的。1.HLS的综合报告的II和latency和协同仿真的II和latency不完全。2.c/rtl协同仿真提供的结果会显示仿真数据集的Latency和II;1.协同仿真的II和Latency是基于穿过设计的。四、流水线设计中的II和latency。原创 2026-04-22 23:02:11 · 20 阅读 · 0 评论 -
高层次接口综合要求说明
注意的是hls::stream变量如果不进行约束,默认是ap_fifo接口的,这个是支持非阻塞的,ap_ctrl_none中不能。如果设计指定为使用块级 I/O 协议 ap_ctrl_none 且设计包含采用非阻塞行为的任意 hls::stream 变量,则。条件三:接口包含的数组必须使用ap_hs或者axis接口模式实现流,不能采用默认的ap_fifo接口,第一类:使用ap_ctrl_hs或者ap_ctrl_chain块级接口来综合顶层函数。第二类:使用ap_ctrl_none来综合顶层函数。原创 2026-04-22 22:39:08 · 220 阅读 · 0 评论 -
RTL配置
上述的configuration配置是可以修改打包RTL的IP的名称的。vendor默认为:xilinx.com。Description:功能的名称。原创 2026-04-22 22:14:59 · 15 阅读 · 0 评论 -
resource指令的使用
RTL 综合可使用Resource+latency来,使用多个额外流水线寄存器来帮助改善布局布线后可能导致的时序问题。原创 2026-04-22 22:12:02 · 18 阅读 · 0 评论 -
在 Vivado HLS 导出 RTL 时遇到 “Unrecognized character” 错误
可以尝试使用支持显示所有字符的高级文本编辑器(如 Notepad++、VS Code)打开源文件。在编辑器中,通常有一个“显示所有字符”的功能,能帮助你找出并删除这些“隐藏的捣乱鬼”。当你从PDF、网页或聊天窗口复制代码时,极易带入一些不可见的特殊字符,如零宽空格(Zero Width Space)、不同编码的引号等。如果找不到具体字符,一个简单粗暴的方法是:新建一个空白的源文件,然后手动将原有代码重新输入或通过“粘贴为纯文本”的方式复制进去。这是最常见的原因,但排查的关键在于识别出肉眼看不见的字符。原创 2026-04-22 22:06:42 · 27 阅读 · 0 评论 -
static静态变量在设计中优化
/load,将数据从寄存器中读取出来:change2_reg。2.如果在pipeline流水线实现的函数中遇到了static修饰的变量,那么vivado hls工具优化。通过修改代码,可以确保每次迭代中只有store操作或者只有load操作,这II=1就可以完成了。就比较保守,这个会导致无法对设计进行充分的优化,从而导致启动时间间隔II超过了所需要的时间。1.static静态变量在循环迭代之间会保留数据,这个会导致最终生成寄存器;这个代码中将x存储到store需要一个周期,load到y需要一个周期。原创 2026-04-21 18:12:37 · 110 阅读 · 0 评论 -
高层次综合总结
上述情况可以看出本来这个时候要对RD3的,但是这个时候input data valid拉低了,是无效的,可以看到整个流程全部被挂起了,流程一直在这里挂起等待;如果你使用了带flush的pipeline,当输入数据无效的时候,流程会把之前能读取的操作该执行的流程执行完成。6.ap_stable + axilite约束,是不可综合的,以为ap_stable是在复位之前将数据更改,4.如果只对当前层流水线化,其子层的任意函数不进行流水线化,都会影响最后的流水化性能。目的是为用户定义时序余量;原创 2026-04-21 17:48:32 · 672 阅读 · 0 评论 -
最优化指令的优化说明
LOOP_MERGE 指令,那么 Vivado HLS 会将该指令应用于该循环内的所有子循环,但不会将其应用于该循环本身。2.如果你想即可综合,有不想显示指定depth深度,那么你可以使用const来进行指定,这个是可以综合的,测试是有效的。// Illegal pragma这个是非法的指令depth深度,使用define来指定是不被综合的,会综合报错。2.注意的是,任意指令的效果只对当前层级的函数有用,一般不会对下一个层级的函数有用。这个是可以综合的指定stream的depth的方式!原创 2026-04-21 11:34:48 · 350 阅读 · 0 评论 -
调度视图分析
视图中,灰色块在一个薯条间隔占用的空间,那么就是Delay的值;这里的delay只统计一个clock内占用的时间。delay = 3.04ns,一个时钟周期为5ns,这样delay表示占用一个clock中的多长时间。op latency=1,表示这个操作需要延后一个clock才能出结果。视图中,只要灰色块没有超过一个竖条间隔,那么op latency=0;原创 2026-04-21 10:03:24 · 100 阅读 · 0 评论 -
#pragma HLS PROTOCOL指令优化的使用
pragma HLS PROTOCOL指令优化的使用。原创 2026-04-20 17:58:46 · 48 阅读 · 0 评论 -
接口综合要求
条件四:如果不使用ap_ctrl_hs/ap_ctrl_chain,顶层接口中array数组必须使用ap_hs或者axis接口模式来进行流传输。条件三:如果不使用ap_ctrl_hs/ap_ctrl_chain,那么顶层函数的启动实际间隔为II=1的设计是可行的。条件二:如果不使用ap_ctrl_hs/ap_ctrl_chain,那么设计采用纯组合逻辑来设计也是可行。条件一:必须使用ap_ctrl_hs协议或者ap_ctrl_chain协议修饰端口,是可行的。二、ap_ctrl_none协议的应用。原创 2026-04-20 17:46:14 · 38 阅读 · 0 评论 -
hls流传输设计
无需定义 hls::stream<> 的大小。12.非dataflow区域使用hls::stream是顺序执行的,所以hls::stream需要指定depth能够容纳所有的生产样本。原因:ap_ctrl_none设计后,如果你的hls::stream变量采样非阻塞的,那么数据随意对FIFO进行读写或者传输,那么无法保证输入的数据样本和输出的数据样本一样,这个是违背ap_ctrl_none协议的初衷的,所以这个c/rtl。9.不支持hls::stream流数组,你定义hls::stream数组是不可行的。原创 2026-04-20 17:15:37 · 432 阅读 · 0 评论 -
数组array在高层次综合中应用
1.赛灵思建议(但并不强制)将数组指定为作为含静态 (static) 限定符的内存来实现。3.在设计内部,大小小于 1024 的数组将作为 SRL 来综合。例如,支持固定大小的数组,如:Array[10];作为内存来实现时,内存端口的数量会限制对数据的访问。7.数组作为 FIFO 实现时应留意数组访问的顺序,需要是连续的访问方式;HLS 以 RTL 中的内存来实现数组,还允许使用静态类型的初始化行为。2.顶层函数接口上的数组通常作为外部内存的RTL接口来进行综合实现的。3.数组在C综合期间会出现的问题。原创 2026-04-20 15:14:06 · 20 阅读 · 0 评论 -
数据类型限定符在高层次综合中应用(volatile & const & static & global)
2.并不是只有的static修饰的变量才会被综合为寄存器,即使你没有使用static修饰,vivado hls综合工具有时候也会依据需要自行判断。1.const来修饰的类型是用于只读的,read only或者not change或者unupdate的类型,也就是值初始化后不再改变。1.static修饰的变量,在多次调用函数的时候,第一次调用和第二次调用是保留值的。使用接口配置公开全局变量时,设计中的所有全局变量都作为 I/O 端口公开,包括仅在设计内部访问的全局变量。用于只读,是无法写入的。原创 2026-04-20 14:50:38 · 306 阅读 · 0 评论 -
复合数据类型的高层次综合使用
自定义的类型之间的类型转换,比如一个union中的成员为double和ap_uint<64>,这个是不可综合的,因为。4.hls高层次工具对union的综合只限于原生态的c类型的union,不支持原生态的c语言的数据类型和用户。1.stuct结构体可以作为顶层函数的实参,在进行默认修饰和约束情况下,综合后创建的端口就是结构体内部的。2.在函数内部,union联合体内部不能包含不同类型的指针或者不同类型的数组指针,这个是不可综合的。double是原生态类型,ap_uint<64>是新扩展的类型。原创 2026-04-20 14:06:11 · 333 阅读 · 0 评论 -
硬件高效的C语言设计
hls::stream 中的数据只能按顺序访问。“FPGA高速缓存”并不是指CPU的L1/L2 Cache,而是指FPGA上能支持多路并发访问的片上存储资源,通常是Block RAM (BRAM) 或寄存器阵列。1. Vivado HLS 综合的 C 语言代码将在 FPGA 上执行,提供与 C 语言仿真相同的功能。当然,你并一定总是要将hls::stream当作无限深度的FIFO,虽然这个FIFO是无限深的,但是我可以不用这么深,9. hls::stream模拟的是硬件中常见的FIFO(先进先出)队列。原创 2026-04-20 11:48:30 · 271 阅读 · 0 评论 -
灵活的使用ap_ctlr_none实现功能(三)
一、参考。原创 2026-04-19 20:30:28 · 173 阅读 · 0 评论 -
灵活的使用ap_ctlr_none实现功能(二)
/ 帧首置位 TUSER。hls::stream<axis_pkt_t> &input_stream, // AXI4-Stream 输入(含 TUSER, TLAST)hls::stream<axis_pkt_t> &input_stream, // AXI4-Stream 输入(含 TUSER, TLAST)//typedef ap_axiu<24, 1, 0, 0> axis_pkt_t;原创 2026-04-19 19:39:51 · 272 阅读 · 0 评论 -
typedef ap_axiu<24, 1, 0, 0> axis_pkt_t综合工具报错原因
hls::stream<axis_pkt_t> &input_stream, // AXI4-Stream 输入(含 TUSER, TLAST)//typedef ap_axiu<24, 1, 0, 0> axis_pkt_t;原创 2026-04-19 14:48:10 · 158 阅读 · 0 评论 -
灵活的使用ap_ctlr_none实现功能(一)
/ 24位像素范围。//// 场时序:480 active + 10 front + 2 sync + 33 back = 525 total。// 行时序:640 active + 16 front + 96 sync + 48 back = 800 total。// 行时序:640 active + 16 front + 96 sync + 48 back = 800 total。// 总周期数 = TEST_FRAMES × V_TOTAL × H_TOTAL。原创 2026-04-19 12:53:40 · 319 阅读 · 0 评论 -
高效硬件的C语言设计
8.不要将流水线任务房贷if-else条件中,建议的是将条件语句作为流水线设计的。3.设计中输入端口有可能称为性能的瓶颈,比如输入为bram的单口RAM,那么。5.关于数组的访问,多采用RAM来实现,数组的端口数量对设计的性能有影响。4.关于样本数据复用设计,请一次读取,然后本地缓存后,给内部逻辑复用。2.将输入数据读取采样后,可以将采集到的数据馈送到多路并行路径;单独路径,而不是将流水线认为作为if-else的条件语句的路径。1.良好的设计风格,需要最大限度的减少数据输入的读取时间;原创 2026-04-19 12:45:28 · 212 阅读 · 0 评论 -
可综合的C++类和模板(一)
3.不要对顶层函数只用为c++类或者c++类的成员函数,或者函数模板,不好意思,不可综合。如果虚拟函数在多层继承类的层级中定义,但是仅仅含单一继承的层级,就不可支持综合;4.如果你想对类成员函数进行综合,直接在顶层函数中对类进行实例化,然后调用即可。2.但是你设计的顶层函数没必要玩得很花,老老实实用c语言中最普通的函数。如果在if-else或者for循环中使用类指针,是不可综合的;支持对虚拟函数进行综合;1.hls高层次综合工具是支持对c++类进行综合的。五、支持的c++和不支持可综合的C++原创 2026-04-18 22:55:00 · 132 阅读 · 0 评论
分享