做 PCB 的应该都遇到过这种场面:板子已经布线布到八成了,结构、成本或者板厂那边突然来一句,"过孔改成 0.2/0.45,原来的 0.3/0.6 太占地方"或者"这个孔太小不好做,统一放大一号"。手动一个个改?几百上千个孔,改到半夜都改不完,还容易漏。Cadence Allegro 里替换过孔类型(准确说是替换 padstack 里的过孔定义)其实有很成熟的路子,从全局替换、规则层替换到 SKILL 批量处理,一把梭下来的时间成本可以从两小时压缩到两分钟。这篇就把 Allegro 里替换过孔类型的五种做法、替换前必须核算的参数、以及我这些年踩过的坑一次讲透。不管你是刚学 Allegro 的新手,还是已经能独立出光绘的老手,只要涉及改板、降成本、叠层变更或者高速信号优化,这篇都能直接拿去用。
1. 先搞清楚:过孔在 Allegro 里到底被谁"管着"
很多人替换过孔失败,不是因为操作不熟,是因为没搞清楚一个基本事实:Allegro 里一个过孔同时被三套东西约束着,你只改了其中一套,另外两套没跟上,问题就会在出光绘或者板厂反馈的时候集中爆发。
1.1 Padstack 是过孔的实体,不是符号
过孔在 Allegro 里的本质就是一个 padstack(焊盘栈)在板上的实例。padstack 里面定义了什么?钻孔直径(Drill)、各层的 Regular Pad、内层的 Thermal Relief 和 Anti Pad、SolderMask Top / Bottom 的开窗、以及最关键的层范围——从哪一层贯穿到哪一层。
通孔是 TOP 贯穿到 BOTTOM,盲孔是 TOP 到内层某一层,埋孔是内层到内层。这个"层范围"在 Padstack Editor 里通过 Start Layer 和 End Layer 两个下拉框确定。记住这一点,后面讲替换失败的原因时你会用到:如果原 padstack 是通孔,你替换成的新 padstack 是盲孔,跨层结构对不上,Allegro 会直接拒绝替换或者报错。
还有一点新手容易混淆:padstack 不是一个"元件",它是一个数据库对象。你在 Constraint Manager 里写的 via list 只是引用了 padstack 的名字,并不是把 padstack 复制过去。所以改了库里的 padstack,板上已经存在的过孔不会自动变——这个逻辑和"改了封装库,板上封装不会自动更新"是一样的。
1.2 三处独立定义:规则里的 via list、库里的 padstack、板上的实例
把这三处的关系理顺,替换过孔这件事就通透了一半:
| 定义位置 | 作用范围 | 改动的实际效果 |
|---|---|---|
| Constraint Manager 的 Physical → Vias | 影响新走线 | 只决定接下来打孔用哪个,板上老孔纹丝不动 |
| 库文件(.pad,通过 padpath 搜索) | 影响所有引用它的设计 | 库里改了但板上不刷新,等于没改 |
| 板上过孔实例 | 影响当前这块板 | 这才是最终要出的数据 |
三处之间没有任何自动同步机制。这就解释了最常见的困惑:"我把 Constraint Manager 里的 via list 改了,为什么板子上还是老孔?"——因为约束管理器只管走线时的默认选择,它压根不管已经躺在板上的过孔。
反过来也一样。你用 Padstack Replace 把板上的孔全换成了新 padstack,但如果约束管理器里 via list 还是老的那一个,下一根线打孔的时候又给你打出一个老孔,等于白干。所以一套完整的替换流程,永远是把"规则"和"实例"两个层面都覆盖到。
1.3 替换过孔前必须先确认的四个前提
动手之前,先花五分钟确认下面四件事,能省掉后面两小时的返工。
第一,新 padstack 是否已经在库里,且 padpath / psmpath 能搜到。找不到的 padstack 在替换对话框里根本不会出现,很多人以为软件坏了,其实是路径没配。
第二,新 padstack 的层跨度是否和原孔兼容。通孔换通孔最省事;通孔换盲孔,必须确保叠层已经调整过,否则替换后 DRC 会报跨层错误。
第三,新 padstack 有没有定义 SolderMask Top / Bottom。这一步极其容易被忽略——如果你新建 padstack 的时候只填了 Regular Pad,忘了 SolderMask,替换完之后板厂会发现过孔上面没有开窗,直接一个工程问题单打回来。
第四,先备份 brd。替换类操作是不可逆的,Allegro 的 Undo 在这种批量数据库修改上并不总是可靠。存一个xxx_before_via_replace.brd的成本是零,收益是保命。
2. 替换过孔的五种动手方式,按场景选
Allegro 提供了不止一种替换过孔的入口,它们各自适用的场景完全不同。全局替换快,SKILL 灵活,手动 Change 精准。下面按"从快到细"的顺序讲。
2.1 方式一:Tools → Padstack → Replace 全局替换
这是绝大多数情况下应该优先用的方法。菜单路径在 16.6 和 17.x 上略有差异(16.6 在 Tools 菜单下面,17.x 同样在 Tools 下,叫 Padstack),但入口名字基本都带 Padstack 和 Replace 字样,找不到的话直接在命令框输入padstack也能唤起。
打开对话框之后,界面上主要是这几项:
- Original Padstack:下拉列出当前设计里用到的所有 padstack,选你要换掉的那个。
- Replacement Padstack:下拉列出库里所有可用的 padstack,选新的。
- Replace 作用对象的筛选:可以限定为 Vias(过孔)、Pins(引脚)或者全部。这一项一定要看,我见过有人手滑把 Pin 也勾上,结果 BGA 的焊盘全被换掉了,那真是灾难。
- Find by:可以按 padstack 名称、按 property(属性)、按 region(区域)来筛选,做局部替换时非常有用。
- Replace 按钮:点击执行。
一个实际操作的顺序建议:先在下拉框里选 Original,点一下某个高亮或者 Count 之类的按钮看看影响范围有多少个对象,心里有数了再点 Replace。如果数量是 800 个而你预期只有 50 个,说明筛选条件选错了,赶紧停下来。
替换完成后不要马上关软件,用 Tools → Reports 里的 Padstack Usage 报告核对一遍,看老的 padstack 使用数量是否归零。如果还剩几个,说明有漏网之鱼,多半是被锁定或者是某个 Symbol 内置的,留到第 4 章专门讲。
2.2 方式二:约束管理器里改 via list,管的是"以后"
进入 Setup → Constraints → Constraint Manager,打开 Physical 工作表,找到 All Layers 那一行,最右边有一列叫 Vias。双击这个单元格,会弹出 Via List 对话框。
这个列表可以放多个 padstack,走线时按从上到下的顺序循环切换。具体切换方式是:走线状态下,点击 Options 面板里 Via 图标右侧的小箭头,或者用键盘快捷键(不同版本的默认键位不一样,17.x 里可以在快捷键设置里自己绑)。多放几个孔在列表里,配合快捷键,走线时随手切换孔径,做 BGA 区域的 fanout 特别顺手。
需要注意的是,Via List 里第一位的那个是"默认过孔",如果列表里只放一个,那走线时就没有选择余地。做高频板的时候,我一般会在列表里放三到四个:一个 0.2/0.45 的激光孔用于 BGA 内部 fanout,一个 0.3/0.6 的常规通孔用于普通信号,一个 0.5/0.9 的大孔用于电源和地缝合。
改完 Via List 之后,一定要顺便检查一下 Design Rule 里有没有对过孔尺寸的额外约束,比如某些网络被单独指定了 allowed via 列表。这类按网络覆盖的规则优先级高于全局规则,经常是"我明明改了全局,为什么这根线还是打老孔"的元凶。
2.3 方式三:手动 Change,适合零星几处
如果只是三五个孔要改,比如某个散热焊盘下面想换成大孔加强导热,用 Change 最快。
操作流程是:先按 Find 面板,只勾选 Vias(记住把 Pins、Symbols、Shapes 全部取消勾选,否则很容易误选),然后在板上点中要改的过孔,右键 → Change,或者在 Options 面板里选择目标 padstack,回车确认。
这里有个细节值得说:多选的时候按住 Shift 可以框选,但如果你的过孔分布在一片密集的 BGA 区域里,框选很容易连散热孔、测试点一起选中。更稳的做法是先给这些过孔加一个 property(比如给它们打一个自定义属性标签),然后用 Padstack Replace 对话框里的 Find by Property 功能精准筛选。这个属性驱动的做法在改板场景里极其好用,值得养成习惯。
2.4 方式四:改库 + Update Symbols,适合统一版本管理
有些团队的做法是在库层面维护 padstack 版本。比如把库里的VIA_0_25_0_5更新成新参数,然后让所有设计重新引用。这个思路没错,但操作上有个陷阱:直接改库文件不会让板上的实例自动更新,必须走 Tools → Update Symbols 或者刷新 padstack 的动作。
而且 Update Symbols 通常针对的是封装(Symbol),对独立的过孔实例不一定生效。过孔不属于任何一个 Symbol 时,Update 是刷不到它的。所以库里改完仍然要回到方式一,用 Padstack Replace 把板上的实例换过来。库和板的关系更像"模板"和"已印出来的纸",改了模板,纸上已有的字不会自己变。
我的建议是:把库更新和板上替换当成两个动作,先更新库,再做一次 Padstack Replace,中间不要跳过。这样库和板永远一致,后面别人接手改板的时候不会因为库不一致而抓瞎。
2.5 方式五:SKILL 脚本,按网络、按区域批量处理
当板子大到几千个孔,或者需要按网络名、按坐标区域做精细区分时,交互式替换就有点力不从心了。这时候上 SKILL。
下面这段是一个思路清晰的模板,做的事情是遍历板上所有过孔,按网络名筛选,然后替换指定 padstack。注意不同版本的 axl 函数名有差异,16.6 和 17.4 之间尤其明显,实际使用前请先在你手上的版本里小范围试跑,不要直接对着主文件跑。
; via_swap.il 按网络名批量替换过孔 padstack axlCmdRegister("via_swap" 'viaSwap) procedure(viaSwap() let((newPad netFilter sel cnt) ; 提示输入目标 padstack 名和网络名 newPad = axlUIWGetString("输入新 padstack 名称: ") netFilter = axlUIWGetString("输入网络名(留空=全部): ") when(newPad ; 打开 Find 过滤器,只选 Vias axlSetFindFilter(?enabled list("vias") ?onButtons list("vias")) axlClearSelSet() axlAddSelectAll() sel = axlGetSelSet() cnt = 0 foreach(v sel when((netFilter == "" || v->net->name == netFilter) ; 替换动作,函数名请以本机 axlfunref 文档为准 axlDBReplacePadstack(v newPad) cnt++ ) ) axlMsgPut("已处理 %d 个过孔" cnt) ) ) )写 SKILL 的时候有几个实用习惯:第一,永远先axlMsgPut打印影响数量,确认无误再执行实际修改;第二,先在副本上跑;第三,把axlDBReplacePadstack这行注释掉,换成打印过孔坐标,验证筛选条件对不对。第二步验证省下来的返工时间,远超写这几行脚本的成本。
如果不想写脚本,还有个零门槛的替代方案:利用 Design 里的 Selection Filter 配合 Highlight 功能,先把符合条件的过孔高亮出来存成一个 Group,再用 Padstack Replace 处理。效率不如脚本,但胜在不用懂代码。
2.6 推荐的操作顺序,别搞反了
把上面几种方法串起来,一套可靠的替换流程是这样的:
- 备份 brd 文件。
- 确认新 padstack 在库里且 padpath 能搜到。
- 先改 Constraint Manager 里的 Via List(规则层),避免改完实例又被新走的线覆盖。
- 再用 Tools → Padstack → Replace 处理板上实例(数据层)。
- 跑 DRC,重点看过孔相关的环宽、间距、SolderMask 报错。
- 重新生成钻孔表和光绘,核对钻孔种类和数量。
- 核对 Padstack Usage 报告,确认老 padstack 已经归零。
顺序搞反的后果很具体:如果先替换实例再改规则,你在检查阶段走的每一根测试线都会打出老孔,最后统计的时候发现老 padstack 又冒出来了,还得再来一遍。
3. 替换前的参数核算:换多大的孔不是拍脑袋
替换过孔从来不是为了换而换,背后一定有约束。要么是板厂反馈孔径太小做不了,要么是成本要压,要么是信号完整性要求变了。所以替换之前,你得知道新孔的参数是怎么算出来的。
3.1 孔径、盘径与加工能力的对照表
机械钻孔和激光钻孔的能力边界差别很大。下面这张表是我在整理多个板厂能力表之后归纳的常用区间,具体项目还是要以合作板厂的工艺能力表为准。
| 孔类型 | 钻孔直径(成品) | 常规盘径 | 加工方式 | 成本档位 |
|---|---|---|---|---|
| 常规通孔 | 0.30 mm | 0.60 mm | 机械钻 | 基准 |
| 小孔通孔 | 0.25 mm | 0.50 mm | 机械钻 | 略高 |
| 极限通孔 | 0.20 mm | 0.45 mm | 机械钻(高纵横比受限) | 偏高 |
| 激光微孔 | 0.10 mm | 0.25 mm | 激光钻 | 高 |
| 激光微孔 | 0.15 mm | 0.30 mm | 激光钻 | 中高 |
| 盘中孔 | 0.15-0.25 mm | 0.30-0.45 mm | 激光或机械 + 树脂塞孔电镀 | 高 |
这里有个换算关系必须清楚:Allegro 的 Padstack Editor 里填的 Drill 尺寸是"设计值",板厂实际钻出来的成品孔径会受镀铜厚度影响,一般成品孔径等于设计值减掉约 0.05 mm(视镀铜厚度而定)。所以当你看到板厂反馈"最小成品孔径 0.20 mm"时,设计值大概填 0.25 mm 比较稳妥。这个换算搞错了,会出现"设计上没问题,做出来孔太小插不进"的尴尬。
3.2 环宽、反焊盘与 SolderMask 开窗的连带关系
换过孔的时候,环宽(Annular Ring)是最容易出问题的地方。环宽等于盘径减孔径再除以二。比如 0.6 的盘配 0.3 的孔,单边环宽就是 0.15 mm。如果你把孔径换成 0.35 而盘径没变,环宽就掉到 0.125 mm,可能低于板厂的最小环宽要求。
行业里通常要求成品环宽不低于 0.05 mm,做到 0.10 mm 以上比较保险。注意这是"成品"环宽,要考虑加工偏差和层偏,所以设计值一般要在 0.15 mm 以上才踏实。高级别要求的板子,环宽要求会更严,具体标准参照 IPC 相关规范按产品等级执行。
反焊盘(Anti Pad)的尺寸一般比 Regular Pad 大 0.15 到 0.25 mm,作用是保证过孔和平面层之间有足够的电气间隙。替换过孔的时候,如果新 padstack 的反焊盘尺寸和其他网络的间距不够,DRC 会报一堆净空不足。这个往往不是过孔本身的问题,而是新 padstack 建库时参数没核对。
SolderMask 开窗这件事前面提过一次,这里展开说:过孔的定义里,SolderMask Top 和 Bottom 通常比 Regular Pad 大 0.05 到 0.1 mm。如果你做的是盖油过孔(Tented Via),那就需要在 padstack 里把 SolderMask 尺寸设成和 Regular Pad 一样或者干脆不定义。这两种做法对应的光绘输出结果完全不同,替换之前一定要和板厂、和硬件确认清楚是盖油还是不盖油。我见过一个项目,改板时把带开窗的 padstack 换成了不带开窗的,导致一批测试点无法探针接触,只能重新投板。
3.3 载流与散热:什么时候必须换成大孔
过孔导通电流的能力取决于孔壁镀铜的截面积。粗略估算的思路是:过孔孔壁的横截面积约等于 π × 孔径 × 镀铜厚度。假设镀铜 25 μm,孔径 0.3 mm,那么单孔壁截面积约为 3.14 × 0.3 × 0.025 ≈ 0.0236 mm²,折算下来大致相当于 1 盎司铜厚下一段很窄的走线。所以大电流路径上,单个过孔往往是不够的,要靠多个并联。
实际操作中的经验值:电源和地网络上,我一般用 0.5 mm 孔径配 0.9 mm 盘径,按每孔 1 A 到 1.5 A 估,再留一倍余量。如果某条电源路径要过 8 A,那就打 8 到 12 个 0.5 的孔并联,并且在平面上做足够的铜皮连接。替换过孔时如果原来是 0.3 的孔要改成 0.25,电源网络的孔必须单独处理,不能一刀切。
散热也是同理。芯片底部散热焊盘下面的过孔阵列,孔径和数量直接影响热阻。把这类孔换成更小的尺寸,散热路径会明显变差。所以用 Padstack Replace 做全局替换时,通常要先把散热孔和电源孔排除掉——用 Find by Property 或者 Network 筛选就能做到。
3.4 高速信号的过孔 stub 与背钻
当信号速率上到几个 Gbps,过孔就不只是一个导通结构了,它变成一个阻抗不连续的节点。过孔的影响主要来自两个部分:孔盘的寄生电容和多余孔壁形成的 stub 电感。经验上,过孔的电感大约在每毫米 1 nH 量级,孔盘电容在 0.3 到 0.5 pF 量级。
stub 是指信号从表层进入内层走线之后,过孔孔壁继续延伸到板底的那一段"多余尾巴"。这段尾巴在低频下可以忽略,但在高频下相当于一个谐振腔,会在特定频率上把信号吃掉一块。解决办法就是背钻——把多余的那段孔壁钻掉。在 Allegro 17.x 里,背钻是通过 padstack 里的 Backdrill 层对来定义的,可以设置背钻的直径和深度。
所以当你做高速板的过孔替换时,如果原来没有背钻,现在要加背钻,那就不只是换一个 padstack 名那么简单,还得重新定义带背钻的 padstack,并且重新检查叠层里各信号层的位置关系。这类替换的复杂度比普通通孔替换高一个量级,建议单独开一个章节做验证,不要和常规孔替换混在一起做。
3.5 一张可以直接抄的选型表
下面这张表是我自己项目里常用的默认配置,按用途区分,可以直接拿去改:
| 用途 | 孔径 / 盘径 | 说明 |
|---|---|---|
| BGA 内部 fanout | 0.20 / 0.45 mm | 需要板厂确认机械钻能力,或改激光孔 |
| 普通信号换层 | 0.30 / 0.60 mm | 通用性最好,成本最低 |
| 电源、地缝合 | 0.50 / 0.90 mm | 载流和散热都占优 |
| 散热焊盘阵列 | 0.30 / 0.60 mm,盖油 | 数量优先,孔径适中 |
| 高频差分换层 | 0.25 / 0.50 mm,带背钻 | 配合反焊盘优化阻抗 |
这张表里的参数不是标准答案,是起点。真正定下来之前,一定要发给板厂确认一次,尤其是 0.2 这一档。板厂的"能做"和"做好了良率还行"是两回事,前者是能力上限,后者才是你该用的值。
4. 常见问题与排查实录
这一章是我这些年替换过孔踩过的坑,按出现频率排序。
4.1 替换完 DRC 爆一堆,先看这三条
替换过孔之后 DRC 报错是正常的,因为新 padstack 的所有参数都变了。但报错的类型能帮你快速定位问题。
最多的三类是环宽不足、间距不足和 SolderMask 相关问题。环宽不足的报错,检查新 padstack 的盘径和孔径比值;间距不足的报错,检查反焊盘尺寸,特别是和平面层之间的间隙;SolderMask 相关的报错,检查新 padstack 有没有定义 SolderMask 层,以及开窗尺寸是否合理。
排查时有个技巧:在 Constraint Manager 里临时把报错类别对应的 DRC 开关关掉,先看看是不是只有这一个类别在报,避免被淹没在几百条错误里。确认问题范围之后再把开关打开,针对性处理。
4.2 替换不生效、报 cell read-only 或者找不到 padstack
三种情况各有原因。
替换对话框里选不到新 padstack,多半是 padpath 没配。到 Setup → User Preferences → Paths → Library 里检查 padpath 和 psmpath 路径,确认新 padstack 所在目录在列表里。改完路径记得重启一下或者在命令里刷新一下缓存,有时候路径加了但列表没更新。
报 cell read-only 或者类似提示,通常是这个 padstack 被某个已经锁定的对象引用,或者相关文件属性是只读的。检查文件系统权限,同时确认板上有没有被 Fix 锁定的对象引用它。解锁之后重试。
替换执行了但板子没变化,最常见的原因是 Find 过滤器没选对,或者替换对话框里的作用对象没勾上 Vias。还有一个隐蔽原因:你替换的那个孔其实属于某个 Symbol 的一部分(比如连接器封装自带的地孔),Symbol 未解锁时它的内部对象不能单独替换。
4.3 有孔漏网:锁定、Fanout、散热孔、安装孔
全局替换之后用 Padstack Usage 报告核对,如果老 padstack 还剩几个,大概率是下面这几种:
- 被 Fix 锁定的过孔。解锁后再替换。
- Fanout 生成的过孔。这类孔有时带有特殊属性,需要单独筛选处理。Allegro 有专门的 Fanout 相关操作,可以在 Fanout 参数里改默认过孔,也可以对已有的 fanout 孔做替换。
- 散热焊盘下的过孔阵列。这些孔通常是手动放置或用阵列工具生成的,和普通信号孔混在一起,但用途完全不同,应该单独处理。
- Symbol 内部的过孔,比如屏蔽罩、大连接器封装里自带的接地孔。
- 测试点过孔。测试点有时候用的是专门的 padstack,替换成普通信号孔会导致测试点失效。
最省事的做法是替换之前先做一次分类,按网络、按属性、按区域把孔分成几组,一组一组替换。虽然前期多花十分钟,但避免了后期反复排查漏网之鱼。
4.4 光绘和钻孔表对不上
替换完过孔,光绘和钻孔数据必须重新生成一遍。这里面有两个容易忽略的点。
一是钻孔表。Manufacture → NC → Drill Legend 生成的钻孔表是基于当前设计的钻孔参数自动生成的,如果你没重新生成,表里还是旧的钻孔种类。换孔之后要重新跑一次,核对钻孔种类数量和设计里的实际种类是否一致。
二是光绘层里的过孔表现。如果新 padstack 的 SolderMask 定义和原来不同(比如从盖油变成开窗),光绘上的表现会变。这个变化是预期内的,但一定要在出光绘之前和板厂确认,避免版图发出去了才发现工艺要求和实际做法不符。
4.5 常见问题速查表
| 现象 | 可能原因 | 处理方式 |
|---|---|---|
| 替换对话框里找不到新 padstack | padpath 未配置 | 检查 User Preferences 里的库路径 |
| 替换后板子没变化 | Find 过滤器或作用对象选错 | 确认只勾选 Vias 并正确选择 Original |
| 报 cell read-only | 对象被锁定或文件只读 | 解锁对象,检查文件权限 |
| 替换后走线仍打老孔 | Via List 未同步修改 | 到 Constraint Manager 更新 Vias 列 |
| DRC 报环宽不足 | 盘径孔径比值过小 | 调整 padstack 参数或换更小的孔 |
| 部分过孔漏网 | 被锁定、属于 Symbol、Fanout 孔 | 分类后分批替换 |
| 钻孔表种类对不上 | 未重新生成钻孔数据 | 重新执行 Drill Legend 和 NC Drill |
| 过孔上面没有开窗 | 新 padstack 未定义 SolderMask | 补上 SolderMask 层参数 |
5. 几个用血泪换来的实操心得
第一个心得是关于时机的。替换过孔这件事,最好在布线完成度 60% 到 80% 的时候做一次,而不是等全部布完。原因很简单:越早替换,DRC 和后续走线的调整量越小;等布完了再换,一旦有环宽或者间距问题,牵动的走线范围会大得多。我在一个八层板上吃过这个亏,布完再换孔,结果 BGA 区域有三十多根线需要重走,白白多花了一天。
第二个心得是关于库管理的。项目里用的过孔 padstack 尽量收敛,不要一个项目里冒出十几个不同规格的过孔。我的习惯是把常用过孔整理成一个标准清单,加上清晰的命名规范,比如VIA_0R30_0R60_TH表示通孔 0.3 盘 0.6,VIA_0R20_0R45_BD表示带背钻。命名清晰之后,替换对话框里的下拉列表一眼就能找到目标,也不会出现替换错了孔径却看不出来的情况。
第三个心得是关于验证的。替换完不要只看 DRC 通过就算完,最好把板子导一次 3D 或者导出 PDF 版图,用眼睛扫一遍关键区域,看看过孔密度、散热阵列、测试点有没有异常。软件检查的是规则,人眼检查的是意图,两者互补。
第四个心得,也是我觉得最值钱的一条:替换过孔之前,把新旧 padstack 的完整参数列成一个对照表,包括孔径、盘径、反焊盘、SolderMask、层跨度、是否盖油这几项,逐项确认差异。这个动作只需要五分钟,但它能让你在做完替换之后立刻知道该重点检查什么。跳过这一步的人,往往是在板厂反馈问题的时候才回头去查参数,那时候损失的可就不只是时间了。