FPGA之逻辑级数

前言

        为什么需要介绍逻辑级数呢,因为只有知道了逻辑级数的存在你才知道怎么去优化自己的代码。

一、逻辑级数

        什么是逻辑级数?所谓逻辑级数就是指路径起点和重点之间的组合逻辑单元个数,这些逻辑单元可能是查找表(LUT1、LUT2、LUT4、LUT5、LUT6)、进位链(Carry4,进位链:进位溢出,为了连接一个过大位宽累加器而存在的逻辑工具)、数据选择器(F7MUX/F8MUX/F9MUX)、IBUF等。

       在Vivado时序报告中逻辑级数为中间的组合逻辑器件个数加一个触发器,可以看见下图所示,中间组合逻辑器件为8个,再加一个触发器,逻辑级数为9。

        在时序报告中也确实如此。如图所示:

        若不确定也可以看数据路径(Data Path),看紫色的字,便是数据经过的逻辑级数。

二、逻辑级数查找

        在TCL控制台输入如下命令即可查看逻辑级数:

report_design_analysis -logic_level_distribution -logic_level_dist_paths 5000 -name design_analysis_prePlace

         但是输入命令前需要打开synthesized design或者implemented design

        弹出如下操作框,然后左键级数最大的数字,选择Report Design Analysis on Timing Paths

        然后2条最长级数路径就像下图所示显示出来,左下方还可以再切换会最长级数报告

        如果想看这条路径综合出来就选中路径,然后右键选择Schematic;

        但是建议直接看时序报告,里面什么都有,依旧是选择路径然后鼠标右键选择Veiw Path Report

三、为什么要在乎逻辑级数

        1、逻辑级数越大,数据从上一个触发器到下一个触发器的延时会变长,经过LUT、CARRY4,以及中间的连线都需要时间;

        2、逻辑级数增加生成电路消耗的资源也增加。

        那么问题来了,多大的逻辑级数才算逻辑过大呢?通常,一个“LUT+一根走线”的延迟为0.5ns(经验值,适用于Xilinx7系列FPGA和UltraScale/UltraScale+FPGA),假定寄存器时钟周期为T,那么该路径所能承载的最大逻辑级数为T/0.5,也就是2T。如果逻辑级数大于2T,而时序未能收敛,就可以怀疑时序违例跟逻辑级数较高有关。

        这里我就举个逻辑级数过大带来的时序违规的例子,之前做DDR的AXI4协议测试的时候图方便将512bit的写数据自动加1,这就导致逻辑级数过大导致时序不收敛。

  过大的计数器位宽会带来过多的进位链,从而造成过多的逻辑级数;尽量避免大位宽计数器,250M以内的设计,最好不要超过16bits;4bits位宽会占用一个进位链;下图便是512bit计数器综合出来的布线情况。 

        对于代码中常见代码产生的逻辑级数可以去公众号上去搜索:FPGA十年老鸟,他对逻辑级数做了一个非常清楚的介绍,是我这几年看过总结得最好的一篇文章。

四、代码优化

        如果你有了逻辑级数这个慨念你就能知道怎么去优化自己的代码,怎么去评判代码质量。

4.1 加法器拆分

        我们可以看到Vivado中还提供了加法器的IP核,加法器这么简单都要有IP核呢,其实这个加法器IP核就是为了解决大位宽时逻辑级数过大这个问题的通过设置流水线级数可以拆分逻辑。同时根据IP的实现思路,我们也可以手动对代码进行逻辑拆分。拆分加法器最简单的思路就是二分法流水线,即如果对于32bit加法器,首先想到拆分为两个16bit加法器,中间插入寄存器

        如果将两个32bit数据直接相加逻辑级数会很大,如图所示:

        但是如果将32bit加法器拆分成连个16bit加法器,中间插入一个寄存器,虽然消耗的资源增加,但是逻辑级数缺减少了,如图所示:  

         

        总结:通过拆分,32bit加法器多了一个时钟的延迟,多了33个触发器(FF),但逻辑级数从10降到了7,如果允许更多时钟的延迟并且使用更多的FF,则逻辑级数还能够更低。这就是所谓的以面积换取速度,这里的速度指整个工程稳定运行所能够达到的最高时钟频率,它不仅和FPGA内部各个寄存器的建立时间余量、保持时间余量有关,也和FPGA与外部芯片接口信号的时序余量有关。     

4.2比较器拆分

        比较器的拆分比较简单,只要将大位宽的比较器拆分成几个小位宽的比较器即可。比如当位宽为64bit的相等比较器,逻辑层级为9级,可以拆成4个16bit的相等比较器,则逻辑级数降到3。

        下图为64bit比较器直接比较产生的逻辑级数和消耗的资源:

        现在将64bit比较器拆成4个16bit的比较器,逻辑级数直接下降到4。

        后续很多例子就不再展开了,写这篇博客的目的就是想让各位在学FPGA的同道之人有一个逻辑级数的概念,关于逻辑级数的总结FPGA十年老鸟已经总结的很好了,我再怎么写也不过跳梁小丑罢了。

 

 

### 如何降低FPGA设计中的逻辑级数过高问题 为了有效地减少FPGA设计中的逻辑级数,从而改善时序收敛并提升最大工作频率(Fmax),可以从多个方面入手进行优化: #### 1. 流水线化设计 引入流水线阶段可以显著缩短关键路径上的延迟。通过在数据流的关键位置插入寄存器,将原本复杂的运算过程分解成若干较小的操作单元,使得每个周期内完成的任务更加简单,进而减少了单次操作所需的门延时数量。 ```verilog // 原始代码片段:无流水线 always @(posedge clk or negedge rst_n) begin if (!rst_n) result <= 'b0; else result <= a * b + c; // 高逻辑级数表达式 end // 改进后的流水线版本 reg [WIDTH-1:0] stage1_reg; always @(posedge clk or negedge rst_n) begin if (!rst_n) begin stage1_reg <= 'b0; result <= 'b0; end else begin stage1_reg <= a * b; // 第一阶段计算乘法部分 result <= stage1_reg + c; // 第二阶段累加结果 end end ``` #### 2. 减少组合逻辑复杂度 简化组合逻辑有助于直接削减逻辑层次的数量。具体措施包括但不限于: - **拆分大函数**:对于特别庞大的算术或布尔表达式,尝试将其分割为更小的部分逐步求解。 - **利用内置原语/宏功能模块**:尽可能调用FPGA厂商提供的专用组件(如DSP slice),它们经过高度优化,在执行特定任务时往往能提供更低的延迟特性[^4]。 #### 3. 调整资源分配策略 合理规划LUTs、FFs以及BRAM/DSP blocks等各类物理资源的应用场景也至关重要。当面临较高的逻辑密度需求时,应优先考虑采用分布式存储器代替传统RAM结构;而对于涉及大量数值计算的情形,则推荐充分利用DSP slices来加速浮点数或定点数运算,同时保持较低的功耗水平。 #### 4. 寄存器配平与重定时 通过对整个系统的静态时序分析(STA),识别出那些存在明显瓶颈的地方,并针对性地调整相邻节点间的相对距离——即所谓的“寄存器配平”。此外,“重定时”技术允许动态迁移某些寄存器的位置,以便更好地平衡前后端之间的负载差异,最终达到全局最优的效果。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值