1. 项目背景与核心架构
上周整理硬盘时意外发现了这个尘封已久的10/100Mbps以太网PHY项目,这是笔者入行第二年完成的工业级以太网物理层芯片设计。项目采用Cadence全套工具链开发,包含GPDK90nm和GPDK180nm两个工艺版本,从电路设计到版图实现完整覆盖。作为典型的10BASE-T系统,其核心功能是将MAC层的数字信号转换为适合双绞线传输的模拟信号,并实现时钟恢复、信号均衡等关键功能。
这个项目的独特之处在于其完整的系统级设计考量。不同于学术研究中的模块级demo,本项目需要考虑实际工业环境中的电源噪声、工艺偏差、温度漂移等现实因素。PHY芯片包含两个独立锁相环(分别用于发送时钟生成和接收时钟恢复)、模拟均衡器、6位Flash ADC、带trim功能的带隙基准、LDO稳压器等23个功能模块,在90nm工艺下芯片面积仅2.3mm²,180nm版本为4.1mm²。
2. 关键模块设计与实现
2.1 双锁相环时钟系统
时钟系统采用主从式双PLL架构,这是本项目最重要的设计决策之一。主PLL基于环形振荡器结构,为发送端提供125MHz的精准时钟;从PLL采用LC振荡器,专门用于接收端时钟恢复。这种分离设计有效避免了发送时钟对接收路径的干扰。
在90nm工艺下,我们实现了-122dBc/Hz@1MHz的相位噪声性能,关键优化点包括:
- 采用差分控制结构的电荷泵,将电流失配控制在0.5%以内
- 使用MOS电容阵列实现精细的频率调谐,步进精度达0.1%
- 环路滤波器采用主动RC结构,带宽设置为300kHz
重要提示:接收端PLL必须引入二级锁相环用于时钟数据恢复(CDR),这是解决长距离传输时时钟漂移问题的关键。我们采用数字PFD(相位频率检测器)配合模拟VCO的混合架构,在Verilog代码中实现的数字PFD核心逻辑如下:
verilog复制module pfd_core(
input wire ref_clk, // 参考时钟
input wire fb_clk, // 反馈时钟
input wire rst_n, // 异步复位
output reg up, // 充电控制
output reg down // 放电控制
);
reg ref_d1, fb_d1; // 延迟寄存器
always @(posedge ref_clk or negedge rst_n) begin
if(!rst_n) begin
ref_d1 <= 1'b0;
up <= 1'b0;
end else begin
ref_d1 <= fb_clk;
up <= ref_d1 & ~fb_clk; // 检测参考时钟超前
end
end
always @(posedge fb_clk or negedge rst_n) begin
if(!rst_n) begin
fb_d1 <= 1'b0;
down <= 1'b0;
end else begin
fb_d1 <= ref_clk;
down <= fb_d1 & ~ref_clk; // 检测反馈时钟超前
end
end
endmodule
2.2 自适应模拟均衡器
针对双绞线传输的高频衰减问题,我们设计了连续时间线性均衡器(CTLE)。该电路采用两级运放结构,第一级提供高频增益提升,第二级实现直流恢复。通过可编程电阻阵列,均衡器可支持0-40dB的增益范围,补偿20-100米电缆的损耗。
关键设计参数:
- 3dB带宽:90nm版本60MHz,180nm版本30MHz
- 群延迟波动:<0.5ns
- 输入参考噪声:8nV/√Hz
均衡器的Verilog-A模型展示了核心运放的设计考量:
verilog复制module ctle_opamp(
electrical vin_p, vin_n,
electrical vout,
electrical vdd, vss
);
parameter real A0 = 58; // 开环增益58dB
parameter real GBW = 950e6; // 增益带宽积950MHz
real av, gm1, ro1;
analog begin
av = 10 ** (A0 / 20);
gm1 = 2 * GBW / av; // 跨导计算
ro1 = 10e3; // 输出阻抗10kΩ
I(vin_p, vin_n) <+ 0;
I(vout, vss) <+ gm1 * V(vin_p, vin_n) - V(vout, vss)/ro1;
end
endmodule
3. 电源管理与数据转换
3.1 带trim的带隙基准
考虑到工艺偏差对模拟电路的影响,我们设计了6位(90nm)/4位(180nm)数字可调的带隙基准。核心电路采用曲率补偿结构,通过trimming将输出电压变化控制在±1%以内。温度系数方面,90nm版本达到8ppm/℃,180nm版本为15ppm/℃。
trim译码器采用可配置位宽设计,确保两个工艺版本的IP复用:
verilog复制module bg_trim_dec #(
parameter TRIM_W = 6
)(
input wire [TRIM_W-1:0] trim_in,
output reg [TRIM_W-1:0] trim_en
);
always @(*) begin
trim_en = '0;
for(int i=0; i<TRIM_W; i++) begin
trim_en[i] = trim_in[i]; // 直接位映射
end
end
3.2 6位Flash ADC实现
接收路径中的Flash ADC采用比较器阵列结构,每个比较器都集成了偏移校准功能。设计要点包括:
- 电阻分压网络采用温度计码布局,减小梯度误差
- 比较器引入前置放大器,降低kickback噪声
- 动态锁存结构确保1ns以内的决策时间
ADC核心代码结构如下:
verilog复制module flash_adc_6b(
input wire adc_in,
input wire [5:0] ref_array,
output reg [5:0] adc_out
);
genvar i;
generate
for(i=0; i<6; i++) begin : comp_loop
comp_with_trim u_comp(
.vin_p(adc_in),
.vin_n(ref_array[i]),
.trim_en(trim_array[i]),
.vout(adc_out[i])
);
end
endgenerate
4. 数字接口与系统集成
4.1 MII接口设计
媒体独立接口(MII)实现MAC层与PHY的通信,关键挑战在于跨时钟域处理。我们采用双端口异步FIFO解决tx_clk与系统时钟的同步问题,FIFO深度设置为8,确保100Mbps速率下的可靠传输。
简化的发送模块代码如下:
verilog复制module mii_tx(
input wire tx_clk, // 发送时钟
input wire rst_n, // 复位信号
input wire [3:0] tx_data, // 4位数据
input wire tx_en, // 发送使能
output reg [3:0] mii_txd, // 物理层数据
output reg mii_tx_en // 物理层使能
);
always @(posedge tx_clk or negedge rst_n) begin
if(!rst_n) begin
mii_txd <= '0;
mii_tx_en <= 1'b0;
end else begin
mii_txd <= tx_data;
mii_tx_en <= tx_en;
end
end
endmodule
4.2 版图设计要点
90nm版本版图特别注意了以下方面:
- 敏感模拟模块(如PLL)采用guard ring保护
- 电源网络使用Mesh结构,IR drop<30mV
- 匹配信号采用中心对称走线
- 时钟路径采用shielded差分走线
180nm版本则更注重:
- 加大器件间距降低寄生效应
- 使用双阱工艺隔离数字噪声
- 预留20%的金属层冗余
5. 实测性能与调试经验
流片测试数据显示:
- 90nm版本在100Mbps模式下的功耗为98mW
- 180nm版本在10Mbps模式功耗仅28mW
- 接收灵敏度达到650mVpp
- 抖动性能<0.15UI
调试过程中积累的重要经验:
- 电源完整性:LDO输出必须加10μF以上的去耦电容
- 信号完整性:关键模拟信号走线长度需控制在1mm以内
- 工艺偏差:180nm工艺的NMOS/PMOS阈值电压偏差可达±50mV
- ESD防护:所有IO口必须采用双二极管保护结构
这个项目让我深刻体会到,芯片设计是系统工程,需要统筹考虑电路架构、工艺特性和应用场景。特别是在混合信号设计中,数字噪声对模拟性能的影响往往需要通过多次迭代才能优化到理想水平。