ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

Allegro Room属性实战:PCB重复模块批量布局与自动布局技巧

Allegro Room属性实战:PCB重复模块批量布局与自动布局技巧 1. 为什么Room属性值得你花5分钟认真对待做PCB布局的朋友大概率都遇到过这种场景一块板子上有8路一模一样的RS485收发电路或者4组DDR颗粒又或者十几路LED恒流驱动。原理图里画的时候是复制粘贴的网络标号自动递增看起来整整齐齐。但到了Allegro里做布局麻烦就来了——你得手动把每一路的去耦电容、限流电阻、匹配电阻一个一个拖到对应芯片旁边摆完第一路已经眼花摆到第八路的时候手都在抖。Room这个东西就是Cadence Allegro给这类“重复性模块”准备的批量管理工具。它的本质是一个逻辑分组容器你可以把原理图里属于同一功能模块的器件圈进一个Room然后在PCB Editor里对这个Room整体执行“抓取-移动-放置”的操作所有器件跟着Room一起走相对位置保持不变。更关键的是Room可以配合Placement Rule实现自动布局——你只需要摆好第一路作为模板剩下的几路让工具照着抄。这篇文章面向的是已经能打开Allegro、能导入网表、但还没系统用过Room的PCB设计者。我会从原理图端的Room定义讲起一路讲到PCB端的批量放置、规则约束、常见报错处理。中间会穿插我自己踩过的坑比如Room属性在网表里丢失、Room边界框不跟随器件、跨页Room无法识别等问题。看完你至少能省下每次布局重复模块时那两三个小时的机械劳动。提示Room功能在Allegro 16.6之后的版本中趋于稳定17.2和17.4对Room的支持最好。如果你还在用16.3部分Room相关的菜单可能位置不同但核心逻辑一致。2. Room属性的底层逻辑与两种创建路径2.1 Room到底是什么从原理图到PCB的传递链路很多人以为Room是PCB Editor里的功能其实它的根在原理图。Allegro的Room信息是通过网表传递的具体来说是在原理图工具Capture CIS里给器件赋予一个ROOM属性这个属性随着网表一起导入PCBPCB Editor读取后自动生成对应的Room对象。这里有一个关键点Room属性不是器件的固有属性而是用户自定义属性。在Capture里你需要手动在器件属性编辑器里添加ROOM这个Property Name值可以是任意字符串比如RS485_1、DDR_CH0、LED_DRV_A。同一个Room里的所有器件这个属性的值必须完全一致包括大小写。网表导入Allegro后你可以在PCB Editor的Display Color/Visibility里打开Rooms层就能看到每个Room的边界框。默认情况下Room的边界框是一个矩形自动包住所有属于该Room的器件。这个框的颜色、线型都可以在Color面板里调整。为什么要有Room因为Allegro的自动布局功能Placement需要一个“作用域”。没有Room自动布局只能针对整个板子或者手动选择的器件集合无法实现“按模块复制布局”。有了Room你就可以告诉工具“把这个Room里的器件按照那个Room的相对位置摆好。”这就是Room最核心的价值。2.2 在Capture里创建Room的两种方式第一种方式是手动添加属性。选中一组器件右键选择Edit Properties在Filter by里选Allegro或Cadence-Allegro然后找到ROOM属性。如果列表里没有就点New创建一个Property Name填ROOMValue填你的模块名。这种方式适合器件数量少、模块划分清晰的情况。第二种方式是使用Room向导。Capture CIS提供了一个Room菜单在较新版本中位于Tools Room可以自动根据页Page或根据选中的器件创建Room。我一般用“根据页创建”因为原理图设计时通常会把同一个功能模块画在同一页这样Room的划分和原理图结构天然对应不容易漏器件。这里有个实操细节如果你在原理图里用了层次化设计Hierarchical BlockRoom属性可以在子图里定义然后通过层次结构传递到顶层。但要注意如果同一个子图被多次实例化每个实例的Room值必须不同否则所有实例的器件会被合并到一个Room里布局时就乱了。解决办法是在顶层给每个实例的Room属性赋不同的值或者在子图里用$LOCATION之类的变量不过后者配置起来比较麻烦我一般直接手动改。注意Room属性的值不要用中文、空格或特殊字符。Allegro对网表里的属性值解析比较严格中文会导致乱码空格会被截断特殊字符可能直接让网表导入失败。用下划线加英文数字最稳妥。2.3 网表导入后Room的验证方法网表导入PCB Editor后第一件事是确认Room是否正确生成。打开Setup Constraints Constraint Manager在Worksheet Selector里找到Rooms这里会列出所有从网表导入的Room。如果某个Room没出现说明网表里没有正确传递属性。另一个验证方法是直接在PCB画布上查看。打开Color面板在Geometry分类下勾选Rooms然后放大看器件周围有没有出现矩形框。如果框没出现可能是Room层被隐藏了或者Room的边界框颜色和背景色太接近。我遇到过一种情况网表导入时提示“Room property found but no room defined”这是因为原理图里只给部分器件加了ROOM属性而Allegro期望同一个Room的所有器件都有该属性。解决办法是回到原理图检查是否漏了器件或者用Tools Reports生成一份器件属性报告筛选ROOM列看看哪些是空的。3. 批量设置Room属性的高效操作与参数计算3.1 用Excel辅助批量编辑Room属性当板子上有几十个重复模块时在Capture里一个一个改属性效率太低。我的做法是先在Capture里导出器件属性到CSVTools Export Property然后用Excel打开按ROOM列排序批量填充。比如所有RS485模块的器件在ROOM列统一填RS485_XX用Excel的填充功能自动递增。这里有一个参数计算的小技巧假设你有N路重复模块每路模块的Room值可以命名为MODULE_1到MODULE_N。在Excel里你可以用公式MODULE_ROUNDUP(ROW()/M,0)来生成其中M是每路模块的器件数量。这样即使器件在CSV里是乱序的也能保证每M个器件分到同一个Room。编辑完CSV后再通过Tools Import Property导回Capture。导回时要注意Capture会提示“是否覆盖现有属性”选择“是”。但建议先备份原理图因为属性导入有时会打乱原有的其他属性。3.2 Room边界框的手动调整与自动适配默认的Room边界框是自动计算的包住所有器件的外轮廓。但有时候这个框太大或太小影响视觉判断。你可以在PCB Editor里手动调整选中Room边界框右键Move或Resize。不过手动调整后如果器件移动了边界框不会自动跟随需要重新执行Shape Room Auto Generate。自动适配的规则是Allegro会计算Room内所有器件的外接矩形然后向外扩展一个Room Outline的间隙值。这个间隙值可以在Setup Application Mode Placement Edit里设置默认是0。我一般设为5-10 mil这样边界框和器件之间有一点余量看起来不拥挤。提示Room边界框的层属性是ROOM_TOP和ROOM_BOTTOM分别对应顶层和底层。如果你的板子有多个Room建议给不同模块的Room设置不同的颜色在Color面板里可以按Room名称单独设置。3.3 Room与Placement Rule的关联配置Room的真正威力在于和Placement Rule的配合。在Constraint Manager里找到Placement Room这里可以定义每个Room的放置规则比如Room内器件的间距最小间距、最大间距Room的放置区域允许放置在板子的哪个区域Room的旋转角度是否允许旋转旋转步进是多少这些规则在自动布局时会生效。比如你设置RS485_1的Room允许旋转90度那么自动布局时工具会尝试把整个Room旋转90度来适应空间。但要注意旋转是整个Room一起转Room内器件的相对位置不变。我一般会设置一个全局的Room间距规则比如所有Room内器件间距不小于10 milRoom之间的间距不小于50 mil。这样自动布局出来的结果不会太挤后续布线也好走。4. 元器件精准布局的实操流程与核心环节4.1 从第一个Room开始手动布局作为模板自动布局的前提是有一个“模板Room”。我的习惯是先手动摆好第一路模块把去耦电容放在芯片电源引脚附近匹配电阻放在信号路径上晶振靠近芯片时钟输入等等。摆的时候要注意信号流向和电源流向让后续布线尽量短。摆好第一路后选中这个Room的所有器件右键Place Place Room或者用Placement Edit模式下的Room工具。这时Allegro会把这个Room的布局信息记录下来包括每个器件的坐标、旋转角度、层。这里有一个关键参数Room的参考点。默认是Room边界框的左下角。如果你希望以芯片为中心复制布局可以把参考点设在芯片的某个引脚上。设置方法是在Placement Edit模式下选中Room右键Set Room Origin然后点击芯片的某个焊盘。这样后续复制时所有器件都相对于这个原点定位。4.2 批量复制Room布局的三种方式第一种是逐个复制。选中模板Room右键Copy然后点击目标Room的边界框Allegro会自动把模板Room的布局应用到目标Room。这种方式适合Room数量少的情况比如只有4路DDR。第二种是批量复制。在Placement Edit模式下框选所有目标Room然后右键Place Room选择模板Room。Allegro会一次性把所有选中的Room都按照模板布局。这种方式效率最高我一般用这种。第三种是脚本自动化。Allegro支持Skill脚本你可以写一个脚本遍历所有Room自动执行复制操作。比如axlCmdRegister(copyRoomLayout copyRoomLayout) defun(copyRoomLayout () let((templateRoom targetRooms) templateRoom axlDBGetDesign()-rooms-find(RS485_1) targetRooms axlDBGetDesign()-rooms-filter(lambda((r) r-name ! RS485_1)) foreach(target targetRooms axlRoomCopyLayout(templateRoom target) ) ) )这个脚本会把RS485_1的布局复制到其他所有Room。Skill脚本的好处是可以批量处理而且可以加入条件判断比如只复制顶层Room或者只复制特定前缀的Room。注意批量复制时如果目标Room的器件数量和模板Room不一致Allegro会报错“Room device count mismatch”。解决办法是回到原理图检查确保每个Room的器件完全一致。如果确实有差异比如某路模块多了一个滤波电容那就只能手动调整。4.3 布局后的微调与DRC检查批量复制完成后不要急着布线。先做一次DRC检查看看有没有器件重叠、间距违规。在Tools Quick Reports里选择Placement DRCAllegro会列出所有违规的器件对。常见的违规包括器件重叠两个器件的边界框相交。这通常是因为Room间距设置太小或者某个器件在模板里就和其他器件靠得太近。Room边界框重叠两个Room的边界框相交。这会影响后续的自动布局和布线需要调整Room的位置。器件超出板框某个Room被放到了板子外面。这通常是因为复制时参考点选错了或者板框太小。微调时我一般用Placement Edit模式下的Move命令选中整个Room移动而不是单个器件。这样可以保持Room内器件的相对位置不变。如果只需要移动Room内的某个器件可以按住Ctrl键再选这样就只移动单个器件。5. 常见问题与排查技巧实录5.1 Room属性在网表里丢失的排查这是最常见的问题。现象是原理图里明明加了ROOM属性但PCB Editor里看不到Room。排查步骤检查网表文件用文本编辑器打开网表通常是.net文件搜索ROOM关键字。如果没有说明Capture没有把属性导出。在Capture里检查Tools Create Netlist的设置确保勾选了Export Properties。检查属性名称Allegro对属性名称大小写敏感。ROOM和Room是不同的。建议统一用大写。检查属性值如果属性值包含空格或特殊字符网表解析会出错。用下划线代替空格。检查器件范围如果只有部分器件有ROOM属性Allegro可能不会创建Room。确保同一个Room的所有器件都有该属性。5.2 Room边界框不跟随器件的解决方法有时候你移动了Room内的器件但边界框没动。这是因为边界框是静态的需要手动更新。执行Shape Room Auto Generate选择对应的RoomAllegro会重新计算边界框。如果Auto Generate后边界框还是不对可能是Room的Outline属性被锁定了。在Find面板里选择Rooms然后选中边界框右键Unlock再重新生成。5.3 跨页Room无法识别的处理如果原理图用了多页设计同一个Room的器件分布在不同的页上Capture默认可能不会把它们识别为同一个Room。解决办法是在Capture里使用Room向导的“根据选中的器件创建”方式手动跨页选择器件。或者在属性编辑器里确保所有器件的ROOM属性值完全一致不管它们在哪个页。5.4 常见问题速查表问题现象可能原因解决方法PCB里看不到Room网表未导出属性检查Create Netlist设置勾选Export PropertiesRoom数量不对属性值不一致用Excel批量检查ROOM列确保同组值相同批量复制报错器件数量不匹配回到原理图核对每个Room的器件清单边界框不更新边界框被锁定Unlock后执行Auto Generate自动布局结果混乱Placement Rule未设置在Constraint Manager里配置Room间距和区域Room内器件无法单独移动处于Room锁定状态在Find面板选Rooms右键Unlock提示如果以上方法都无效可以尝试删除PCB里的Room对象重新导入网表。删除方法是在Find面板选Rooms框选所有Room按Delete。然后重新导入网表Allegro会重新生成Room。6. 进阶技巧Room与模块复用、SKILL脚本的结合6.1 用Room实现模块复用Module ReuseAllegro有一个Module功能可以把一组器件和布线一起保存为模块然后在其他位置实例化。Room和Module结合使用可以实现“布局布线”的整体复用。具体做法是先摆好一个Room并完成布线然后选中Room内所有器件和布线右键Create Module保存为.mdd文件。之后在其他Room的位置用Place Module实例化这个模块Allegro会自动把器件和布线一起放进去。这种方式适合高度重复的模块比如电源模块、接口模块。但要注意Module实例化后器件位号会自动分配需要重新标注Logic Auto Rename。另外如果模块内有网络需要连接到其他模块实例化后需要手动调整连接。6.2 SKILL脚本批量设置Room属性如果你经常做重复模块的板子可以写一个SKILL脚本在PCB端直接批量设置Room属性而不依赖原理图。比如axlCmdRegister(assignRoom assignRoom) defun(assignRoom (roomName devicePattern) let((devices) devices axlDBGetDesign()-components-filter(lambda((c) rexMatchp(devicePattern c-name))) foreach(dev devices axlDBAddProp(dev list(ROOM roomName)) ) ) )这个脚本会把所有位号匹配devicePattern的器件赋予指定的Room名。比如assignRoom(RS485_1 R[0-9])会把所有电阻归入RS485_1。这种方式适合在PCB端快速调整Room划分但要注意这样设置的Room属性不会反标回原理图下次导入网表时会丢失。6.3 Room与铜皮优先级的配合在Allegro里铜皮Shape的优先级会影响铺铜结果。如果Room内有多个铜皮比如电源铜皮和地铜皮需要设置优先级避免短路。在Setup Constraints Constraint Manager里找到Shape Shape Priority可以给每个铜皮设置优先级。Room内的铜皮优先级一般高于Room外的铜皮这样铺铜时Room内的铜皮会优先填充。我遇到过一种情况Room内的电源铜皮和地铜皮重叠导致DRC报错。解决办法是给电源铜皮设置更高的优先级并且确保两个铜皮之间有足够的间距。间距值可以在Shape Global Shape Parameters里设置一般不小于10 mil。7. 我个人的实操体会与几个小建议Room这个功能刚上手的时候觉得麻烦要在原理图里加属性还要在PCB里配置规则。但一旦用顺了布局效率是翻倍的。我现在做板子只要看到原理图里有重复模块第一反应就是先分Room。几个我踩过坑之后总结的建议第一Room命名要有规律比如MODULE_01到MODULE_08不要用A、B、C这种后期脚本处理时不好匹配。第二模板Room要选最典型的那个不要选边角位置的因为边角位置的布局可能受板框限制不是最优的。第三批量复制后一定要做DRC我遇到过复制后器件重叠但DRC没报的情况后来发现是DRC规则里Room相关的检查没开。第四Skill脚本是好东西但不要过度依赖简单的批量操作手动做也就几分钟写脚本调试的时间可能更长。最后分享一个小技巧如果你想让Room内的器件在移动时保持相对位置可以在Placement Edit模式下选中Room后右键Fix这样器件就被锁定了移动Room时所有器件一起动。解锁用Unfix。这个技巧在调整多个Room的相对位置时特别有用。
返回列表