1. 这不是教科书是流片前夜我摊在桌上的那张草稿纸你搜“LDO纹波测试”“VCO设计ADS”“PLL锁相环原理图”点开十篇里八篇是PPT截图公式堆砌剩下两篇是仿真波形截图配一句“参数调优后收敛”。但真正坐在版图工位上、盯着Cadence Virtuoso窗口右下角那个不断跳动的仿真时间、手边咖啡凉透了还没喝一口的人要的从来不是“理论上可行”而是“这次流片前必须搞定”的确定性。这个汇总就是我过去七年在台积电28nm/16nm工艺节点、中兴国际射频SoC项目里把Op Amp、BGR、LDO、VCO、PLL、CDR、TX/RX这些模块从电路图推到GDSII、再从晶圆厂拿回wafer实测数据后撕下来的几十张草稿纸的电子版——它不讲定义只讲“为什么这里必须用PMOS做pass device”“为什么BGR的启动电路要故意加个RC延迟”“为什么PLL的CP电流源非得用cascode结构”。关键词里的“LDO纹波”“Ring VCO”“S接地的VCO拓扑”每一个都不是孤立术语而是我在tape-out前三天反复修改、实测验证、甚至重画版图才确认下来的工程选择。适合谁适合刚拿到Cadence license、对着spectre仿真器发懵的应届生适合被项目经理催着交signoff报告、却卡在VCO tuning range不够的中级工程师也适合想快速判断自家芯片电源噪声是否真来自LDO、而不是PCB layout问题的系统工程师。它不承诺“学会就能流片”但能让你少走三个月弯路——比如我当年第一次做BGR就因为没搞懂bandgap reference的曲率补偿原理在-40℃到125℃温度范围内输出漂移了37mV最后靠加一个二极管串并联网络硬补回来结果版图面积多占了15%功耗还高了8%。2. 整体设计逻辑为什么AMS电路不能靠“仿真正确”就签字放行2.1 工艺角与蒙特卡洛仿真器里的“理想世界”和晶圆厂的“真实战场”很多人以为只要在FFFast-Fast工艺角下仿真通过SSSlow-Slow角下margin够大就能放心tape-out。错。台积电28nm CMOS工艺的PDK里光是mosfet的threshold voltageVth在不同工艺角下的变化范围就超过±120mV而BGR的核心——两个PN结的Vbe差值ΔVbe对Vth极其敏感。我做过一组对比同一套BGR电路在FF角下仿真输出1.248V在SS角下是1.252V看起来很稳但一跑蒙特卡洛Monte Carlo1000次随机抽样里有17次输出跌破1.23V其中9次直接掉到1.215V——这已经超出了ADC参考电压允许的±1.5%误差带。原因不是Vth本身而是Vth变化导致电流镜的匹配度恶化进而让ΔVbe的放大倍数失准。所以我的设计流程里蒙特卡洛不是可选项是必选项且抽样次数必须≥2000次。更关键的是抽样时必须同时扰动Vth、Tox氧化层厚度、Rsheet方块电阻三个参数因为实际晶圆上它们是耦合变化的。只扰动Vth等于在模拟一个不存在的世界。提示Cadence Spectre里设置蒙特卡洛别只勾选“device mismatch”一定要在“Process Variation”里手动添加Tox和Rsheet的correlation相关系数设为0.30.5否则仿真结果会过于乐观。这个参数值是我从台积电提供的process design manual第7章附录B里抄来的实测数据。2.2 版图驱动设计Layout-Driven Design电路图只是草稿版图才是终稿AMS电路里90%的“仿真没问题实测翻车”都源于版图。最典型的是LDO的误差放大器Error Amplifier。电路图上画个两级运放输入对管用M1/M2负载管用M3/M4看起来对称。但一画版图M1和M2的源极接到同一个金属bus上而M3的源极连到VDDM4的源极连到输出Vout——这两条路径的寄生电阻和电感完全不同。当LDO带载突变时M3/M4的源极电压瞬态响应速度差异直接导致运放共模电平偏移轻则输出过冲重则振荡。我的解决方案是所有关键匹配器件如电流镜、差分对、BGR的R1/R2必须采用common-centroid layout共中心对称布局。具体操作把M1/M2分成4个小管子排列成2×2矩阵M1的四个单元按“左上、右下”取M2按“右上、左下”取R1/R2则用相同宽度、相同长度的poly电阻交叉蛇形走线中间用dummy fill填满。这样工艺波动造成的梯度误差会被抵消。中兴国际的RF SoC项目里我们曾因BGR版图没做common-centroid实测温漂比仿真高了42%重画版图后降到仿真值的1.3倍以内。2.3 电源与地的物理本质为什么“S接地的VCO拓扑”能压低相位噪声搜索热词里有“S接地的VCO拓扑”这其实是个误导性说法。“S接地”不是指某个管子的Source极直接连到substrate而是指整个VCO的供电和参考地必须通过一个低阻抗、低电感的物理路径回到芯片的substrate tap衬底抽头。台积电28nm工艺的substrate电阻率约10Ω·cm如果VCO的VDD via离substrate tap超过100μm那么在2.4GHz频点下这段路径的感抗可达0.5Ω——这0.5Ω的阻抗会把数字开关噪声直接耦合进VCO的bias line导致相位噪声恶化15dBc/Hz以上。所以“S接地”的核心是物理布局VCO模块必须紧邻substrate tap放置所有VDD和GND via必须成对、等距、密集打孔间距≤5μm且via下方的metal层必须铺满形成“ground plane power plane”的微带线结构。我见过太多人把VCO画在die的角落只为了节省面积结果实测相位噪声比仿真差20dB重布线后仅靠优化via placement就找回了12dB。3. 核心模块逐个拆解从电路意图到版图陷阱3.1 Op Amp不是增益带宽积GBW越大越好而是“稳定裕度”决定生死Op Amp在AMS电路里无处不在LDO的误差放大器、PLL的电荷泵CP积分器、BGR的缓冲器。但新手常犯的错误是死磕GBW和相位裕度Phase Margin却忽略了一个致命细节输入共模电压范围ICMR与输出摆幅Output Swing的动态匹配。以LDO的EA为例假设Vout1.8VVref1.2V那么EA的输出必须能驱动pass device的gate到接近1.8VPMOS或低于0VNMOS。如果EA用的是普通两级运放其输出级是PMOS load NMOS driver那么当输出需要拉到1.8V时NMOS driver必须完全关断此时它的Vgs0但实际工艺中NMOS的Vth有±50mV偏差一旦Vth偏小NMOS就漏电导致输出无法真正达到VDD。我的方案是EA输出级强制采用rail-to-rail结构且NMOS driver的gate接一个自举bootstrap电压确保Vgs始终大于Vth200mV。这个自举电路只增加3个管子和1个电容但实测让LDO在全温度范围内都能稳定输出1.8V±10mV。注意自举电容不能用MOMMetal-Oxide-Metal电容因为它的电压系数Voltage Coefficient太大随Vout变化电容值漂移超15%。必须用deep nwell MOS cap其电压系数0.5%/V。这个细节PDK文档里不会写但台积电FAE在一次debug call里亲口告诉我“你们的电容选型错了换MOM试试”3.2 BGRBandgap Reference曲率补偿不是“加个三极管”而是温度系数的精确博弈BGR的输出电压公式是Vref Vbe K·ΔVbe其中Vbe随温度升高而下降-2mV/℃ΔVbe随温度升高而上升0.5mV/℃。K值决定了补偿力度。但K不是固定值它由R1/R2电阻比决定而电阻的TCRTemperature Coefficient of Resistance在不同工艺角下变化极大。台积电28nm的poly电阻TCR标称值是100ppm/℃但实测在SS角下可能变成180ppm/℃在FF角下只有60ppm/℃。这意味着同一个K值在不同工艺角下补偿效果天差地别。我的做法是放弃单点温度补偿改用双温度点校准。电路里加一个额外的温度传感器用两个二极管的Vbe差值做粗略测温在-40℃和125℃两个点分别测量Vref然后用一个简单的数字逻辑4-bit counter XOR gate生成trim code控制一组NMOS switch动态调整R1/R2的并联电阻值。这套方案增加了约150μm²面积但让Vref在全工艺角、全温度范围内的最大偏差从±35mV压到了±8mV。3.3 LDOLow Dropout Regulator纹波抑制比PSRR的瓶颈不在运放而在pass device的寄生LDO的PSRR曲线通常在1MHz以下很高60dB但在10MHz以上骤降20dB。很多人归咎于运放带宽不够其实根源在pass device——无论是PMOS还是NMOS它的body effect体效应和source/drain junction capacitance源漏结电容构成了一个天然的低通滤波器。以PMOS pass device为例其source端接VDDdrain端接Voutbulk端接VDD。当VDD上有100MHz噪声时这个噪声会通过bulk-source junction capacitanceCbs耦合到drain端直接污染Vout。解决方案有两个层级第一层是器件级选用high-voltage tolerant PMOSHVPMOS其Cbs比标准PMOS小40%因为HV器件的junction depth更深耗尽区更窄。第二层是系统级在VDD pin附近紧贴LDO的VDD输入端放置一个0.1μF的MLCC decoupling capacitor并用最短的bond wire连接——这个电容的ESL等效串联电感必须0.3nH否则在100MHz下它的阻抗反而比PCB走线还高。我实测过用普通0402封装的MLCCESL≈1.2nHPSRR在100MHz时只有12dB换成0201封装定制low-ESL padESL降到0.25nHPSRR提升到38dB。3.4 VCOVoltage Controlled OscillatorRing VCO不是“简单”而是“可控性差”但高频段无可替代搜索热词里有“Ring VCO”这确实是入门首选因为结构简单奇数级反相器首尾相连。但它的问题在于tuning range调谐范围和phase noise相位噪声的trade-off极端尖锐。每级反相器的delay由Vctrl控制但delay对Vctrl的灵敏度KVCO在低Vctrl时很大高Vctrl时很小。结果就是VCO的KVCO不是常数而是随频率变化——这直接导致PLL的loop bandwidth不稳定严重时失锁。我的经验是Ring VCO只用于5GHz的高频段且必须配合digital calibration。具体做法在VCO输出后加一个frequency divider分频器把输出分频到100MHz以下再用一个digital counter实时测量周期根据测量值动态调整Vctrl的DAC code使KVCO保持在目标值如50MHz/V。中兴国际的5G毫米波收发器里我们用7级ring VCO跑28GHz配合16-bit DAC和on-chip counter最终KVCO variation ±3%远优于传统analog tuning。实操心得Ring VCO的每一级反相器必须用identical layout完全相同版图包括finger width、length、spacing甚至metal routing direction。我曾因某一级的poly spacing比其他级多20nm导致该级delay偏差0.8ps整个VCO的相位抖动jitter恶化了35%。3.5 PLLPhase Locked Loop电荷泵CP的“dead zone”不是bug是设计者留的后门PLL的CP是核心但它的“dead zone”死区常被当作缺陷。实际上dead zone是刻意设计的当UP/DN信号同时为高时CP必须彻底关断否则会产生glitch current毛刺电流直接注入VCO的control line造成相位噪声激增。但关断太“干净”又会导致tracking error跟踪误差。我的方案是CP的UP/DN开关管必须用cascode结构且cascode管的gate bias用一个temperature-compensated voltage source。这样当UP/DN同时有效时cascode管会进入线性区形成一个微小的、可控的导通电阻约10kΩ让少量电流泄放既避免glitch又维持了loop的DC gain。这个设计让我们的PLL在-40℃~125℃范围内lock time锁定时间变化15%而不用任何外部calibration。3.6 CDRClock and Data Recovery眼图张开度Eye Opening的敌人不是抖动而是电源轨的同步噪声CDR的性能指标是BER误码率和jitter tolerance抖动容限但实测中最难搞定的是眼图底部的“shadow”——看起来像抖动其实是电源噪声。原因在于CDR的PLL和data sampler数据采样器共享同一个VDD rail。当sampler在每个bit edge采样时它会瞬间汲取大电流导致VDD rail产生一个尖峰噪声这个噪声又被PLL的VCO感知形成feedback loop让clock phase发生微小偏移。解决方案是CDR必须split power domain分割电源域。PLL的VDD1和sampler的VDD2必须物理隔离各自用独立的LDO供电且两个LDO的output capacitor必须用不同value如VDD1用1μFVDD2用0.47μF避免resonance谐振。我们在AD9361兼容的收发器项目里就是靠这个分割把眼图底部的shadow从15% UI压到了2% UI。4. 实操全流程从Cadence启动到wafer测试报告4.1 Cadence Virtuoso环境配置别让PDK版本毁掉三个月工作台积电的PDK不是“下载即用”它有严格的版本依赖链。以28nm HPHigh Performance工艺为例PDK v1.2.3要求Spectre simulator必须是v15.20.373而Cadence IC617的默认spectre版本是v15.10.212。如果强行用旧版spectre跑新版PDK仿真会“成功”但所有device model的corner参数都是错的——比如FF角下的Vth被设成0.35V实际应为0.28V。结果就是你花两周优化的LDO在tape-out后实测在FF角下直接失效。我的checklist在PDK安装目录下打开pdk_version.txt记录PDK version进入Cadence安装目录tools/spectre/bin/运行spectre -version确认simulator version查阅台积电提供的PDK_Compatibility_Matrix.pdf交叉验证最关键的一步在Virtuoso里新建cell画一个最小尺寸的NMOSrun simulation查看I-V curve对比PDK文档Figure 3.2的reference curve——如果curve shape一致说明PDK加载正确如果curve flat了说明model没load。4.2 Spectre仿真关键设置AC vs TRAN哪个才是你的真相Op Amp的GBWLDO的PSRRVCO的phase noise这些指标新手总爱用AC analysis交流分析。错。AC analysis假设电路工作在完美DC operating point它算的是小信号线性化模型而AMS电路的非线性如MOSFET的square-law region在大信号下会主导行为。比如LDO的PSRR在AC analysis里100kHz处可能是80dB但TRAN analysis瞬态分析里同样的频率由于pass device的nonlinear capacitancePSRR只有55dB。我的规则所有稳定性分析stability analysis必须用TRAN step response给LDO输入一个100mV step看输出overshoot和settling time所有noise分析必须用TRAN FFT跑1ms transient取后0.5ms数据做FFT比AC noise analysis更真实VCO的phase noise必须用PSSPeriodic Steady-State PNOISE这是唯一能准确捕捉周期性非线性噪声的方法AC analysis在这里完全失效。4.3 版图绘制避坑指南DRC/LVS通过≠可以流片DRCDesign Rule Check和LVSLayout Versus Schematic通过只是基本门槛。真正的陷阱在ERCElectrical Rule Check和ANTAntenna Rule Check。ERC检查是否有floating node浮空节点。BGR里常见的“启动电路”startup circuit如果设计不当其输出在正常工作时会悬空DRC不报错但实测会因漏电导致BGR无法启动。我的做法所有startup circuit的输出必须通过一个10MΩ resistor下拉到GND。ANT检查metal走线在刻蚀过程中是否因电荷积累击穿gate oxide。VCO的control line如果用thick metalM8长距离走线且没有插入antenna diode那么在fab的plasma etch step中积累的电荷会击穿VCO core的thin oxide transistor。解决方案每隔500μm在control line上插入一个antenna diode用NMOS的source/bulk shorted to GNDdrain接line把电荷泄放到substrate。4.4 流片后wafer测试如何从probe card data里揪出设计缺陷拿到wafer后probe test探针测试数据是第一手证据。但数据本身不会说话需要解读。例如LDO的output voltage在不同load current下漂移过大可能原因有三EA的PSRR不足 → 看VDD ripple和Vout ripple的correlation相关性如果高度相关是PSRR问题Pass device的Ron temperature coefficient → 给LDO加温到85℃看Vout drift如果drift方向与温度正相关是Ron问题BGR的temperature coefficient → 断开LDO的Vref input单独测BGR输出如果BGR也漂移是BGR问题。我在中兴国际的项目里就靠这个三步法在probe test当天就定位出是BGR的curvature compensation resistor的TCR选错而不是LDO版图问题省下了两周的FAFailure Analysis时间。5. 常见问题与排查技巧实录那些让我凌晨三点改版图的Bug5.1 “AD9361初始化到时CP OV RG HIGH被置为同时RX PLL没有锁定”这不是软件bug是硬件供电噪声这个现象在ADI的AD9361评估板上高频出现网上讨论都集中在driver代码或register配置。但实测发现根本原因是AD9361的RX PLL的VDDA_PLL电源和基带处理器的VDD_IO共享同一组DCDC converter。当基带处理器执行DDR burst read时VDD_IO rail产生一个200mV/10ns的fast transient这个transient通过shared inductance共享电感耦合到VDDA_PLL导致PLL的charge pump瞬间overload触发OV RG HIGH flag。解决方案硬件层在VDDA_PLL pin旁加一个10μF tantalum capacitor 100nF ceramic capacitor并联且tantalum的ESR必须1Ω用来dampen resonancelayout层VDDA_PLL的power plane必须完全独立与VDD_IO plane的gap 200μm且gap间fill dummy metal避免capacitive coupling。5.2 “LDO纹波测试结果比仿真高10倍”别急着改电路先查probe tipLDO的output ripple实测值远高于仿真90%的情况是probe setup问题。普通10x passive probe的ground lead长度10cm时其inductance ≈ 200nH在100MHz下阻抗高达125Ω根本无法真实捕获LDO的高频ripple。正确做法用active probe如Keysight N7020A其ground path电感1nH或用“ground spring”附件把probe ground直接焊到LDO output pad的nearest GND via上最关键示波器bandwidth必须≥500MHz且采样率≥2GS/s。我曾用100MHz示波器测LDO ripple显示“干净”换500MHz示波器后立刻看到120MHz的spike源头是PCB上一个未端接的clock trace。5.3 “VCO tuning range不够”不是电容阵列没加够是varactor的Q值被版图毁了VCO的tuning range由varactor变容二极管的Cmax/Cmin决定但Cmax/Cmin不仅取决于bias voltage更取决于varactor的Q值品质因数。Q值低C随V的变化就不线性。而Q值的最大杀手是varactor的surrounding metal。如果varactor上方或四周有dense metal layer密集金属层会形成parasitic capacitance把varactor的effective Q值从50拉到10。我的版图rulevaractor必须放在top metal layerM9且其上方3 layers内禁止任何metal fillvaractor的periphery边缘必须clearance ≥5μm且clearance区域内dummy fill density 0%所有连接varactor的metal line必须用minimum width最小线宽避免增加series resistance。5.4 “PLL lock time过长”不是loop filter参数错是VCO的KVCO在低温下崩溃PLL的lock time仿真和实测差异大常归因于loop filter的R/C值不准。但更隐蔽的原因是VCO的KVCOVCO gain在低温下急剧下降。台积电28nm的VCO在25℃时KVCO30MHz/V在-40℃时可能跌到8MHz/V。这意味着同样的loop filter低温下loop bandwidth会缩小到1/4lock time自然变长。解决方案硬件层在VCO的Vctrl path上加一个temperature-sensing circuit输出一个与温度负相关的voltage叠加到Vctrl上补偿KVCO drift软件层在system boot时run a quick frequency measurement用on-chip counter根据测得的actual KVCO动态调整loop filter的digital control word。5.5 “CDR眼图闭合”别只盯着jitter先看power supply的PSRRCDR的眼图vertical opening垂直张开度不足工程师第一反应是优化CDR的PLL bandwidth或data sampler的sampling point。但实测中最大的影响因子是VDDAanalog supply的PSRR。当VDDA上有10mV100MHz的noise时它会直接modulate data sampler的threshold voltage导致采样点左右晃动眼图变窄。排查步骤用network analyzer测LDO的PSRR确认在100MHz处是否40dB如果PSRR达标用current probe测VDDA rail的noise spectrum看是否有100MHz peak如果有peak检查PCB上是否有100MHz clock trace parallel to VDDA plane且distance 10mil —— 这是典型的crosstalk。解决reroute clock trace或在VDDA plane下layer加ground guard trace。6. 我的个人体会AMS设计不是技术竞赛而是风险管控的艺术做完第七个SoC项目我越来越确信AMS电路设计的终极能力不是写出多漂亮的电路图而是预判哪里会出问题、以及出问题后怎么快速定位。台积电的PDK文档有3000页中兴国际的design checklist有127条但真正决定tape-out成败的往往是那几条没写进文档的“潜规则”。比如BGR的启动电路PDK里说“推荐用3个反相器”但实测发现在SS角下3级反相器的delay margin只有1.2ns而工艺波动会让delay增加到1.8ns导致启动失败——这时你得自己加一级buffer哪怕多占20μm²。再比如VCO的tuning linePDK规定min spacing是0.13μm但为了压低phase noise我把它强制加到0.25μm代价是面积多3%换来的是-112dBc/Hz1MHz offset客户验收时直接加分。这些选择没有标准答案只有权衡。所以如果你正在为LDO的纹波发愁或者被VCO的相位噪声折磨别只盯着仿真波形去翻翻你的版图去量量probe的ground lead去查查PDK的compatibility matrix——真正的答案往往藏在那些没人提醒你的细节里。最后分享一个小技巧每次tape-out前把所有关键模块的版图用手机拍一张高清照片存在手机相册里。当wafer测试fail时打开这张照片用手指划过每一条metal line问自己“这条线有没有可能引入寄生这个via是不是离substrate tap太远”——有时候最有效的debug工具就是你自己的眼睛和常识。
企业数字化 ERP 产品动态
相关推荐
亚马逊侵权扫号资金冻结全流程申诉实操:4.5万美金47天解冻记录 每年旺季前后,总有一波“扫号”让跨境卖家措手不及。我自己的账号也曾在去年经历类似问题,早上打开后台,店铺正常,但资金预留被扣住,邮箱里躺着一封侵权投诉通知。那一瞬间的感觉,相信经历过的朋友都懂——… · 2026/9/25 3:58:17
Hypothesis 3.6.0 应急发布解析:从反编译字节码回归源码提取,移除 GPL 隐患依赖 测试开发工具 【免费下载链接】hypothesis The property-based testing library for Python 项目地址: https://gitcode.com/gh_mirrors/hy/hypothesis 点击查看 免费下载 本文以 Hypothesis 3.6.0(2016-10-31 发布)的应急发布公告为骨架&am… · 2026/9/25 3:58:17
宇树G1机器人SSH远程连接与网络调试实战指南 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 4:23:29
邮件安全Agent隔离部署的得与失:从断网沙箱到白名单出口架构 前阵子有个做企业安全运维的朋友问我:把邮件安全Agent部署到一台禁止外网访问的沙箱里,是不是直接断了后路?就算Agent被攻破,也无法对外弹shell、发数据,这样是不是就等于安全性拉满了?这个问题问得很典型。… · 2026/9/25 4:23:29
ESP32上WASM调用硬件为何受阻?宿主函数与HAL封装的正解 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 4:23:29
局域网服务器被入侵的常见路径与系统加固实战指南 哥们儿,看到这个标题我估计你十有八九是运维或者网管,要么就是公司里那个“兼职管服务器”的倒霉蛋。局域网服务器被搞,这事儿我太熟了,尤其是那种内网啥都往里塞、防火墙当摆设的环境,中招往往不是被外部黑客花式吊打… · 2026/9/25 4:23:29
MATLAB贝叶斯分类实战:从先验设置到可部署模型 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 4:23:22
AI图生视频实战:用ComfyUI让唐代仕女图跳舞 从一张静态仕女图,到一段能跟随音乐舞动的小视频,中间只差一套“AI 图生视频”工作流。这篇文章不聊玄乎的概念,直接拆解市面上常用的实现路线,带你从环境搭建、模型选择、ComfyUI 工作流设计,到批量合成视频ÿ… · 2026/9/25 4:23:22
创维E900V22D刷机全攻略:S905L3SB芯片兼容性解析与救砖实战 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 1:00:31
MQTT协议原理与Broker服务器搭建实战:从Mosquitto到EMQX /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 1:00:37