0.代码对应的底层调用
if-else的判定条件需要LUT实现,累加器的进位需要靠CARRY实现。
1.逻辑级数的概念
简单来讲就是组合逻辑串联的个数
逻辑级数查询命令
report_design_analysis -logic_level_distribution
-logic_level_dist_paths 5000 -name design_analysis_prePlace
2.逻辑级数优化
第一步优化----拆分大位宽累加器
将32位的计数器拆分成两个16位的计数器
通过这一步我们可以发现:
1、CARRY4是4输入的,如果累加器或计数器的位宽每超过4就会多消耗一个CARRY4:
比如:例1中,计数器定义32bit,最后消耗了8个进位链;而例2优化成16bit后,就只消耗4个进位链了。
2、正常情况下,布线延时与逻辑延时整体是接近1:1,当降低逻辑级数,减少了逻辑延时,也相应的减少了布线延时
第二步优化----简化if-else判定条件
if-else 的逻辑判定条件使用的是组合逻辑。
if-else 判定条件涉及多位宽数据对比,以及多条件嵌套都会增加实现该判定功能的组合逻辑复杂度。
对于大位宽的判定,可以插入flag寄存器,再用flag作为判断条件进行if-else判断。
判定条件如果是 a_cnt == b_cnt,可以做成flag
a_cnt == 0,可以做成|a_cnt;同理全f 可以做成&a_cnt
第三步优化----拆分赋值表达式(面积换速度)
例如:S = A + B+ C ;
可以设计成:
S1 = A+B ;
S = S1+C 。
参考
逻辑级数与逻辑延时优化实战