芯片参数的校准

一.模拟及数模混合芯片的校准

1.什么是校准?

一般来说,模拟芯片和数模混合芯片都需要进行某些基准参数的校准(Trim),常见的校准参数有参考电压(Vref / Bandgap)、运放 / 比较器的输入失调电压 Vos、时钟 / 频率类参数、电流 / 驱动类参数、ADC/DAC 类参数。

2.为什么需要校准?

因为晶圆的工艺制造有偏差,每一颗芯片的这些参数都不一样,不 Trim 达不到精度要求。具体原因:

  • 工艺离散性:电阻、电容、MOS 阈值电压、迁移率,晶圆与晶圆、批次与批次都不一样。
  • 温度与电压漂移:模拟电路对 PVT 极其敏感,不校准无法全温区、全电压工作。
  • 精度要求越来越高 :高精度 ADC/DAC、电源管理、传感器接口、射频前端,精度直接决定产品能不能用。
  • 良率:如果不 Trim,良率会非常低,成本爆炸。

3.校准(Trim)方式有哪些?

按实现方式分三大类:

① 激光 Trim(Laser Trim)

  • 激光 Trim(Laser Trim)是一种在芯片制造后期,通过激光束 精确切断或修改晶圆上特定金属或电阻连接,从而微调电路参数 的工艺技术。Laser Trim 所针对的物理结构是铝条(AI)或者薄膜电阻(hin‑Film Resistor)。
  • 特点:精度高、一次性、不可改、成本高。

② 熔丝 / 电熔丝 Trim(Fuse / Efuse)

  • 熔丝/反熔丝 Trim 是一种通过电学信号 (而非激光)永久改变芯片内部连接状态,从而微调电路参数 的工艺技术。它属于"电学修调"(Electrical Trim)。一般情况下,可分为:金属熔丝(Metal Fuse) 或 多晶硅熔丝(Poly Fuse),在芯片表面有一层裸露或半裸露的金属/多晶硅细线,通过测试电路去施加电流从而将熔丝烧断,实现Trim。
  • eFuse(电熔丝) 或 反熔丝(Anti-fuse) 集成在芯片内部,通常是一个特殊的晶体管结构或电容结构,通过芯片内部的逻辑电路 (如寄存器、DAC)产生一个编程电压 ,击穿介质层(反熔丝)或改变晶体管状态(eFuse),逻辑控制,需要芯片上电工作,通过数字接口(如I2C)写入指令来触发烧断。
  • 特点: 一次性可编程、成本低、面积小、广泛用于 Bandgap、Vos、频率校准。

③ 数字可编程 Trim(寄存器控制)

  • 数字可编程 Trim(寄存器控制)是一种通过数字逻辑电路 (而非物理烧断)来微调芯片参数的修调技术。它利用芯片内部的寄存器 (Register)存储修调码(Trim Code),通过控制开关阵列或DAC来动态调整电路参数。修调结果(一串二进制码)存储在芯片内部的非易失性存储器 (如Flash、OTP)或易失性寄存器中。
  • 特点 : 可多次改写、可在线校准、动态校准、现代 ADC/DAC、PMIC、高速接口主流方案、常常配合EFUSE一起使用,相当于在线Trim,通过寄存器找到最佳的Trimcode之后,将其装载至EFUSE上从而实现永久烧录。

二.基本校准参数之带隙基准电压(Vbg)、基准电流(Iref)、偏置电流(Ibias)

在集成电路中,电压基准源是最基础、最重要的模块,用于为芯片中其它电路提供基准电压和基准电流。特别是在高精度ADC/DAC中,高精度电压基准源是设计重点和难点。Bandgap带隙基准源是目前最常用的电路结构。

1.带隙基准源(bandgap)

  • 带隙基准源利用双极型晶体管(BJT)的两种温度特性生成稳定电压。BJT的基极-发射极电压VBE具有负温度系数(约-2mV/°C) ,而两个工作在不同电流密度下的BJT产生的ΔVBE(= (kT/q)·ln(N))具有正温度系数 。通过运放负反馈电路,将按比例放大后的ΔVBE与VBE相加: V R E F = V B E + M ⋅ Δ V B E VREF = VBE + M·ΔVBE VREF=VBE+M⋅ΔVBE。精心设计比例系数M,使两者的温度系数相互抵消,从而在宽温范围内输出约1.2V的低漂移基准电压。这样即便温度如何变化,芯片始终能产生一个稳定的电压,这就是带隙基准电压,简称Vbg。

2.基准电流源(电流镜)

  • 基准电流Iref是通过带隙基准源输出的电压Vbg通过一个电阻Rs产生的 ;而基准电流源通过电流镜将参考电流 Iref 精确复制到其他支路,为电路提供多路偏置电流,这就是偏置电流Ibias。利用 Rs 和对称支路的负反馈,抑制 PVT 变化对电流的影响,使输出电流稳定,共源共栅结构提升输出阻抗,让电流源对负载电压变化不敏感,更接近理想电流源。

三.基本校准参数之振荡器频率(oscillator frequency)

1.内部振荡器(Oscillator)

在混合信号芯片中,内部振荡器(Oscillator)通常基于 RC 或环形振荡器架构,频率范围主要集中在 32 kHz 至 50 MHz ​ 之间。低频(如 32 kHz)主要用于低功耗待机、RTC 及看门狗等常开模块,以最小化功耗;中高频(如 4--16 MHz,最高可达百 MHz 级)则用于驱动数字逻辑、ADC/DAC 采样及时钟倍频(PLL)的参考源。选择该频段的核心考量是在工艺成本、启动速度、功耗与精度之间取得平衡,RC 振荡器因面积小、功耗低而成为主流,但其频率和稳定性会受 PVT(工艺、电压、温度)变化影响。

2.时钟分频

时钟分发采用多域分层分频架构 ,而非单一频率全局驱动。主振荡器输出首先进入时钟生成单元,通过整数分频 (二进制计数器,如 ÷2/÷4)、分数分频 (用于 UART 等精确波特率)及时钟门控技术,生成多个独立的时钟域。例如,将 16 MHz 主频分频为 8 MHz(CPU 核)、4 MHz(外设总线)、1 MHz(ADC 采样)及 32 kHz(休眠域)。这种架构配合跨时钟域(CDC)同步机制,既满足了高速数字逻辑的吞吐需求,又隔离了高频噪声对敏感模拟模块的干扰,是实现低功耗与高可靠性设计的关键。

四.纯模拟参数的Trim(LDO的输出电压)

1.LDO的Trim

我们在选择LDO时,一般会选择它的输出电压,如1.8V、2.5V、3.3V等,那么这些不同输出电压的LDO是怎么生产出来的呢?可以肯定的是,它们肯定不是设计成不同的晶圆去生产,那样太麻烦了。实际上它们来自于同一颗die,在CP阶段,它们就被Trm成不同的电压版本了。LDO的Trim和上面提到的Vbg、Iref等参数不同,对于LDO本身来讲,大多数 LDO 本身"不一定要有独立 Vbg",但在混合信号芯片里,LDO 几乎一定"借用"芯片里的 Bandgap 作为参考。

2.LDO如何实现Trim

此处我们讲的是单独的LDO器件,我们都知道,LDO的Vout是根据内部的参考电压Vref通过负反馈调节,再通过分压电阻去分到一个我们想要的电压,通常来讲,我们在CP阶段所Trim的就是每颗die的分压电阻,通过将电阻trim成不同的阻值,从而将LDO Trim成不同的电压版本。

3.为什么不用Trim Vref?

在单独的 LDO 芯片中,由于片内通常仅采用二极管、电阻或简易 MOS 堆叠等方式生成一个低成本、温漂较大的"粗略参考电压(Vref)" ,而非高精度的带隙基准,因此直接在 Vref 产生电路上进行 Trim 不仅面积与功耗代价高 ,且无法从根本上改善其固有的温度漂移特性 ;相比之下,反馈分压电阻本身已作为输出电压设定的必要元件存在,利用其进行 Trim 不仅成本低、对噪声与 PSRR 无负面影响,还能同时补偿 Vref 绝对值偏差与误差放大器的 Offset,从而在量产中以最小的硬件开销最有效地保证了 datasheet 中规定的输出电压精度。

五.校准参数常见的算法

1.查表法(区间代入法)

研发在前期通过少量晶圆的大样本测试,建立了 "目标参数(如 Vout / Freq) vs 测试值 vs Trim Code" 的对应关系,并将其抽象为若干电压/电阻/频率区间或分段函数,量产测试时只需测出当前 DUT 的实际值,落入哪个区间,就直接映射到对应的 Trim Code,从而跳过复杂的逐点拟合或迭代搜索,在保证规格的前提下最大化测试效率与稳定性。代码如下:

scss 复制代码
	if((gb_vfb[i]>=1.700)&&(gb_vfb[i]<1.782))  {t3[i]=0;t2[i]=1;t1[i]=1;t0[i]=1;}
	if((gb_vfb[i]>=1.782)&&(gb_vfb[i]<1.815))  {t3[i]=0;t2[i]=1;t1[i]=1;t0[i]=0;}
	if((gb_vfb[i]>=1.815)&&(gb_vfb[i]<1.848))  {t3[i]=0;t2[i]=1;t1[i]=0;t0[i]=1;}
	if((gb_vfb[i]>=1.848)&&(gb_vfb[i]<1.883))  {t3[i]=0;t2[i]=1;t1[i]=0;t0[i]=0;}
	if((gb_vfb[i]>=1.883)&&(gb_vfb[i]<1.918))  {t3[i]=0;t2[i]=0;t1[i]=1;t0[i]=1;}
	if((gb_vfb[i]>=1.918)&&(gb_vfb[i]<1.951))  {t3[i]=0;t2[i]=0;t1[i]=1;t0[i]=0;}
	if((gb_vfb[i]>=1.951)&&(gb_vfb[i]<1.984))  {t3[i]=0;t2[i]=0;t1[i]=0;t0[i]=1;}
	if((gb_vfb[i]>=1.984)&&(gb_vfb[i]<2.016))  {t3[i]=0;t2[i]=0;t1[i]=0;t0[i]=0;}
	if((gb_vfb[i]>=2.016)&&(gb_vfb[i]<2.048))  {t3[i]=1;t2[i]=0;t1[i]=0;t0[i]=0;}
	if((gb_vfb[i]>=2.048)&&(gb_vfb[i]<2.081))  {t3[i]=1;t2[i]=0;t1[i]=0;t0[i]=1;}
	if((gb_vfb[i]>=2.081)&&(gb_vfb[i]<2.114))  {t3[i]=1;t2[i]=0;t1[i]=1;t0[i]=0;}
	if((gb_vfb[i]>=2.114)&&(gb_vfb[i]<2.149))  {t3[i]=1;t2[i]=0;t1[i]=1;t0[i]=1;}
	if((gb_vfb[i]>=2.149)&&(gb_vfb[i]<2.184))  {t3[i]=1;t2[i]=1;t1[i]=0;t0[i]=0;}
	if((gb_vfb[i]>=2.184)&&(gb_vfb[i]<2.217))  {t3[i]=1;t2[i]=1;t1[i]=0;t0[i]=1;}
	if((gb_vfb[i]>=2.217)&&(gb_vfb[i]<2.250))  {t3[i]=1;t2[i]=1;t1[i]=1;t0[i]=0;}
	if((gb_vfb[i]>=2.250)&&(gb_vfb[i]<2.400))  {t3[i]=1;t2[i]=1;t1[i]=1;t0[i]=1;}

2.公式法

研发通过前期测试数据建立被测参数(如 LDO 输出电压、OSC 频率)与 Trim Code 之间的数学模型(通常为线性方程) ,将 Trim 过程转化为 C o d e = r o u n d ( ( T a r g e t − M e a s u r e d ) / S t e p ) Code = round( (Target − Measured) / Step ) Code=round((Target−Measured)/Step)或者 T a r g e t = A × C o d e + B ⇒ C o d e = ( T a r g e t − B ) / A Target = A × Code + B⇒ Code = (Target − B) / A Target=A×Code+B⇒Code=(Target−B)/A其中 A(斜率,LSB 步进) ​ 和 B(截距,零点偏移) ​ :由研发在 CP 前通过统计大量晶圆数据拟合得到;CP 测试时只需测量当前裸片的初测值,代入公式即可直接计算并写入 Trim Code,无需查表或二分搜索,从而在保证精度的同时显著提升测试速度、降低 ATE 资源占用。

3.分段二进制逼近法

通过 1.6V / 0.8V / 0.4V / 0.2V / 0.1V 五级非均匀 Trim 步进,从最大权重开始逐级判断并累加 Trim bit,实现对目标电压的快速、稳定逼近,适用于CP 阶段Trim fuse步长呈 2ⁿ 关系、且希望用最少 bit 覆盖大误差范围的芯片。

ini 复制代码
for(i=0;i<SITENUM;i++)
	{
		
		BEGIN_SINGLE_SITE(i)
		f5[i]=0;
		f6[i]=0;
		f7[i]=0;
		f8[i]=0;
		f9[i]=0;

		Trim_diff[i] = Vout_target - vout_pre_12V[i];  //1.8-1.2=0.6V
		STEP = (int) (Trim_diff[i] / min_Vfuse + 0.5);
		DEL = 16; //0.1V/0.2V/0.4V/0.8V/1.6V  
		TEMP1 = STEP;

		if(ALL_FLAG[i] == 0) 
		{
			for(j=1; j<6; j++)  
			{
				TEMP2 = TEMP1 - DEL; 
				if(TEMP2 >= 0)  
				{   
					TEMP1=TEMP2;
					FLAG=j;
					if(FLAG==1) FUSE_T9(); //1.6V 
					if(FLAG==2) FUSE_T8(); //0.8V
					if(FLAG==3) FUSE_T7(); //0.4V ←
					if(FLAG==4) FUSE_T6(); //0.2V ←
					if(FLAG==5) FUSE_T5(); //0.1V   
				}
				DEL=DEL/2;
			}
		}
		END_SINGLE_SITE()
		FUSE9->SetTestResult(i, 0, f9[i]);
		FUSE8->SetTestResult(i, 0, f8[i]);
		FUSE7->SetTestResult(i, 0, f7[i]);
		FUSE6->SetTestResult(i, 0, f6[i]);
		FUSE5->SetTestResult(i, 0, f5[i]);
	}
        
        
        

4.线性遍历法

从最小 Code 开始,逐个写 → 测 → 判断是否达到目标 → 找到最后一个合格的 Code,也是最普遍的方法,适用于CP 阶段模拟参数"只能靠实测、没有可靠模型"、且 Trim 范围不大、对测试稳定性要求高于测试速度的场景。代码样例如下:

#define 复制代码
#define VBG_CODE_MAX 16

unsigned char done_flag[STS_SITE_NUM] = {0};

for (STID = 0; STID < STS_SITE_NUM; STID++)
{
    trimcode_vbg[STID] = 0;
    done_flag[STID] = 0;
}

for (int code = 0; code < VBG_CODE_MAX; code++)
{
    for (STID = 0; STID < STS_SITE_NUM; STID++)
    {
        if (next_status[STID] != 1)
            continue;

        if (done_flag[STID])
            continue;

        temp_trimcode_data[STID] = (0x06 + code * 16) & 0xFF;
    }

    dcm.I2CWriteData(0x50, 0x30, 1, temp_trimcode_data);
    delay_ms(1);

    m_AD.MeasureVI(100, 10);

    for (STID = 0; STID < STS_SITE_NUM; STID++)
    {
        if (next_status[STID] != 1)
            continue;

        if (done_flag[STID])
            continue;

        double vbg_meas = m_AD.GetMeasResult(STID, MVRET);

        if (vbg_meas >= VBG_TARGET)
        {
            trimcode_vbg[STID] = code;   //当前 code 就是最终值
            done_flag[STID] = 1;
        }
    }

    int all_done = 1;
    for (STID = 0; STID < STS_SITE_NUM; STID++)
    {
        if (!done_flag[STID] && next_status[STID] == 1)
        {
            all_done = 0;
            break;
        }
    }
    if (all_done)
        break;
}

for (STID = 0; STID < STS_SITE_NUM; STID++)
{
    if (next_status[STID] == 1)
    {
        VBG_code->SetTestResult(STID, 0, trimcode_vbg[STID]);
    }
}

5.最小误差遍历匹配法

我们找code的过程,实际上是把工艺偏差造成的连续分布,离散化成若干个Trim code(档位),有些芯片比中心值低,所以选低档位,有些芯片高,所以选高档位,把code写进芯片就相当于把这个芯片调到了code = x的模式,芯片会自动把它往上或者往下去调到中心值附近。通过遍历整个 Trim Code 候选数组 ,计算每一个候选值与"理论缩放因子(测试值/目标值)"的偏差,选择偏差最小的那个 Code,因此属于典型的遍历查找(Traversal Search) 中的一种。适用于已有TrimTable、Trim 响应相对稳定、且不希望频繁写码实测,但对精度和非线性有一定要求的模拟芯片。

ini 复制代码
trimtable_VBG[16] = { 1.316, 1.309, 1.301, 1.294, 1.286, 1.279, 1.271, 1.264, 1.256, 1.249, 1.241, 1.234, 1.227, 1.219, 1.212, 1.204 };//V

unsigned int GetTrimCode(double meas_value, double target_value, double *buf, int length)
{
	double delta = 0.0;
	double dmin = 999.9;
	double temp;
	int i;
	unsigned int trimcode = 0;

	if (meas_value == 0) trimcode = 0;
	else
	{
		delta = (*buf) * target_value / meas_value;
		for (i = 0; i<length; i++)
		{
			temp = abs(delta - *(buf + i));
			if (temp < dmin)
			{
				dmin = temp;
				trimcode = i;
			}
		}
	}

	return(trimcode);
}

m_AD.Set(FV, 0.0, ACM200_3p6V, ACM200_10UA, ACM200_RELAY_ON);
	delay_ms(2);
	m_AD.MeasureVI(100, 10);//100 times * 10us =1ms
	for (STID = 0; STID < STS_SITE_NUM; STID++)
	{
		trimcode_vbg[STID] = trimcode_vbg[STID] & 0x0f;
		if (next_status[STID] == 1)
		{
			m_vbg_pre1[STID] = m_AD.GetMeasResult(STID, MVRET);
			VBG_pre1->SetTestResult(STID, 0, m_vbg_pre1[STID]);//V
			trimcode_vbg[STID] = GetTrimCode(m_vbg_pre1[STID], 1.265, trimtable_VBG, 16);
			VBG_code->SetTestResult(STID, 0, trimcode_vbg[STID]);
		}
	}

	//---------------------------------------- trimming ----------------------------------------
	for (STID = 0; STID < STS_SITE_NUM; STID++)
	{
		temp_trimcode_data[STID] = (0x06 + trimcode_vbg[STID] * 16) & 0xff;
	}
	dcm.I2CWriteData(0x50, 0x30, 1, temp_trimcode_data);
	delay_ms(1);
	m_AD.MeasureVI(100, 10);//100 times * 10us =1ms
	for (STID = 0; STID < STS_SITE_NUM; STID++)
	{
		if (next_status[STID] == 1)
		{
			m_vbg_pre2[STID] = m_AD.GetMeasResult(STID, MVRET);
			VBG_pre2->SetTestResult(STID, 0, m_vbg_pre2[STID]);//V
		}
	}
        

6.二分法查找

二分法(Binary Search Trim)是一种通过不断缩小 Trim Code 的搜索区间来高效逼近目标值的测试方法 :它以 Trim 范围为边界,每次取中点 Code 写入并实测,根据"测量值是大于还是小于目标值"将搜索区间减半,循环直至收敛;该方法在保持实测反馈与多 Site 并行安全的同时,将测试复杂度从线性的 O(N) 降至对数级 O(log N),是兼顾测试速度、稳定性与工程鲁棒性的经典 Trim 方案。

ini 复制代码
void Trim_Search(int sel, int start, int end, double ref, BYTE *trim_b, double *ref_b)
{
	//define variable
	int left[STS_SITE_NUM], right[STS_SITE_NUM], mid[STS_SITE_NUM];
	int step1[STS_SITE_NUM];
	float Val[STS_SITE_NUM], Val_COMP[STS_SITE_NUM];
	int b = 0, core_mid;
	int core[16];
	int code[STS_SITE_NUM] = { 0 };
	int STID = 0;

	for (int i = 0; i<16; i++)
	{
		core[i] = i;
	}

	//initialize variavle
	for (int i = 0; i<STS_SITE_NUM; i++)
	{
		left[i] = start;
		right[i] = end;
		mid[i] = end;
		step1[i] = 0;
		Val[i] = 0.0;
		Val_COMP[i] = ref;
		trim_b[i] = 0;
		ref_b[i] = 0;
	}

	// 16=2^4+1
	while (b<5)
	{
		b++;
		//------- data init -------
		for (STID = 0; STID < STS_SITE_NUM; STID++)
		{
			core_mid = 0;
			mid[STID] = 0;
			step1[STID] = 0;//mid[i]=0.5*(start+end);

			mid[STID] = (left[STID] + right[STID]) / 2;
			core_mid = mid[STID];
			step1[STID] = core[core_mid];
			code[STID] = step1[STID];
		}
		//-------- write mid data ----
		for (STID = 0; STID < STS_SITE_NUM; STID++) 
		{ 
			abyDataWritten[STID] = code[STID] * 16;
		}
		dcm.I2CWriteData(0x50, 0x31, 1, abyDataWritten);
		delay_ms(2);

		//Get Measure result 
		const double* results = Dcm_Tmu_Time_Division(0.0, 4.0, 1.0, 1.0, 10, 10);//kHz
		for (STID = 0; STID<STS_SITE_NUM; STID++)
		{
			Val[STID] = 0;
			Val[STID] = results[STID]; 
		}

		//-------- write mid data ----
		for (STID = 0; STID < STS_SITE_NUM; STID++)
		{
			if (fabs(Val[STID] - ref) < Val_COMP[STID])
			{
				Val_COMP[STID] = fabs(Val[STID] - ref);
				trim_b[STID] = step1[STID];
				ref_b[STID] = Val[STID];
			}
			if (Val[STID]>ref)
			{
				right[STID] = mid[STID] - 1;
			}
			else
			{
				left[STID] = mid[STID] + 1;
			}
		}
	}
}

//Get Measure result 
	const double* results1 = Dcm_Tmu_Time_Division(4.0, 0.0, 1.0, 1.0, 10, 10); //kHz
	for (STID = 0; STID<STS_SITE_NUM; STID++)
  {
		m_oscbst_pre1[STID] = results1[STID];
	}

	//get trimcode
	Osc31k_Trim_Search(0, 0, 15, 31, trimcode_osc_bst, m_oscbst_pre2);

	for (STID = 0; STID < STS_SITE_NUM; STID++)
	{
		if (next_status[STID] == 1)
		{
			OSC_BST_code->SetTestResult(STID, 0, trimcode_osc_bst[STID]);
			OSC_BST_pre2->SetTestResult(STID, 0, m_oscbst_pre2[STID]); //Khz
		}
	}

六.Trim的物理实现

1.Laser Trim的物理实现

Laser Trim 的物理实现过程 是通过激光烧蚀或激光熔断 对芯片上的特定微结构进行物理改性,从而永久调整电路参数的过程。其核心步骤如下:首先,芯片在测试机上完成电性测量,确定与目标值的偏差;随后,根据 Trim 算法计算出需要调整的物理结构位置并生成对应的坐标文件;接着,使用专业的激光修调机器直接熔断芯片上对应坐标的熔丝(铝条)。

2.金属熔丝和poly fuse的烧断过程

由于金属熔丝的两端通常并未直接引至芯片封装引脚(Pin),而是通过内部开关矩阵或选通电路连接至测试焊盘(Pad),因此熔丝的烧断过程依赖于测试机(ATE)经探针卡向特定 Pad 施加编程电流 。在测得芯片电性初值并由 Trim 算法计算出目标熔丝组合后,测试系统通过控制继电器或内部 MOS 选通开关,精准选通对应 Pad 的供电路径,从而仅在目标熔丝上流过足以致其熔断的大电流,实现对指定熔丝的确定性烧断。

3.Efuse的烧录步骤

  • 相较之下,Efuse 的烧录流程更为复杂,本质是 "寄存器预载 → 确认 → 物理熔断 → 结果回读" 的闭环过程:首先,我们利用数字可编程 Trim 将算法得出的 Code 写入数字寄存器并测量确认;随后配置相关寄存器并启动芯片,通过改写烧录标志位(0→1)触发高压/大电流脉冲,利用焦耳热或电迁移效应使熔丝发生不可逆物理断路;在完成断电重启后,Efuse 信息自动重载至寄存器,此时通过读取寄存器获取的 Code 已源自物理熔断结果,配合显微镜观测到的金属熔融或断裂形貌,即可确认 Efuse 烧录成功。可能会烧录失败的原因:1.烧录后等待时间过短;2.芯片断电/重启后重载的过程出现问题;3.烧录电压过低/能量不够;4.没有严格遵循烧录步骤;5.芯片时钟配置有误导致烧录失败。
  • 以一颗包含 32 根 Efuse 的芯片为例,其内部寄存器通常会映射 32 个对应比特位,且物理布局上这些 Efuse 阵列往往与寄存器位序一一对齐、集中排布,因此在显微镜下可直观观测到熔断位置,所以我们可以根据显微镜下的efuse是否烧断的照片来反推我们的code。当然,除了trimcode以外,我们还可以烧录其他的寄存器配置的某些bit,这样终端客户在使用时就是一个固定不可配的开机配置。下图为efuse烧断和亮斑的图片(亮斑是发生过电迁移的视觉证据,可以作为是否烧断的依据)。

4.反熔丝在OTP上的作用机制

*ps:由于尚未做过OTP的项目,因此此处埋坑,等以后来填。

七.Trim后的数据处理

  • Trim 后的数据处理首要原则是 "先清洗,后统计" ,必须严格剔除由探针接触不良、电源塌陷或程序异常导致的离群值(Outliers),并合理排除 Edge Die 的干扰,避免将测试系统误差误判为工艺波动;同时需警惕多 Site 并行测试下的均匀性问题,应先确认 Site 间差异在可控范围内,再进行全片数据统计,防止将 ATE 或 Prober 的不一致性混入工艺 Sigma 计算中。
  • 此外,切勿默认 Trim 后的数据服从理想正态分布,应在进行均值、标准差及 Cpk/Ppk 计算前执行正态性检验(如 AD 检验),根据实际分布特征选择合适的统计量;最终需将处理后的数据与 Wafer/Lot ID、时间戳绑定,通过 Wafer Map 与直方图可视化工艺中心偏移与离散度,实现对量产工艺窗口漂移的早期预警与闭环管控。
相关推荐
oscar9996 天前
EDA 工具链地图:仿真、综合、STA、P&R 与签核
芯片·eda
世微 如初7 天前
24V 输入转 9V/0.8A 输出:基于 AP5190 的 LED 降压恒流驱动方案设计与 BOM 清单
驱动开发·芯片·led电源驱动·降压恒流ic
芯片人0079 天前
GEK100系列芯片进入上市公司上海移远通信供应链
人工智能·单片机·嵌入式硬件·物联网·芯片
oscar99911 天前
CPO 共封装光学——当“电互连的极限”只能靠“光进封装”来突破
芯片·封装
oscar99911 天前
玻璃基板与面板级封装——从“圆形晶圆逻辑”到“矩形大板逻辑”的范式迁移
芯片·封装
艾德克斯11 天前
艾德克斯以测试之力护航汽车创新落地——以“测试先行”解码2027年度中国汽车十大技术趋势
汽车·芯片·ai测试·固态电池·汽车测试·v2g·电驱动
ZenasLDR11 天前
蓝牙应用走向万物智联
音频·芯片
至为芯12 天前
IP2766至为芯支持AVS快充的单C口140W快充协议芯片
集成电路·芯片·电子元器件
oscar99912 天前
3D 异构集成中的热—力—电耦合——被封装结构放大的系统级问题
芯片·封装·电耦合
oscar99913 天前
TSV 与 3D 堆叠——垂直方向上的密度跃迁及其代价
芯片·封装·tsv