:SAR ADC設(shè)計的關(guān)鍵技術(shù)解析)
簡介本資源是一套面向電子工程與集成電路設(shè)計初學(xué)者的SAR ADC建模實踐材料聚焦MATLAB環(huán)境下的逐次逼近型模數(shù)轉(zhuǎn)換器原理仿真與性能分析解決理論理解抽象、硬件實驗條件受限等學(xué)習(xí)痛點適用于課程設(shè)計、畢業(yè)設(shè)計及數(shù)字系統(tǒng)建模入門。壓縮包共2個文件1.98MB含核心MATLAB腳本SAR_ADC.m——實現(xiàn)SAR邏輯控制、DAC反饋比較、二進制逼近全過程仿真并支持分辨率、采樣率、量化誤差等關(guān)鍵參數(shù)配置另附MIT出品的SAR ADC-MIT.pdf技術(shù)文檔系統(tǒng)講解工作原理、時序流程、非理想因素如比較器失調(diào)、電容失配建模方法及SNR/ENOB計算示例。目前已有2863人學(xué)習(xí)下載材料結(jié)構(gòu)緊湊、代碼可讀性強、理論與實現(xiàn)緊密結(jié)合讀者可直接運行仿真觀察逐位判決過程對比理想與非理想輸出快速掌握SAR ADC系統(tǒng)級建模核心技能。 做混合信號電路的朋友應(yīng)該都有體會SAR ADC這顆“老將”在物聯(lián)網(wǎng)、工業(yè)采集、醫(yī)療電子甚至汽車電子里出鏡率相當(dāng)高。我之前在做一款16位、1MSPS的逐次逼近型ADC時最頭疼的不是電路圖本身而是架構(gòu)選型和參數(shù)權(quán)衡。流片一次成本太高光是電容陣列失配、比較器失調(diào)、時鐘抖動這幾個非理想因素就足以讓方案改到懷疑人生。那段時間我?guī)缀跆焯炫菰贛ATLAB里把整個SAR ADC的行為級模型搭起來用仿真結(jié)果反向指導(dǎo)電路設(shè)計。今天這篇文章就從“用MATLAB對SAR ADC建?!边@個項目出發(fā)把我踩過的坑、驗證過的流程、以及可以直接“抄作業(yè)”的建模細(xì)節(jié)完整梳理一遍給正在做ADC預(yù)研或準(zhǔn)備做系統(tǒng)級仿真的朋友一個參考。1. 項目概述與建模動機1.1 為什么選SAR ADC而不是其他架構(gòu)ADC的架構(gòu)選擇本質(zhì)上是速度、精度、功耗和面積四個維度的權(quán)衡。SAR ADC的定位很有意思它不像Flash ADC那樣靠堆比較器數(shù)量換速度也不像流水線ADC那樣需要用運放做級間增益更不像Delta-Sigma那樣依賴過采樣和噪聲整形。SAR的核心思路是“二分查找”通過一個比較器、一個DAC和一個逐次逼近寄存器在N個時鐘周期內(nèi)把模擬輸入量逐位逼近成數(shù)字碼。我個人的體會是SAR ADC最近幾年能持續(xù)熱下去主要沾了先進工藝的光。在CMOS工藝特征尺寸不斷縮小的背景下SAR只需要一個高增益運放有時甚至不需要器件本身的開關(guān)速度和匹配特性卻越來越好所以中精度10~16位、中速度幾kSPS到幾十MSPS這塊市場基本上被SAR拿下了。比如電池管理系統(tǒng)里的電壓采樣、超聲探頭的模擬前端、以及各類工業(yè)傳感器信號鏈SAR ADC的出場率都非常高。但SAR ADC的電路實現(xiàn)遠(yuǎn)沒有原理框圖那么輕描淡寫。電容DAC的失配會直接變成INL/DNL比較器的失調(diào)和噪聲會決定整個ADC的底噪SAR邏輯的時序余量不夠會導(dǎo)致高位判決錯誤。這些問題如果直接上晶體管級仿真跑一次1MSPS、16位的全精度仿真幾天時間都未必能出結(jié)果。這時候行為級建模的價值就體現(xiàn)出來了。1.2 行為級建模到底解決什么問題建模不是“模擬個理想ADC”那么簡單而是要建立一個與真實晶體管電路行為足夠貼近的可執(zhí)行模型。這個模型要能快速跑出各種非理想因素對整體性能的影響幫我們確定每個模塊的具體指標(biāo)要求。具體來說我在項目里用MATLAB建模主要做了幾件事架構(gòu)預(yù)研時快速比較不同位寬、不同采樣率下限定的SNR/SFDR/ENOB可行性把電容失配、比較器噪聲、時鐘抖動等非理想因素逐一注入模型觀察哪些因素先成為瓶頸協(xié)助電路設(shè)計人員確定DAC電容陣列的單位電容大小、比較器的輸入?yún)⒖荚肼暽舷?、采樣開關(guān)的導(dǎo)通電阻要求等在芯片回來后用MATLAB模型對實測數(shù)據(jù)進行交叉驗證判斷問題出在哪個模塊。這套流程走完之后再去Cadence里搭晶體管級電路心里基本有底了。實際上我后面做很多項目都會先搭一個MATLAB行為模型把指標(biāo)分解清楚再動電路這已經(jīng)成了我的標(biāo)準(zhǔn)動作。2. 建模方案與總體架構(gòu)2.1 行為級建模與晶體管級仿真的取舍很多初學(xué)者會糾結(jié)一個問題建模能不能直接反映電路特性這里就得明確“行為級模型”和“電路仿真”的邊界。晶體管級仿真比如Spectre、HSPICE是把每個器件的物理方程都解一遍精度最高但速度極慢。行為級建模則是把模塊當(dāng)成一個“有輸入輸出關(guān)系的黑盒”用數(shù)學(xué)表達式描述它的行為特征。比如比較器我們不關(guān)心它內(nèi)部是幾級預(yù)放大、幾級鎖存而是關(guān)心它的輸入失調(diào)電壓、輸入?yún)⒖荚肼暋⒒靥咴肼暫团袥Q時間這些參數(shù)直接從行為層面注入模型。MATLAB建模的優(yōu)勢在于速度。跑一組16位、1MSPS的完整轉(zhuǎn)換序列用Simulink的離散事件模型在我個人使用的普通工作站上只需要幾百秒換作晶體管級仿真可能跑幾萬個采樣點就得等上幾天。所以行為級模型的價值不是替代電路仿真而是把設(shè)計空間快速縮小讓電路仿真集中精力驗證最關(guān)鍵的“邊緣情況”。這是整個建模方案選型時最核心的考量。需要注意一點行為級模型也不是越復(fù)雜越好。模型參數(shù)過多擬合起來困難跑起來也慢反而失去“快速迭代”的優(yōu)勢。我一般把模型分成兩個版本理想模型用來驗證算法和時序邏輯非理想模型用來評估性能邊界。兩個版本共用同一套頂層代碼只是通過開關(guān)控制是否注入非理想因素。2.2 頂層模型結(jié)構(gòu)與數(shù)據(jù)流設(shè)計我采用的頂層模型結(jié)構(gòu)嚴(yán)格對應(yīng)SAR ADC的信號鏈路模擬輸入經(jīng)過采樣保持開關(guān)進入比較器一端DAC輸出進入比較器另一端SAR邏輯根據(jù)比較器結(jié)果逐位設(shè)置DAC的電容開關(guān)。整個系統(tǒng)是一個混合信號環(huán)路所以建模時既要處理連續(xù)時間信號也要處理離散時鐘事件。在MATLAB里我用的是腳本與Simulink混合的方式。底層算法邏輯如SAR搜索算法、校準(zhǔn)算法用MATLAB Function塊寫入方便調(diào)試采樣保持、比較器、DAC這些偏模擬性質(zhì)的模塊用Simulink基礎(chǔ)庫里的數(shù)學(xué)運算模塊搭建便于注入噪聲和失配。數(shù)據(jù)流的時序關(guān)系是建模成功與否的關(guān)鍵。SAR ADC的每個轉(zhuǎn)換周期分成采樣階段和轉(zhuǎn)換階段采樣階段輸入信號被采樣到電容陣列上轉(zhuǎn)換階段SAR邏輯從MSB開始逐位比較每一位判決占用一個時鐘周期。所以頂層模型里必須有一個嚴(yán)格的時鐘計數(shù)器確保采樣、比較、DAC建立、數(shù)字輸出在正確的時間節(jié)點發(fā)生。我在實際代碼中維護了一個clk_cnt變量每個時鐘上升沿加1在1到N2的范圍內(nèi)循環(huán)。第0個時鐘沿是采樣沿第1個時鐘沿后開始逐次逼近這樣整個時序一目了然也方便后續(xù)在Simulink里做波形觀測。function digital_out sar_adc_behavioral(signal_in, params) % 頂層行為級模型函數(shù) % signal_in歸一化后的模擬輸入范圍 [-1, 1] % params結(jié)構(gòu)體包含位寬、電容失配標(biāo)準(zhǔn)差、比較器噪聲等參數(shù) N params.Nbits; % 位數(shù) Vref params.Vref; % 參考電壓 Vdac 0; % DAC初始輸出 clk_cnt 0; % 時鐘計數(shù)器 digital_bits zeros(1, N); % 數(shù)字碼寄存器 for clk 1:(N2) if clk 1 % 采樣階段 Vdac signal_in; else % 轉(zhuǎn)換階段從MSB開始 bit_index clk - 1; if bit_index N % 嘗試把當(dāng)前位置1 Vdac_test update_dac(digital_bits, bit_index, 1, params); % 比較器判決 if signal_in Vdac_test digital_bits(bit_index) 1; else digital_bits(bit_index) 0; end Vdac update_dac(digital_bits, bit_index, digital_bits(bit_index), params); end end end digital_out bi2de(digital_bits, left-msb); % 轉(zhuǎn)成十進制數(shù) end這段代碼是骨架中的骨架實際項目里我會在update_dac函數(shù)里加入電容失配矩陣在比較器判決處注入噪聲在采樣處疊加抖動和帶寬限制。但核心的分時邏輯就是上面這個“采樣→逐位逼近→輸出”的三段式結(jié)構(gòu)。3. 核心模塊建模與參數(shù)設(shè)計3.1 采樣保持與時鐘抖動建模采樣保持電路的行為模型重點在三個非理想因素導(dǎo)通電阻帶來的帶寬限制、電荷注入導(dǎo)致的采樣誤差、以及時鐘抖動引起的孔徑不確定度。對于帶寬限制我在模型里用一階低通濾波來近似。采樣開關(guān)的導(dǎo)通電阻Ron和采樣電容Cs構(gòu)成一個RC低通其3dB帶寬大概是1/(2*pi*Ron*Cs)。要讓16位精度不受帶寬影響這個RC時間常數(shù)必須遠(yuǎn)小于采樣窗口的時間。工程上有個經(jīng)驗法則采樣時間內(nèi)RC時間常數(shù)至少是采樣窗口的十倍以上否則高頻信號的幅度衰減和相位延遲就會明顯劣化SFDR。時鐘抖動就更微妙了。抖動引起的采樣電壓誤差與輸入信號的壓擺率直接相關(guān)誤差電壓約等于dv/dt * t_jitter。在MATLAB模型里我為每個采樣點生成一個高斯分布的時鐘偏差再乘以當(dāng)前時刻信號的斜率把這個誤差疊加到采樣值上。我一般用下面這段代碼來生成采樣值里面同時考慮了RC帶寬和時鐘抖動% 采樣階段建模 function vsample sample_hold(t, x, Ron, Cs, tj) tau Ron * Cs; % RC時間常數(shù) % 理想采樣值 v_ideal x(t); % 時鐘抖動導(dǎo)致的采樣時刻偏差 t_actual t tj * randn(); v_jittered x(t_actual); % 一階RC建立誤差假設(shè)采樣窗口為Ts_hold Ts 1e-6; % 采樣周期示例 Ts_hold Ts/2; % 采樣窗口半個周期 settle_error (v_ideal - v_jittered) * exp(-Ts_hold/tau); vsample v_jittered settle_error; end實際項目中我習(xí)慣把時鐘抖動和RC帶寬分別做成兩個獨立參數(shù)便于觀察各自對SNR的影響。單獨跑抖動參數(shù)掃描時結(jié)果會和理論曲線吻合得很好這也驗證了模型本身沒寫錯。3.2 比較器噪聲與失調(diào)注入方法比較器是整個SAR ADC里最“致命”的模塊之一。它的失調(diào)電壓會直接變成ADC的輸出失調(diào)誤差而它的輸入?yún)⒖荚肼晻B加在信號上影響SNR。在行為級模型里我把比較器建模成一個帶有遲滯的理想判決器再加上失調(diào)和噪聲兩個偏置量。在MATLAB里實現(xiàn)很簡單每次比較時在判斷條件上加上一個隨機量% 比較器判決含失調(diào)和噪聲 function cmp_out comparator(vp, vn, vos, vn_rms) if vp vos vn_rms * randn() vn cmp_out 1; else cmp_out 0; end end這里的vos是失調(diào)電壓vn_rms是等效輸入噪聲的有效值。有一點需要注意SAR ADC的噪聲來源不只有比較器采樣電容上的KT/C熱噪聲也占了很大比重。在建模時我會把KT/C噪聲折算成等效輸入噪聲與比較器噪聲一起疊加這樣才能反映真實的信噪比上限。KT/C的計算公式是sqrt(k*T/C)比如室溫下1pF電容產(chǎn)生的噪聲有效值約為64uV。如果目標(biāo)SNR是90dB滿量程2V那么總積分噪聲要小于約31.6uV。這樣的話1pF的單端采樣電容已經(jīng)不夠了需要增大電容或采用相關(guān)雙采樣等降噪技術(shù)。在模型里注入這個噪聲后設(shè)計指標(biāo)一下子就能對齊。3.3 電容陣列DAC與失配建模SAR ADC里最常見的DAC結(jié)構(gòu)是二進制權(quán)重電容陣列。每個電容的權(quán)重由單位電容的數(shù)量決定理想情況下最高位電容是2^(N-1)*Cu最低位電容是Cu。但實際工藝?yán)飭挝浑娙荽嬖陔S機失配這個失配會導(dǎo)致DAC的輸出電壓偏離理想值進而變成ADC的DNL和INL。在MATLAB模型里我用一個數(shù)組來表示每個電容的實際值數(shù)組元素是Cu * (1 delta_i)其中delta_i服從均值為0、方差由失配參數(shù)決定的高斯分布。電容失配的標(biāo)準(zhǔn)差與面積的關(guān)系工藝模型里通常會給出sigma A / sqrt(W*L)或更精確的Pelgrom模型公式。我建模時生成的電容失配矩陣關(guān)鍵代碼大概是這樣的% 生成電容失配矩陣 function cap_array gen_cap_array(N, Cu, sigma_mismatch) cap_array zeros(1, N); for i 1:N % 二進制權(quán)重第i位的電容是2^(i-1)個單位電容 weight 2^(i-1); mismatch sigma_mismatch * randn() / sqrt(weight); % 失配與sqrt(面積)成反比 cap_array(i) weight * Cu * (1 mismatch); end end這里有一個工程技巧最高位的電容面積最大其相對失配最小最低位電容面積最小失配最大。所以建模時不能簡單給所有電容一個相同的相對失配而應(yīng)該根據(jù)面積大小調(diào)整其失配標(biāo)準(zhǔn)差。這也是為什么我的代碼里用了sqrt(weight)來縮放失配——失配與面積平方根成反比是工藝層面的基本規(guī)律。DAC輸出電壓的計算邏輯是把所有接參考電壓的電容電荷加起來除以總電容再乘以Vref。如果所有電容都接Vref輸出就是Vref如果全都接地輸出就是0。實際的轉(zhuǎn)換過程中SAR邏輯從MSB往下依次控制電容的接法最終使DAC輸出電壓逼近輸入電壓。3.4 SAR邏輯與時序設(shè)計SAR邏輯在行為級模型里看似簡單但它是整個模型的“神經(jīng)系統(tǒng)”。它的工作方式是從最高位開始先假設(shè)當(dāng)前位為1把DAC輸出與采樣輸入比較如果輸入大于DAC輸出則保留1否則置0。然后處理下一位直到最低位判決完成。這個逐位逼近的過程本質(zhì)上是二分查找。16位的SAR ADC需要16個時鐘周期完成轉(zhuǎn)換加上采樣周期一個完整轉(zhuǎn)換周期是17個時鐘周期。在實際邏輯設(shè)計里還要考慮DAC建立時間、比較器判決時間以及數(shù)字邏輯的傳播延遲所以最小可行時鐘周期會被這些時間參數(shù)限制。在MATLAB行為級模型里我給每個時鐘周期設(shè)置了“比較器判決時間”和“DAC建立時間”兩個內(nèi)部延遲參數(shù)。如果比較器判決時間過長模型會提示“時序不收斂”如果DAC建立時間不足則模型中DAC的輸出只建立到一定的穩(wěn)定精度這個誤差會被帶進下一次比較。這個設(shè)計和真實電路里的時序約束幾乎一一對應(yīng)。尤其在16位精度下DAC必須在一位判決的時間內(nèi)建立到0.5LSB以下。16位LSB對應(yīng)滿量程的約1/65536也就是約15ppm。如果假設(shè)建立誤差按指數(shù)衰減那么需要約11個時間常數(shù)才能達到這個精度。這就意味著R*C乘積必須遠(yuǎn)小于一個時鐘周期。模型里把這些關(guān)系顯式寫出來后驗證后續(xù)電路側(cè)的開關(guān)尺寸和DAC建立時間就方便多了。4. 性能評估與指標(biāo)計算4.1 用FFT算SNR、SINAD、ENOB和SFDR模型搭建完成后最大的問題是如何從仿真數(shù)據(jù)里提取性能指標(biāo)。ADC的動態(tài)性能測試標(biāo)準(zhǔn)做法是相干采樣后做FFT。所謂相干采樣就是保證采樣點數(shù)M和信號周期數(shù)J互質(zhì)并且Fin/Fs J/M。這樣做FFT時能量能集中在單一頻率bin上不會被頻譜泄漏污染。在MATLAB里我會用一個腳本自動完成這個過程生成一個滿量程正弦波輸入跑完整個SAR ADC模型得到一串?dāng)?shù)字碼再對數(shù)字碼做加窗FFT計算信號功率、噪聲功率和諧波功率。核心代碼如下% 動態(tài)性能計算 function metrics adc_fft_analysis(codes, Fs, Fin, M) % codesADC輸出數(shù)字碼長度M % Fs采樣率Fin信號頻率M采樣點數(shù) % 去除直流和線性斜率避免窗口泄漏 codes codes(:); Nfft M; % 加漢寧窗或使用相干采樣時不加窗 window hanning(Nfft, periodic); data codes .* window; spectrum fft(data, Nfft); P abs(spectrum).^2 / (Nfft^2 / 4); % 找信號bin bin_signal round(Fin / Fs * Nfft) 1; Psig sum(P(max(1,bin_signal-2):min(Nfft,bin_signal2))); % 信號功率 % 諧波位置2nd, 3rd... harmon_pow 0; for k 2:8 bin_h round(k * Fin / Fs * Nfft) 1; if bin_h 1 bin_h Nfft harmon_pow harmon_pow sum(P(max(1,bin_h-1):min(Nfft,bin_h1))); end end Pnoise sum(P) - Psig - harmon_pow; SINAD 10*log10(Psig / (Pnoise harmon_pow)); SNR 10*log10(Psig / Pnoise); SFDR 10*log10(Psig / harmon_pow); ENOB (SINAD - 1.76) / 6.02; metrics.SINAD SINAD; metrics.SNR SNR; metrics.SFDR SFDR; metrics.ENOB ENOB; end這里有個經(jīng)驗點如果仿真數(shù)據(jù)量不夠大加窗會影響諧波泄漏的估算。我一般建議至少采集2^124096個點才能把底噪壓到足夠低否則ENOB算出來會偏小。用這個腳本跑完理想模型ENOB應(yīng)該接近N0.5左右因為實際有效位會受量化噪聲影響理想16位ADC的SNR理論值是98.08dBENOB約16.0。如果連理想模型都跑不到這個水平那一定是模型或腳本里有bug這時候不要急著往下加非理想因素先排查基本問題。4.2 靜態(tài)指標(biāo)INL/DNL的仿真方法動態(tài)指標(biāo)之外INL和DNL是衡量ADC線性度的另一組關(guān)鍵指標(biāo)。DNL反映的是相鄰數(shù)字碼對應(yīng)的“代碼寬度”偏離理想值多少而INL則是把DNL累積起來反映整體轉(zhuǎn)移曲線對理想直線的偏差。在行為級模型里我通常用兩種方法測INL/DNL斜坡法和正弦直方圖法。斜坡法簡單直觀給ADC灌一個緩慢上升的斜坡信號記錄每個數(shù)字碼出現(xiàn)的次數(shù)代碼寬度就是出現(xiàn)點數(shù)除以采樣率。如果某個碼出現(xiàn)的點數(shù)明顯多于或少于平均值就說明這一級的臺階寬度偏大或偏小。正弦直方圖法更適合實測數(shù)據(jù)因為產(chǎn)生高精度斜坡信號并不容易。做法是輸入一個幅度略超滿量程的正弦波統(tǒng)計每個數(shù)字碼出現(xiàn)的概率再和理想正弦分布對比。因為正弦波的概率密度在峰值附近高、過零附近低所以只要知道輸入幅度和位數(shù)就可以反推出每個碼對應(yīng)的實際電壓閾值從而計算DNL和INL。我在建模時用斜坡法來驗證DAC失配模型因為MATLAB生成的數(shù)字斜坡可以做到絕對理想DAC失配對INL造成的S形曲線一目了然。得到INL曲線后我經(jīng)常做一個判斷如果INL呈現(xiàn)出明顯的二次或高次形狀通常說明電容失配中存在著系統(tǒng)性的梯度效應(yīng)這時需要調(diào)整單位電容的布局方案而不是單純追求更大的電容面積。4.3 蒙特卡洛分析確定工藝魯棒性單個失配樣本只能告訴我們這個特定芯片的性能而實際量產(chǎn)中每顆芯片的電容失配都不同。要評估設(shè)計在工藝波動下的表現(xiàn)蒙特卡洛仿真是標(biāo)準(zhǔn)做法。在MATLAB里做蒙特卡洛分析非常方便在for循環(huán)里每次生成一個隨機的電容失配矩陣跑一次完整ADC轉(zhuǎn)換和性能計算把所有結(jié)果存起來。跑上幾百次后統(tǒng)計ENOB/SFDR的均值、標(biāo)準(zhǔn)差和最差情況就能判斷設(shè)計是否滿足量產(chǎn)要求。我在一個16位SAR項目里跑過300次蒙特卡洛每次采樣4096點。結(jié)果發(fā)現(xiàn)SFDR主要受電容失配限制而SNR主要受比較器噪聲和KT/C噪聲限制。根據(jù)這個結(jié)果我把優(yōu)化重心放在提高電容匹配精度上比如單位電容取大、加dummy電容而不是一味降低比較器噪聲。如果沒有蒙特卡洛分析這個方向判斷很可能做反白花幾周優(yōu)化時間。5. 常見問題與排查技巧實錄5.1 模型跑出來的ENOB總比理論值低1~2位這是新手最容易碰到的問題。我排查這種問題時會按“信號鏈順序”逐步檢查先看采樣環(huán)節(jié)有沒有引入過大噪聲再看比較器判決是不是被噪聲或失調(diào)干擾最后看DAC建立是否足量。最容易被忽略的是“基準(zhǔn)源噪聲”。很多模型里把Vref當(dāng)成理想恒定值實際上芯片內(nèi)部基準(zhǔn)源是帶噪聲和帶內(nèi)阻的。如果基準(zhǔn)源噪聲沒有建模模型性能會顯得比實際好這是個“樂觀偏差”反過來如果采樣時鐘抖動參數(shù)給得太大性能又會偏悲觀。我習(xí)慣在模型里把參考電壓也加一個可調(diào)節(jié)的噪聲項這樣調(diào)參時能直觀看到“基準(zhǔn)源噪聲每降低10uVSNR提升約0.5dB”這類規(guī)律。另一個細(xì)節(jié)FFT分析時如果沒有做相干采樣或者采樣點數(shù)太少頻譜泄漏會嚴(yán)重抬高噪底ENOB被壓低。這種情況不代表ADC模型本身差而是測量方法的問題。建議先用理想模型配合標(biāo)準(zhǔn)相干采樣腳本自檢確認(rèn)測量鏈路無誤后再評估非理想模型。5.2 電容失配注入過大導(dǎo)致高位碼丟失電容失配的方差設(shè)置不當(dāng)最典型的癥狀是“某些數(shù)字碼從結(jié)果中消失”。比如16位ADC跑完4096個點后FFT頻響看起來沒什么大問題但只要統(tǒng)計輸出碼值的分布就會發(fā)現(xiàn)一些碼值從來沒出現(xiàn)過轉(zhuǎn)移曲線呈現(xiàn)局部缺失。這背后的原理是當(dāng)某位電容的實際權(quán)重偏離理想值過多時相鄰兩個DAC輸出電壓之間會出現(xiàn)“跳碼”導(dǎo)致某些數(shù)字碼對應(yīng)的模擬區(qū)間寬度為負(fù)。實際芯片里這叫非單調(diào)性嚴(yán)重時比較器可能停機ADC完全無法工作。我排查時第一件事是把DAC的實際權(quán)重打印出來對比理想權(quán)重看偏差是否在3*sigma以內(nèi)。如果失配參數(shù)給的過大就先把sigma調(diào)回工藝給出的合理范圍。有些朋友喜歡“為了測試魯棒性”故意用很大的失配這本身沒問題但需要有明確的應(yīng)用場景否則就是給自己制造麻煩。5.3 仿真速度慢參數(shù)掃描效率低行為級模型雖然比晶體管仿真快但如果跑蒙特卡洛和參數(shù)掃描累積下來的時間一樣可觀。我在做參數(shù)掃描時最喜歡用的是MATLAB的parfor并行循環(huán)直接把一臺多核電腦的CPU用滿。另外在掃描參數(shù)范圍內(nèi)使用linspace生成一組參數(shù)每組的蒙特卡洛次數(shù)可以根據(jù)靈敏度自適應(yīng)調(diào)整——不敏感的參數(shù)少跑幾次敏感的參數(shù)多跑幾次可以節(jié)約一半以上的總仿真時間。還有一個容易踩的坑每跑一次蒙特卡洛都重新生成電容失配矩陣。這當(dāng)然沒問題但如果你想對比“同一個失配樣本在不同比較器噪聲水平下的表現(xiàn)”必須把失配樣本固定住否則兩組結(jié)果的差異會同時受到失配和噪聲兩個隨機變量的影響沒法準(zhǔn)確歸因。我會在模型里加入外部種子值控制的隨機數(shù)生成器確保實驗的可復(fù)現(xiàn)性。6. 擴展方向與個人心得6.1 從MATLAB模型到Cadence真實驗證流程MATLAB行為模型跑完并不代表項目就結(jié)束了。我建議的完整流程是先在MATLAB里把架構(gòu)方案和模塊指標(biāo)確定再進Cadence做晶體管級驗證。如果電路仿真結(jié)果和MATLAB模型預(yù)測偏差過大通常說明某個模塊的行為模型參數(shù)設(shè)置不合理要回頭修正模型而不是硬調(diào)電路。實際操作中很多團隊還會用MATLAB生成電路的激勵文件和期望輸出然后在Cadence的testbench里比對。這樣可以省去寫大量Verilog testbench的時間。特別是仿真數(shù)據(jù)量大的時候用MATLAB做后處理分析比Cadence自帶的波形計算器方便太多。我甚至?xí)袴FT分析腳本直接封裝成函數(shù)Simulink輸出數(shù)據(jù)后一鍵出結(jié)果。6.2 建模過程中的一些心得體會前面寫了很多技術(shù)細(xì)節(jié)最后聊幾句自己的實操感受。我在這個SAR ADC建模項目里最深的體會是行為級模型的價值不僅在于“算出一個好看的數(shù)字”更在于它逼著你把信號鏈的每個環(huán)節(jié)都想清楚。以前看論文覺得SAR ADC原理很簡單直到自己建模時才發(fā)現(xiàn)比較器的噪聲帶寬怎么算、DAC的建立時間怎么留余量、采樣開關(guān)的時鐘饋通怎么補償每個細(xì)節(jié)都是一個坑。另一點是參數(shù)化設(shè)計的重要性。模型里所有可調(diào)參數(shù)我都會用結(jié)構(gòu)體統(tǒng)一管理而不是散落在各個腳本里。這樣做的好處是跑參數(shù)掃描時可以一次性生成組合出問題時也能快速定位是哪一組參數(shù)導(dǎo)致的異常。我見過不少同事的模型里參數(shù)寫著寫著就寫死了回過頭來想復(fù)現(xiàn)某次實驗結(jié)果還得翻代碼歷史記錄效率非常低。還有一點小建議模型注釋要寫得足夠詳細(xì)。這個項目隔了幾個月再回頭看如果沒有注釋我可能都記不清當(dāng)初設(shè)置某個參數(shù)時的物理含義。我的習(xí)慣是每個參數(shù)都注明“典型值、范圍、對應(yīng)電路模塊”這樣模型本身也是一份可交付的設(shè)計文檔。后續(xù)擴展SAR ADC的校準(zhǔn)算法比如前臺校準(zhǔn)、后臺校準(zhǔn)、注入抖動校準(zhǔn)直接用這個模型作為環(huán)境去測試這會幫你省掉非常多事。本文還有配套的精品資源點擊獲取