前言
在刚开始接触进行前端RTL代码设计的时候我遇到一个问题,我不是很清楚我写下的每一句代码对应的逻辑深度与cell count值,这令我很难精准的在设计初期进行逻辑规划和方案优化。
所以呢在我初步具备单独综合的能力之后,就像为之前的自己汇总一下各种操作的逻辑深度和cell count,先从乘法器开始。
过程
简单说就是综合这样一段代码,提取timing和cell数,然后反复修改参数~
module test #(
parameter WIDTH = 32
)(
input clk,
input rst_n,
input [WIDTH -1:0] in_data1,
input [WIDTH -1:0] in_data2,
output [WIDTH -1:0] out_data
);
assign out_data = in_data1 * in_data2;
endmodule
timing我并不分关心时序因为这个跟库、约束、工艺等方方面面关联太多了,我需要的是逻辑深度如下面这就是40级逻辑深度:
同样看area也没有意义,只需要统计cell cout就是下面这个值:
统计结果
C = A * B
输入位宽1 | 输入位宽2 | 输出位宽 | 逻辑深度 | cell count |
32 | 32 | 64 | 56 | 3056 |
32 | 32 | 32 | 38 | 1533 |
16 | 16 | 32 | 31 | 758 |
16 | 16 | 16 | 20 | 362 |
8 | 8 | 16 | 22 | 231 |
8 | 8 | 8 | 16 | 107 |
4 | 4 | 8 | 13 | 59 |
4 | 4 | 4 | 5 | 26 |