谷动谷力

 找回密码
 立即注册
查看: 690|回复: 0
收起左侧

【KiCad】KiCad基于正则表达式(regexp)的过滤器在DDR布线中...

[复制链接]
发表于 2023-12-4 09:16:28 | 显示全部楼层 |阅读模式

【KiCad】KiCad基于正则表达式(regexp)的过滤器在DDR布线中的应用举例
我目前使用的是自己本地编译的KiCad master 的版本,但是文中的内容应该与发布的稳定版中规则是一样的。我测试与截图的 KiCad 版本为 7.99.0-3775-g1bac16459a (即所使用的 revision 为 1bac16459a )。与官方下载的 nightly build 应该是一样的。如果你想测试 nightly build 但不知道下载方式,可以看KiCad技巧及功能追踪: 网络查看器(Net Inspector);IPC2581;集成FEM;线长调整 bug 修复,仿真等
本人也是近一年才开始学习高速数字信号布线,并尝试使用 KiCad 设计 DDR 电路,有任何错误之处也请大家不吝指教,有兴趣的朋友也可以与我交流切磋。

KiCad 过滤网表 (net names) 支持正则表达式 (regexp)。不过这个可能是对“程序员友好”的功能,但是任何人愿意学习它的语法(比编程简单多了),它将成为一个极其强大且方便的工具。很多高级一点的编辑器 / IDE,都支持正则表达式的查找与替换(不过语法风格会有一点不同,但是大同小异)。
KiCad 的底层使用了 wxWidgets,所以 KiCad 使用的正则表达式的语法需要看 wxWidgets 的实现,地址在这里:https://docs.wxwidgets.org/3.2/overview_resyntax.html

下面我结合一个 DDR 布线来举例 KiCad 里正则表达式的使用。
我使用了层次原理图 ( hierarchical sheet,这里使用了官方文档目前使用的翻译术语。后文简称层次图。 )来管理项目模块和使用模块复用(或许我应该挖个坑,后面再写一篇关于此功能应用举例的文章)。

原理图组织

640?wx_fmt=png&from=appmsg.jpg


DDR Chips 子图,包含两片 DDR 芯片及相关器件
640?wx_fmt=png&from=appmsg.jpg

两片 DDR 芯片的原理图是同一个层次图的不同实例(引用)
640?wx_fmt=png&from=appmsg.jpg

这个是实际的芯片符号 ( Symbol )。省略了电源部分。
640?wx_fmt=png&from=appmsg.jpg

网络类
开始布线前,要定义网络类如下
640?wx_fmt=png&from=appmsg.jpg
注意,这里的数值都是默认值。之所以使用默认值,是因为通过板厂商(嘉利创或者华秋)的预设的叠层计算,同一阻抗在不同层的线宽线距不同,所以我使用自定义规则来定义这些参数,而不是单一的值。自定义规则我会在下一篇文章中举例。
时钟线
DDR 时钟线按差分阻抗 100 ohm设置,网络名命名方式为 /DDR/DDR4_CLK_N和/DDR/DDR4_CLK_P
网络名路径可以通过在原理图内选择相应的标签获得,如图
640?wx_fmt=png&from=appmsg.jpg
对于过滤器规则(Pattern),最简单的方式是通配符,即,使用*(星)号指代零个或多个字符,
640?wx_fmt=png&from=appmsg.jpg
或者?(问)号来指代一个任意字符:
640?wx_fmt=png&from=appmsg.jpg
或者使用正则表达式来进行精确匹配:
640?wx_fmt=png&from=appmsg.jpg
[NP] 表示这个字符是N或者P。
对于时钟线这个简单例子来说,用哪种方式没有差别。但是要注意,通配符方式与正则方式是不可以混用的。下面来看一看其他信号线的过滤。
地址线
地址线前缀与时钟线一样,后缀是从A0-A16,其中A14, A15, A16是复用功能线,还有复用功能的尾缀。就地址线单一来说,也可以使用通配符功能。不过为了后面的扩展,这里仅采用正则表达式方式。
640?wx_fmt=png&from=appmsg.jpg
A[0-9]表示A后面是数字(字符)0,1,2,3,4,5,6,7,8,9的任意一个。这时候只匹配了一位数字。要匹配多位数字(字符),使用+号:
640?wx_fmt=png&from=appmsg.jpg
+号表示,前面字符(规则)的一个或多个,所以它可以匹配00...09, 10...19, ..., 90...99, 000...009, 010...019, ... ,100...109, ... , 990 ... 999, 以此类推任意多字符(这里为数字,有语法可以限制位数)。
对于A14, A15, A16有后缀的情况,最简单的方式是使用.* 语法,.(英文名点)表示任意字符,*(星号)表示前面字符的零或多个:
640?wx_fmt=png&from=appmsg.jpg

现在就是全部地址线。
控制线
注意到有两根线是BA0, BA1,我们可以单独写一条规则(pattern):
640?wx_fmt=png&from=appmsg.jpg
但是这条规则与地址线仅差一个B,所以可以使用?(表示有或没有,注意通配符与正则语法不能混用,这里不是通配符的任意字符的意思),所以可以使用:
640?wx_fmt=png&from=appmsg.jpg
这样,地址线与BA0/BA1线就共用了一条规则。
我们还有一条 BG0 线,在上一条规则的基础上,使用[](任意一个字符)来把BG0线加入到规则:
640?wx_fmt=png&from=appmsg.jpg
还有一条ODT0线,可以单独写一条规则。如果要整合到上一条规则一起,需要使用到()(字符组)与| (逻辑或):
640?wx_fmt=png&from=appmsg.jpg
其中, B?[AG]是一个组,ODT是另一个组,分别用()区隔,这两个组用|进行逻辑或。
增加nACT 和 nCS0(实际为 ~{ACT}和~{CS0})
640?wx_fmt=png&from=appmsg.jpg
640?wx_fmt=png&from=appmsg.jpg
一定要注意 () 的匹配,语法错误就会不能匹配。新手可以分成不同的规则条目来写。
当掌握了正则表达式的语法之后,也可以在 Net Inspector 里使用正则表达式来分组:
640?wx_fmt=png&from=appmsg.jpg

可以使用(英文)逗号区隔多个正则表达式,进行多个分组:
640?wx_fmt=png&from=appmsg.jpg
不过目前 KiCad 还不支持在 Net Inspector 进行分组编辑管理(比如命名等的)。另外之前版本不能在重启 KiCad 之间保存 Net Inspector 的规则内容,我提交了 MR (#1749) 被合并进 7.99 master,但未发布到稳定版。
正则表达式讲到这么多。下一篇将讲解自定义规则的使用。

+10
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|深圳市光明谷科技有限公司|光明谷商城|Sunshine Silicon Corpporation ( 粤ICP备14060730号|Sitemap

GMT+8, 2024-7-19 04:44 , Processed in 0.094327 second(s), 39 queries .

Powered by Discuz! X3.2 Licensed

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表