提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
FPGA经验谈系列文章——逻辑级数
前言
逻辑级数概念
逻辑级数影响什么
总结
前言
在FPGA经验谈系列文章中,我说道我的第一份工作的内容:
在第一家公司,使用FPGA主要是进行算法实现,要求的主频不高,资源一般也不太受限制。难点在于算法的理解,性能的提升和以及和软件的配合等
时钟不会超过124M,只有一部分逻辑是124M,大部分逻辑还只有62M。Artix-7的片子,资源充足
因此,基本不用考虑出现时序违例,甚至都没有什么跨时钟域的场景,基本是代码随便写。
在第二家公司初步接触到了高速接口的内容,时钟也到了200M,资源也比较紧张,因此经常会出现时序不过的情况,但在当时我完全不知道如何去处理这些问题。幸运的是,在第二家公司有一个曾经在华为工作十来年的大佬,大佬跟我提到了一个逻辑级数的概念,也就是这么一提点,为我打开了一扇进阶的大门。搞FPGA这么多年,我一直觉得,自从心中开始有了“逻辑级数”这个概念,就像学武功突然打通了任督二脉的感觉。
逻辑级数概念
逻辑级数简单说就是一个触发器到另一个触发器之间经过了多少组合逻辑器件。
我们以一个简单的代码来进行讲解:
module test(
input i_clk ,
input [1:0] a ,
input [1:0] b ,
output reg sum
);
reg [1:0]a_reg;
reg [1:0]b_reg;
always @(posedge i_clk)
begin
a_reg <= a;
b_reg <= b;
end
always @(posedge i_clk)
sum <= (&a_reg) | (|b_reg);
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
这是其综合的原理图:
我们选出一条路径来进行分析,标红的路径。从触发器出发经过了一个LUT4,然后输出到达一个触发器。那么这条路径的逻辑级数是2,如果是直接触发器到触发器,那么逻辑级数是1。实际上在这段代码中一共有4条路径,其逻辑级数都是2.
好了,我们现在知道逻辑级数的概念了,那又能怎么样呢,综合是工具进行综合的,代码怎么去优化呢?
我们在举一个例子:
module test(
input i_clk ,
input [31:0] a ,
input [31:0] b ,
input [31:0] c ,
input [31:0] d ,
output reg [31:0] sum
);
reg [31:0]a_reg;
reg [31:0]b_reg;
reg [31:0]c_reg;
reg [31:0]d_reg;
always @(posedge i_clk)
begin
a_reg <= a;
b_reg <= b;
c_reg <= c;
d_reg <= d;
end
reg [31:0]sum_ab;
reg [31:0]sum_cd;
always @(posedge i_clk)
begin
sum_ab <= a_reg + b_reg;
sum_cd <= c_reg + d_reg;
sum <= sum_ab + sum_cd;
end
endmodule
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
密密麻麻太多了,这里我们用一条tcl指令让vivado帮助我们进行统计
report_design_analysis -logic_level_distribution -logic_level_dist_paths 5000 -name design_analysis_prePlace
1
反馈的结果是:
也就是说逻辑级数为6的路径有24条。
下面我们换一种写法:
module test(
input i_clk ,
input [31:0] a ,
input [31:0] b ,
input [31:0] c ,
input [31:0] d ,
output reg [31:0] sum
);
reg [31:0]a_reg;
reg [31:0]b_reg;
reg [31:0]c_reg;
reg [31:0]d_reg;
always @(posedge i_clk)
begin
a_reg <= a;
b_reg <= b;
c_reg <= c;
d_reg <= d;
end
always @(posedge i_clk)
begin
sum <= a_reg + b_reg + c_reg + d_reg;
end
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
这样写还有逻辑级数为7的路径。
随便点击一条逻辑级数为7看一下,如图所示
以前我很早就从一些博文中知道,写verilog多写时序逻辑,少写组合逻辑。一直不是到是什么道理,现在也就可以理解一下了。
逻辑级数影响什么
1、逻辑级数越长,数据从上一个触发器到下一个触发器的延时有可能会变长,每个LUT,CARRY8经过一下都需要时间,以及中间连着的线也要时间。这样你的最高时钟频率就有可能会降低了。要想整个设计跑更高的频率,那么这方面还是要花点心思。
2、逻辑级数增加会增加资源的消耗,同时使链路延迟更大。这点要根据第一点进行权衡设计。
总结
为什么我认为“自从心中开始有了“逻辑级数”这个概念,就像学武功突然打通了任督二脉的感觉。”呢?
心中有逻辑级数之后:
1、 自然就会考虑自己写的这段代码综合后逻辑级数到底有多少,自然而然就会“心中有电路”。
2、 想要自己设计的代码能够跑更高的主频,也需要逻辑级数尽可能的少
3、 进行时序报表分析的时候也需要逻辑级数的概念
因此理解了逻辑级数的理解实际上是初级FPGA设计者进阶的一个标志。
那是不是所有的设计都是逻辑级数越少越好呢?也不是,追求逻辑级数少,是建立在增加资源的基础上。如果你的时钟频率很低,则逻辑级数有十多级可能都无所谓。
因此逻辑级数的控制,在于你的时钟频率,资源利用的一个权衡。很多时候也不能完全做到最优,但只要设计代码时心中一直有这个思想,那么代码的质量肯定不会太差。
以上关于逻辑级数一个简单的例子,实际上我们要自己摸索一下比较常用的代码块的逻辑级数做到心中有数;对于比较大型的工程,往往在设计结束之后还要对整个工程逻辑级数进行分析,看看还有那些链路逻辑级数过长,从而影响时序通过。
————————————————
版权声明:本文为CSDN博主「十年老鸟」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/gzy0506/article/details/121527478