HLS移除假性依赖关系以及改善循环的流水线化

📅 2026/8/2 3:24:20
HLS移除假性依赖关系以及改善循环的流水线化
一、HLS中依赖1.真的依赖2.假的依赖3.真的依赖是否有改造空间提高设计的流水线化4.假的依赖是否有改造空间提高设计的流水线化二、假性依赖的概念依赖的产生有两种第一种是真的实实在在存在依赖关系第二种是本来没有依赖关系但是vivado hls工具由于在构造c代码转rtl的设计中工具编译器是非常保守的策略因为工具不能太积极否则容易造成生成的rtl代码的逻辑存在错误所以一般会采用相对保守的策略来进行代码转换。对于第二种情况由于编译工具无法百分之一百的确定两个操作是否有没有依赖如果没有依赖工具认为有依赖这个时候你可以通过dependence指令告诉编译器你可以通过dependence指令优化了我告诉你了你这个地方不用保守了你可以激进点这个时候编译器就会认为没有依赖进行无依赖优化。当然开发者不要瞎搞如果你瞎搞最终生成的rtl代码就会功能错误这个你不能去怪编译工具了这个是你自己水平有问题你判断错误了不能让工具背锅吧。不管是真依赖还是假的依赖对II都是致命的打击也就是说你设计的吞吐量上不去那么你设计的模块就很low了基本上不满足要求。三、如何识别依赖的真假1.大多数情况vivado hls工具识别不了2.这个时候需要你的代码要比较好的设计清楚尽量你设计没有依赖这样即使工具认为有依赖也可以使用dependence指令来告诉工具可以优化如果你设计本身就有依赖你让工具优化岂不是搞笑四、如何正确的使用dependence指令1.使用dependence的前提是确实没有依赖关系才可以使用否则不能使用#pragma HLS DEPENDENCE variablebuf inter false或者#pragma HLS DEPENDENCE variablebuf intra false或者#pragma HLS DEPENDENCE variablebuf false这三条指令是不一样的一种表示循环内之间没有依赖一种表示循环两次迭代之间没有依赖一种表示怎么样都没有依赖。具体使用三种中哪一种你要看你代码的具体情况五、依赖处理的手段1.关于数组的依赖性处理比较常用的两种方法方法一使用array_partiton来解决方法二使用多个buffer存储同一份数据做到多个buffer备份然后去访问不同的buffer这样防止bank撞车。2.关于变量重命名来解决标量的依赖关系如果一个代码流程中比如一次for循环迭代中一个变量既要写(store),又要读(load)这个依赖确实存在那么你的II》2也就是你的II不可能等于1,那么你这个设计就是失败的那么你需要修改你的代码确保变量temp不能在一个clock中既被store又被load那么你就需要修改代码保证load和store不同时存在那么就不会存在问题了。可以采用中间变量法将store和load隔开从而解决问题也就是采用rtl的cur现态和next次态来解决问题。3.restrict关键字4.循环的展开可以采用unroll,merge,flatten,split等方式来对循环进行处理5.dependence指令的使用需要合理使用不要瞎用