本项目为数字集成电路设计基于 SMIC 0.18 μm 工艺,完成了 16 点基-4 FFT 算法 的芯片级前后端全流程设计,涵盖 RTL 建模、功能仿真、逻辑综合(DC)与物理实现(ICC)。最终芯片工作频率达到 135 MHz,面积 4.6953 mm²,单次 FFT 能耗 5.25×10⁻⁶ mJ。文章末尾有芯片设计源码与项目其他文件,包含:前端RTL源码、中端DC源码脚本、后端ICC源码脚本、项目报告、参考文件等。
一、设计规范简介
1.1 功能描述
本次课程设计的核心目标是实现一个 高能效的快速傅里叶变换(FFT)电路,具体规格如下:
- 算法:16 点基-4 FFT 算法
- 输入数据:实部与虚部均为 17 bit(1 bit 符号位 + 8 bit 整数位 + 8 bit 小数位)
- 旋转因子:实部与虚部均为 8 bit(1 bit 符号位 + 7 bit 数据位)
- 数据格式:定点数表示,如图 1 所示
图 1 16 点基-4 FFT 蝶形运算原理图
图 2 数据表示方式(17 bit 输入 / 8 bit 旋转因子)
运算数据的实部虚部均为17 bit
而旋转因子的实部与虚部为8 bit
1.2 性能指标
| 评价指标 | 具体数值 |
|---|---|
| 完成一次 16 点 FFT 运算的能耗 | 5.25118208 × 10⁻⁶ mJ |
| 单位面积功耗时间 FFT 操作次数 | 4.1987688 × 10⁴ 次/(mm²·mW·s) |
| 工作频率 | 135.135135 MHz |
| 面积开销 | 4.695300 mm² |
能耗计算
单次 FFT 能耗 = 每秒能耗 / 每秒 FFT 运算次数
= 44.3512 mW/s / (1 / (16 × 7.4 ns))
= 5.251182 × 10⁻⁶ mJ单位面积功耗时间操作次数
单位面积功耗时间 FFT 操作次数 = 每秒 16 点 FFT 运算次数 / (面积 × 功耗 × 时间)
= (1 / (16 × 7.4 ns)) / (4.535456 mm² × 44.3512 mW × 1 s)
= 4.1987688 × 10⁴ 次/(mm²·mW·s)二、电路性能分析与结构设计
2.1 性能估算
面积开销
芯片共有 90 个管脚,布局尺寸计算如下:
- 长:76 μm × 23 + 210 μm × 2 = 2168 μm = 2.168 mm
- 宽:76 μm × 22 + 210 μm × 2 = 2092 μm = 2.092 mm
总面积:2.168 mm × 2.092 mm = 4.535456 mm²

运算性能
每秒可完成 FFT 运算次数 = 1 s / (16 × 7.4 ns) = 8.445946 × 10⁶ 次吞吐率
芯片采用 串行输入输出 方式,每 16 个周期完成一次信号输入,从输入第 13 个信号时开始蝶形运算,经过 8 个周期完成运算,再经过 16 个周期输出:
- 单次运算周期:13 + 8 + 16 = 37 个周期
- 单次运算吞吐率:1 / (37 × 7.4 ns) = 3.65 × 10⁶ 次/秒
由于采用了 三级流水线 架构,在连续运算足够多的情况下:
- 流水运算周期:16 个周期(每周期输出一个结果)
- 流水吞吐率:1 / (16 × 7.4 ns) = 8.45 × 10⁶ 次/秒
带宽
存储器时钟频率和数据输入速度保持恒定,峰值带宽与平均带宽相同:
带宽 = 17 bit × 2(实部+虚部) × 135.135135 MHz = 4.595 Gbps工作频率
工作频率 = 1 / 时钟周期 = 1 / 7.4 ns = 135.135135 MHz2.2 硬件结构图
图 3 电路硬件结构图
整个电路分为以下模块:
| 模块名称 | 文件名 | 模块类型 | 功能描述 |
|---|---|---|---|
| 控制模块 | ctrl | 时序逻辑 | 控制电路中各个模块的运行时序 |
| 串转并模块 | s_p | 时序逻辑 | 将串行输入的数据整合为并行并改变顺序 |
| 复选器 | mux | 时序逻辑 | 按照 FFT 级数选择进入运算模块的数据 |
| 中转存储模块 | reg1 | 时序逻辑 | 存储并转发两级 FFT 运算间的运算数据 |
| 运算模块(蝶形运算) | butterfly | 组合逻辑 | 进行四输入蝶形运算 |
| 乘法器 | multi16 | 组合逻辑 | 计算数据与旋转因子间的乘法 |
| 并转串模块 | p_s | 时序逻辑 | 将并行输出的数据分解为串行并倒位序 |
2.3 流水线时序设计
| 时钟周期 | 1-16 | 17-21 | 22-29 | 30-37 |
|---|---|---|---|---|
| input | 第 N 组输入数据到 REG1 | 第 N+1 组输入数据到 REG1 | — | — |
| calculate | — | 两级蝶形运算 | 两级蝶形运算 | — |
| output | — | — | 第 N-1 组从 REG3 输出 | 第 N 组从 REG3 输出 |
2.4 时序过程

三、RTL 模型与仿真验证
3.1 验证方法
FFT 芯片的验证包括两部分:
- 输出结果验证:通过 testbench 输入数据,将仿真输出与理论正确结果对比
- 流水线验证:一次输入多组数据,观察电路是否能流水式执行
3.2 验证平台搭建
在 ModelSim SE-64 10.1c 中,将所有模块的 Verilog 代码通过 top 文件连接,撰写 testbench 从指定文本文件读入输入数据并进行计算。
3.3 仿真验证结果
3.3.1 功能点验证
取三组输入作为测试向量,验证输出结果正确性与流水线功能。
图 4 测试波形(流水线时序验证)
从波形可见,p_s模块数据按预期工作:每周期进入 4 个数据,逐个输出,上一组数据输出完毕后下一周期立即输出下一组,流水式执行衔接良好。
3.3.2 第一组数据验证对比
| X[k] | 理论输出(实部) | 实际输出(实部) | 理论输出(虚部) | 实际输出(虚部) |
|---|---|---|---|---|
| X[0] | 0_00010010_00000000 | 0_00010001_11001000 | 0_00010010_00000000 | 0_00010001_10111000 |
| X[1] | 0_00000101_01101110 | 0_00000101_01011110 | 1_11110000_10111010 | 1_11110000_11100101 |
| X[2] | 1_11110110_00000000 | 1_11110110_00100110 | 0_00000100_00111110 | 0_00000100_00101101 |
| X[3] | 0_00000010_00001101 | 0_00000010_00000011 | 0_00001010_01011100 | 0_00001010_00111100 |
| X[4] | 0_00001000_00000000 | 0_00000111_11101100 | 1_11110110_00000000 | 1_11110110_00101000 |
| X[5] | 1_11110110_00110000 | 1_11110111_01001101 | 0_00000011_10010000 | 0_00000011_10000100 |
| X[6] | 0_00000011_00101011 | 0_00000011_00011100 | 0_00000010_11100000 | 0_00000001_01100101 |
| X[7] | 0_00000000_01101101 | 0_00000000_01110100 | 0_00000010_11100000 | 0_00000010_11100001 |
| X[8] | 0_00000010_00000000 | 0_00000010_00001000 | 1_11111110_00000000 | 1_11111110_00001000 |
| X[9] | 0_00000101_11100001 | 0_00000101_11010010 | 1_11111111_11110101 | 1_11111111_11110111 |
| X[10] | 1_11110110_00000000 | 1_11110110_00100110 | 1_11111011_11000001 | 1_11111011_11010001 |
| X[11] | 0_00001001_01000010 | 0_00001001_00100111 | 0_00000100_11110011 | 0_00000100_11100010 |
| X[12] | 1_11111100_00000000 | 1_11111100_00011100 | 1_11111010_00000000 | 1_11111010_00011000 |
| X[13] | 1_11111101_01111111 | 1_11111101_10001011 | 0_00000011_10111111 | 0_00000011_10110000 |
| X[14] | 0_00001000_11010100 | 0_00001000_10110000 | 1_11111110_10010101 | 1_11111110_10011101 |
| X[15] | 1_11110100_01000010 | 1_11110100_01101010 | 1_11110101_11001111 | 1_11110101_11110001 |
图 5 Transcript 输出
通过对比可知,实际输出与理论输出的实部与虚部均十分接近,在误差范围内可认为相等(存在数据位宽限制等不可避免的截断误差)。第二组、第三组数据经同样验证,结果一致。
3.3.3 测试向量
第一组测试向量:
0000000010000000000000000000000000
0000000000000000000000000000000000
0000000010000000000000000000000000
0000000000000000000000000000000000
0000000110000000000000000000000000
0000000100000000000000010000000000
0000000010000000000000100000000000
0000000100000000000000001000000000
0000000010000000000000000000000000
0000000100000000000000010000000000
0000000010000000000000000000000000
0000000000000000000000000000000000
0000000010000000000000000000000000
0000000010000000000000000000000000
0000000010000000000000000000000000
0000000010000000000000000000000000第二组测试向量: 全 1 序列(16 个相同数据)
第三组测试向量: 仅第一个数据为 1,其余为 0
3.3.4 仿真性能统计
- ✅ 成功实现 16 点 FFT 算法,输出结果与理论值一致
- ✅ 每周期输入一个数据,每周期输出一个数据
- ✅ 成功实现流水式运行
- ✅ 多次测试输出结果稳定,未出现错误
四、逻辑综合策略与结果
4.1 逻辑综合流程
使用 Synopsys Design Compiler (DC) 进行逻辑综合,主要流程:
指定库文件 → 读入设计(转GTECH) → 定义环境 → 设计约束 → 编译策略 → 综合优化 → 存储网表
参数设置
| 参数 | 数值 |
|---|---|
| 工艺 | SMIC 0.18 μm |
| 时钟周期 | 7.4 ns |
| 输入输出延迟 | 3.7 ns |
| 工作电压 | 1.62 V |
| 运行温度 | 125 ℃ |
| 面积约束 | 0(无约束) |
| 互连模型 | balanced_tree |
| 时钟延时 | 4.3 ns |
| 不确定时钟 | 0.5 ns |
| 过渡时钟 | 0.2 ns |
| 端口最大过渡 | 3 ns |
4.2 逻辑综合结果
时序结果
| 项目 | 时间 (ns) |
|---|---|
| clock clk (rise edge) | 7.40 |
| clock network delay (ideal) | 4.30 |
| clock uncertainty | -0.50 |
| clk slack (MET) | 0.00 |
7.4 ns 时钟符合设计要求,换算工作频率约为 135 MHz。
面积结果
| 项目 | 数量 | 项目 | 面积 (μm²) |
|---|---|---|---|
| Ports | 70 | Combinational area | 1,483,546.41 |
| Nets | 140 | Non-combinational area | 153,599.85 |
| Cells | 71 | Net Interconnect area | 2,089,790.57 |
| References | 3 | Total Area | 3,726,936.83 |
功耗结果
| 项目 | 数值 |
|---|---|
| Global Operating Voltage | 1.62 V |
| Cell Internal Power | 756.0848 mW |
| Net Switching Power | 375.6310 mW |
| Total Dynamic Power | 1.1317 W |
| Cell Leakage Power | 28.5281 μW |
资源使用
| 项目 | 数量 |
|---|---|
| Hierarchical Cell | 85 个 |
| Hierarchical Port | 5,373 个 |
| Leaf Cell | 16,473 个 |
| Buf/Inv Cell | 2,815 个 |
| Total Number of Nets | 18,037 个 |
设计违例
✅ 电路逻辑综合结果中无设计违例
五、物理实现与结果分析
5.1 ICC 设计步骤
使用 Synopsys IC Compiler (ICC) 进行物理实现,分为四个阶段:
5.1.1 数据设定 (Data Setup)
读入逻辑和时序库文件、SDC 约束文件、门级网表,以及 IO 物理库文件、TF 工艺文件、TLU+ 文件等物理数据。
5.1.2 布局规划 (Floorplanning)
- 定义所有管脚(输入输出、时钟、初始信号)及电源组
- 添加电源环,生成基本布局规划
- 尝试标准单元虚拟布局(
create_fp_placement -timing_driven) - 分析拥塞(面积利用率设置不高,拥塞问题较少)
- 形成电源网络,分析时序,调整电源管脚位置使电压降 < 10%
5.1.3 布局 (Placement)
- 遵循 NDR 规则,特殊信号线(如 clock)加宽、加大间距
- 执行
place_opt进行布局 - 布局优化(解决建立时间违例)
- 拥塞分析与优化
5.1.4 时钟树综合 (CTS)
- 生成时钟网络,加入 buffer 解决负载和 slew time 问题
- 执行
clock_opt - 单时钟同步设计,CTS 工作较简单
5.1.5 布线 (Routing)
- 全局布线 → 轨道分配 → DRC 修复
- 先对时钟布线(
route_group -all_clock_nets) - 解决 verify_lvs 报错(查阅资料后确认无实质影响)
- 解决虚拟机内存不足导致的闪退问题(清理空间后完成)
5.2 ICC 设计结果
5.2.1 芯片概貌
图 6 芯片概貌
- 顶部和底部各 22 个管脚
- 左边和右边各 23 个管脚
- 共 10 组电源管脚:4 组为管脚供电(分列四周),6 组为内核供电(上下各 1 组,左右各 2 组)
5.2.2 时序结果
| 阶段 | input (ns) | output (ns) | clk (ns) |
|---|---|---|---|
| data_setup | — | — | 0.48 |
| data_setup_zic | 1.43 | 0.48 | 1.19 |
| floorplan | 0.95 | -1.02 | -1.39 |
| placement | 1.01 | 0.59 | 0.19 |
| cts_only_psyn | 1.26 | 0.82 | 0.62 |
| cts_only_cts | 1.26 | 0.83 | 0.36 |
| route_initial | 1.35 | 0.88 | 0.65 |
| route_final | 1.35 | 0.85 | 0.01 |
5.2.3 面积结果
图 7 芯片面积测量
| 项目 | 面积或长度 |
| Combinational Area | 1,477,888.21 μm² |
| Non-combinational Area | 154,248.50 μm² |
| Net Area | 0.00 μm² |
| Net X Length | 620,954.62 nm |
| Net Y Length | 666,869.44 nm |
| Cell Area | 1,632,136.71 μm² |
| Design Area | 1,632,136.71 μm² |
| Net Length | 1,287,824.00 nm |
| Total Area | 4,695,300.72 μm² |
芯片尺寸:2092.38 μm × 2244.00 μm
5.2.4 功耗结果
| 项目 | 数值 |
|---|---|
| Global Operating Voltage | 1.62 V |
| Cell Internal Power | 33.6445 mW |
| Net Switching Power | 12.7067 mW |
| Total Dynamic Power | 44.3512 mW |
| Cell Leakage Power | 26.0446 μW |
5.2.5 芯片压降
图 8 芯片压降分析
- 工作电压:1.62 V
- 最大压降:129.6 mV
- 压降比例:129.6 / 1620 = 8% < 10%,符合设计要求
5.2.6 拥塞分析
图 9 拥塞分析(Placement / Detail Route / Track Assignment / Global Route)
由于芯片面积较大,面积利用率设置不高,拥塞问题较少,顺利解决。
5.2.7 资源使用
| 项目 | 数量或利用率 |
|---|---|
| Module Cells | 16,240 个 |
| Pins | 91,614 个 |
| IO Pad Cells | 90 个 |
| IO Pins | 70 个 |
| Nets | 18,151 个 |
| Average Pins Per Net | 3.0535 个 |
| Total Std Cell Area | 514,936.70 μm² |
| Total Pad Cell Area | 1,612,800.00 μm² |
| Core Size | 1612.38 × 1764.00 = 2,844,238.32 μm² |
| Pad Core Size | 1672.38 × 1824.00 = 3,050,421.12 μm² |
| Chip Size | 2092.38 × 2244.00 = 4,695,300.72 μm² |
| Std cells utilization | 18.10% |
| Cell/Core Ratio | 18.10% |
| Cell/Chip Ratio | 45.32% |
| Number of Cell Rows | 350 |
图 10 单元密度分布
5.2.8 设计违例
✅ 最终设计无设计违例
六、设计总结
6.1 遇到的主要问题
- 管脚数量过多,芯片面积过大
- 电路计算结果不正确
- 时序模块数据传输不同步,拖慢运算速度
- 芯片工作频率过低
- 芯片电压降问题
6.2 相应的解决思路
| 问题 | 解决方案 |
|---|---|
| 管脚过多、面积过大 | 采用串并转换减少管脚;改用基-4 FFT 算法并复用蝶形运算模块减小面积 |
| 计算结果不正确 | 手动计算关键中间数据,逐一比对各模块输入输出,逐个修复 bug |
| 数据传输不同步 | 在时序电路传输标志信号的同时,用组合逻辑电路传输数据,避免同步问题 |
| 工作频率过低 | 重写乘法器:将乘法运算改为组合逻辑状态机判断旋转因子,采用移位方法完成乘法,频率从 82 MHz 提升至 135 MHz |
| 电压降问题 | 增加供电管脚数量并调整位置,最大压降控制在 8%(何卫锋老师指导) |
6.3 关键优化点
乘法器优化(频率提升核心)
优化前:
assign mul = in_17bit[16:0] * in_8bit[7:0]; // 直接乘法,延迟大优化后:
always @ (in_17bit or in_8bit) begin
case (in_8bit)
8'b00000000: neg_mul = 25'b0;
8'b01111111: neg_mul = (in_17bit << 7);
// ... 其他旋转因子用移位实现
endcase
end通过 set_flatten true 和 compile –map high 策略,将工作频率从 82 MHz 大幅提升至 135 MHz。
七、参考资料
[1] FFT 算法相关教材与文献
[2] Synopsys Design Compiler 用户手册
[3] Synopsys IC Compiler 用户手册
[4] SMIC 0.18 μm 工艺设计套件文档
项目成果总结: 本项目完整实践了数字 IC 设计的前后端全流程,从 RTL 编码、功能仿真、逻辑综合到物理实现,成功将 16 点基-4 FFT 算法芯片化。通过架构优化(串并转换、流水线)、算法优化(基-4 复用)、电路优化(组合逻辑移位乘法器),在 SMIC 0.18 μm 工艺下实现了 135 MHz 工作频率、4.70 mm² 面积、5.25×10⁻⁶ mJ 单次运算能耗的优异性能指标。
八、项目工程下载(源码、文档和参考文献)
包含:前端RTL源码、中端DC源码脚本、后端ICC源码脚本、项目报告、参考文件等










