编写属于自己的PCB设计规则检查器具有很多优点,尽管设计检查器并不那么简单,但也并非高不可攀,因为任何熟悉现有编程或脚本语言的设计人员完全能够设计检查器,这项工作的好处是不可估量的,本文介绍编写PCB设计规则检查器的技巧。
本文阐述了一种编写PCB设计规则检查器(DRC)的系统方法。利用电路图生成工具得到PCB设计后,即可运行DRC以找到任何违反设计规则的故障。这些操作必须在后续处理开始之前完成,而且开发电路图生成工具的开发商必须提供大多数设计人员都能轻松掌握的DRC工具。
然而,市场销售的通用工具通常不具备足够的灵活性以满足特定的设计需要。因此,客户必须将新特性需求反映给DRC工具开发商,而这通常需要耗费一定的资金和时间,尤其当需求不断更新时。幸运的是,大多数工具开发商均可为客户提供编写属于自己的DRC以满足特定需求的便捷方法。但是,这种具有强大功能的工具尚未得到广泛认同或使用。本文提供了利用DRC工具获取最大收益的实用指南。
由于DRC必须遍历PCB设计的整个电路图,包括每个符号、每个引脚、每个网路、每种属性,如有必要还能创建数目不限的“附属”文件。如4.0节所述,DRC可以标示出任何违反设计规则的细微偏差。例如其中一个附属文件就可能包含设计用到的全部去耦电容。如果电容数低于或高于期望值,就将在可能出现电源线dv/dt问题的地方标注红色记号[1]。这些附属文件或许必不可少,但并非任何商用DRC工具都一定能创建这些文件。
DRC的另一优势是便于更新,以适应新设计特性(如那些可能影响设计规则的新特性)的需要。而且,一旦在该领域获得充分经验,那么还能实现许多其它功能。
例如,如果能编写属于自己的DRC,那么就能编写属于自己的物料清单(BOM)创建工具,这样就能更好地处理特定用户需求,如如何获取本身不属于电路图数据库一部分的器件“额外硬件”(如插座、散热装置或螺丝刀)。或者设计人员可以编写属于自己的Verilog网表分析器,该分析器在设计环境下具有充分的灵活度,如怎样获取适用于特定器件的Verilog模型或时间文件。实际上,由于DRC遍历了整个设计电路图,因此可以收集全部有效信息以输出PCB设计Verilog网表分析所需的仿真和/或BOM。
在不提供任何程序代码的前提下讨论这些话题实在有些牵强,为此,我们将以一种电路图获取工具为例进行说明。本文采用了MentorGraphics公司开发的附属于PADS-Designer产品线的ViewDraw工具。此外,我们还采用了ViewBase工具,这是一个可被调用并对ViewDraw数据库进行存取操作的简化C例行程序库。利用ViewBase工具,设计人员可以轻松地采用C/C++语言为ViewDraw编写完整且高效的DRC工具[2] [3]。需要注意的是,这里讨论的基本原则同样适用于任何其它的PCB电路图工具。
输入文件
除了电路图数据库,DRC还需要一些可以描述特定情况处理的输入文件,如自动连接到电源平面的合法电源网路名称。例如,如果电源网路名为POWER,那么电源平面将采用后端封装设备(如适用于ViewDraw的pcbfwd)自动连接到电源平面。下面给出了输入文件列表,这些文件必须放在固定的全局位置,这样DRC就能自动找到并读取,然后在运行时将这些信息保存在DRC内部。
*文件legal_pwr_net_name可选,该文件包含POWER信号全部合法网路名称,如VCC、V3_3P和VDD。在PCB布局/路由工具中,需要对名称的大小写进行区分,一般VCC并不等同于Vcc或vcc。VCC可以是5.0V的电源,而V3_3P则可以是3.3V的电源。
* 文件legal_pwr_net_name可选,因为后端封装设备的配置文件通常必须包含一组合法电源线网路名称。如果采用Cadence设计系统公司的Allegro布线工具,那么pcbfwd的文件名则为allegro.cfg并且具有如下入口参数:
接地:VSS CGND GND GROUND
电源:VCC VDD VEE V3_3P V2_5P +5V +12V
如果DRC可以直接读取allegro.cfg文件,而非legal_pwr_net_name,那么将能得到更好的结果(即引入误差的几率较小)。
电源线引脚通常并不外接到器件符号上,相反,该符号的一个属性(这里称为SIGNAL)描述了哪个引脚是电源引脚或接地引脚并描述引脚应当连接的网络名称。
SIGNAL = VCC:10
SIGNAL = GROUND:20
DRC可读取该属性并确保网路名称保存在legal_pwr_net_name文件中,如果legal_pwr_net_name中不包含网路名称,那么电源引脚将不会连接到电源平面,而这个问题确实非常严重。
一些符号必须具有外接电源线引脚,因为这些符号并不连接到常规电源线层。例如,ECL器件的VCC引脚要么连接到VCC,要么连接到GROUND;其VEE引脚则可连接到GROUND或-5.0V平面。此外,电源线引脚在到达电源线层之前也可连接到滤波器。
引脚与滤波器之间的网路可具有任意名称,而DRC很难检测到这一点。DRC可以错误形式汇报这一点,而用户则必须将其标示出或在legal_pwr_net_name文件中添加该网路名称。这就是我们需要类似legal_pwr_net_name文件的一个原因。最后,DRC将读取legal_pwr_net_name,以1)找到上拉电阻,2)在设计中检查POWER网路名称的大小写,3)检测任何与POWER直接相连但尚未使用的引脚。
*包含GROUND信号(如GROUND、VSS和F_GND)中所有合法网路名的legal_gnd_net_name文件可以随意创建。而需要再次注意的是,符号的大小写可能会对一些PCB布线工具产生影响。而且,如果DRC可以直接读取上述allegro.cfg文件,而非legal_gnd_net_name文件的话,无疑可以得到更好的设计结果。
legal_gnd_net_name不仅具有与legal_pwr_net_name相同的功能,而且DRC还可读取该文件,以1)找到下拉电阻,2)检查POWER网路名称的大小写,3)检测任何与POWER直接相连但尚未使用的引脚。
*包含全部合法符号库路径和名称的legal_lib_path_name文件可以随意创建,这一点非常重要。例如,一个常见的严重错误是使用未授权程序库中的符号。在PCB设计阶段,根据测试需要,通常要求创建临时器件符号并保存在本地符号库目录中。最终用到的器件符号来源于此并将保存在联合或全局的程序库目录中,这些符号具有一些不同于本地器件符号的重要特征。设计人员通常会因为没有采用共同符号取代本地符号而引入设计错误。
legal_lib_path_name可选,因为对于大多数电路图工具,程序库信息包含在启动工具所需的初始化文件中。对于ViewDraw工具,该文件称为viewdraw.ini,当工具启动时,该文件就自动创建(利用脚本程序):目录 [r]/corp_lib/pcb/symbol_libraries/viewdraw/fct (fct)。
Fct(快速CMOS技术)是ViewDraw众多子库中的一个,也是fct器件各符号的来源。如果初始化文件存在,那么DRC不仅可以而且也应当直接读取该文件,因为设计人员可以及时地添加新程序库。
* 可以创建包含合法上拉电阻的legal_pullup_res文件以检测那些被终止以及未被使用的输入引脚。通常,可以限定一组设计人员能使用的电阻,当然电阻值本身也是一个重要因素。如果上拉了未使用的输入引脚,那么该电阻的阻值将为5K或更高。
* 可以创建包含合法下拉电阻的legal_pulldown_res文件以检测那些被终止以及未被使用的输入引脚。如果下拉了未使用的输入引脚,那么阻值将会很小以阻止任何电流泄漏,从而使引脚电压高于触发阀值。
* 可以创建包含合法去耦电容的legal_decoup_cap文件,而且公司还可要求设计人员只使用特定的合格器件以满足电源线dv/dt要求。
* 可以创建一个包含器件符号全部属性的legal_comp_attr文件,如PART_NO、GEOM、REFDES和SIM_CLASS。BOAM创建工具、Verilog网表分析器及其它工具都能使用这些属性。
* 可以创建一个包含器件符号全部引脚属性的legal_pin_attr文件,如PIN_NAME、PINTYPE和PIN_NO。
设计目录结构
运行DRC必须满足的第二个条件就是需要可被所有PCB设计共享的单独设计目录结构。没有该目录结构,DRC将难以确定如何找到电路图数据库并存储输出文件。该架构可以极复杂的分层架构支持全部PCB设计业务,如设计规则检查、BOM创建、Verilog仿真、静态时序分析、信号完整性分析、布线、PAL/FPGA设计(综合与仿真)及文档控制。但对于DRC本身,如果采用了ViewDraw,那么下述条件就完全充分:
pcb_info应最少包含两个文件:design_def和design_type。design_def应包含PCB器件(组合)数目及其它所需信息,这不仅仅对于DRC,对于其它所有工具也同样如此。design_type应当包含设计类型信息,即PCB信息。如果其它类型的设计(如ASIC或FPGA)可以共享该设计目录结构,那么design_type将指定该目录,这样设计自动化工具将能根据不同的设计类型进行适当的操作。如果没有pcb_info目录或该目录内容为空,这就意味着设计目录并非标准设计目录。在这种情况下,DRC应当退出并发送出错信息。
Schem目录包含电路图数据库并可由DRC使用的ViewBase直接存取。sch子目录包含了在图表上描述符号位置的电路图文件及其它信息,wir子目录则包含设计网表分析及全部符号属性。ViewBase例程可直接存取这些内容。drc目录应存储DRC输出文件。
封装程序
本文提出的DRC工具采用C语言和C例程ViewBase库编写,C例程ViewBase库可提供对ViewDraw电路图数据库进行存取的便捷方法。每个例程均对一个数据项进行存取或在两个数据项之间建立联系。但DRC不能直接运行:DRC应“包装”在一个采用Perl或UNIX命令解释语言编写的封装程序中。该封装程序具有如下形式:
* 检查如图1所示的PCB设计目录结构是否有效。
* 可以运行后端封装程序(如应用于ViewDraw的pcbfwd)。该程序可检测一些违反规则的设计缺陷(如网路名称的数目和类型特性),而这通常很难采用DRC工具检测。此外,还能赋值给那些尚未赋值的符号参考标志符特性 (如R4)。
* 检测2.0.1节中讨论的输入文件是否存在,并将其注入DRC。
* 找到PCB设计名称并将其注入DRC。
* 将其输出文件的路径和名称注入DRC。
* 建立所需的工具环境变量,如用于ViewDraw和ViewBase的WDIR。
* 调用DRC程序。
* 按需求打印帮助信息。
* 打印用户和运行时间信息。
*执行后处理。这既可以像修正控制工具检测DRC输出文件那样简单,也可以像主动处理DRC输出文件那样复杂(如从其它数据源添加更多的信息或执行排序操作)。C或许不是最佳的数据排序或文件分析工具,因为如果按数字顺序排列文件,采用UNIX排序命令更为简单:sort +1nsource_file > sorted_file。
DRC开发:main()函数
可以调用DRC程序drc.c,该文件具有两个主要函数:drc_net()和drc_inst()。drc_net()遍历了全部网路而drc_inst()则遍历所有的元件(符号),这样就能检测任何有违规则的设计缺陷。这两个函数都能产生附属的输出文件,可以参见1.0节和4.0节。
drc.c首先应当包含全部由C、ViewBase和用户创建的头文件,如stdio.h、viewbase.h和viewbase.h。现在可以设定drc.c接收输入参数,这样不仅能为输入和输出文件声明变量和文件指针,还可使ViewBase指向ViewDraw数据库,并创建链接列表和散列表以存取从输入文件读入的信息。下面给出了main()函数的部分代码实现。
当DRC封装程序激活DRC时,将导入输入和输出文件名及PCB设计名 (参见3.0.1节)。数据结构Str_list_elem和Hash_table定义在drc.c包含的头文件中,而GROUPS则是ViewBase数据类型。
下一步,main()函数可以通过检验argc的取值从而确保输入参数数目正确。如果参数值正确,那么将为变量分配正确的输入参数。
此时,main()函数可以初始化ViewBase数据结构,并使ViewBase指针pcb-ptr指向PCB设计。如果该设计存在并有效,那么main()函数应当:
* 打开全部输入文件,读取信息并将信息存储到内部数据结构(如Str_list_elem和Hash_table)中, 然后关闭输入文件。
* 打开所有输出文件以写入信息,这些文件可以是设计规则错误/警告文件,也可以是附属文件。
* 调用drc_net()和drc_inst()函数执行实际操作。
* 关闭所有输出文件。
main()函数中完成上述功能的C和ViewBase代码如下:
[列表3]
这里,iwinit()和iw1level()是ViewBase例程。前者初始化全部载入例程(这也是必须的),而后者则载入整个PCB设计。为了保证只载入一张电路图,可以调用iw1sheet()例程(本文的DRC工具并不使用该例程)。需要注意的是,正确的设计指针、文件指针、链接列表、变量名称等必须传入drc_net()和drc_inst()函数:
drc_inst(pcb_ptr, pcb_name, drc_error, list_legal_pwr_name, ...);
drc_inst(pcb_ptr, pcb_name, drc_error, list_legal_pwr_name, ...);
如果设计采用分层结构及不同的器件符号,那么还必须确保DRC能正确处理这些器件。
DRC开发:drc_net()函数
drc_net()在PCB设计中遍历所有网路并检测任何违反设计规则的故障,然后创建附属的输出文件。实现上述功能的基本代码如下:
[列表4]
这里,iggrpnet()和ignetnxt()函数是在PCB设计中检查每个网路的ViewBase例程。ignetnam()函数也是检查网路名称的ViewBase例程。ViewBase中的数据类型包括NETS、PINS、COMPONENTS、SYMBOLS和ATTRIBUTES。drc_net()函数可检测下述违反设计规则的错误:
* 非法网路名。如果网路名由ViewDraw自动分配,那么将具有如下格式:$#...#N#...#,第一个#...#表示图表编号,第二个#...#则表示网路号。PCB设计人员指定的网路名必须以字母开头,其后的字符数不多于30。
drc_net()函数应调用legal_net_name()函数执行该任务。在UNIX系统中,利用包含在DRC程序中的regexp.h头文件可以极大地简化采用C语言编写的常规表达式匹配/校验程序。drc_net()应将网路名称变量和违反设计规则的文件指针存储在legal_net_name()函数中,该函数具有如下形式:
[列表5]
后端封装工具pcbfwd也可检测非法网路名,但其功能受限于简单的常规表达式。上述代码可处理任何常规表达式,同样地,如何在运行pcbfwd工具之前或之后找到非法网路名称也需要权衡。对于简单的网路名称,可以使用pcbfwd。
* 网路上的总线竞争也是严重问题。总线竞争有两类:一类是图腾柱输出间的总线竞争,而另一类则是图腾柱与三态输出间的总线竞争。基本代码实现如下所示:
[列表6]
这里,ignetpin()和igpinnnx()函数是在网路上检查每个引脚的ViewBase例程。igpinown()例程返回引脚实例(系主)指针。函数get_inst_attr()、get_pin_attr()和get_sheet_num()则返回请求实例属性(参考标志符REFDES)、引脚属性(PINTYPE)及引脚实例所在的图表编号。get_pin_attr()函数的基本代码如下:
[列表7]
get_inst_attr()函数的基本代码如下:
[列表8]
get_sheet_num()函数的基本代码如下:
[列表9]
* POWER和GROUND网路中的非法名称。这些名称将与存储在内部数据结构中的信息(如链接列表)进行比较。
* 报告那些具有负载但不具有驱动程序或者具有驱动程序但不具有负载的网路。这可以通过标注网路上每个引脚的类型加以实现。网路应当带有1个输出引脚或多个三态输出引脚及最少一个输入引脚,此外还可提供与网路全部器件和引脚相关的参考标志符和符号。
* 报告那些不带上拉电阻或所带上拉电阻未连接到POWER的所有集电极开路输出。
* 一旦网路的负载超过常规数目(良好的信号完整性条件下限额为8),那么将打印警告信息。
DRC开发:drc_inst()函数
drc_inst()函数与drc_net()函数类似,不同的是,前者遍历了全部电路图表及PCB设计中电路图表上的所有实例,从而检测违反规则的设计缺陷或创建附属的输出文件。其代码实现如下:
[列表10]
上面关于drc_net()函数的讨论提供了充分的C和ViewBase代码示例,这里就不在赘述。下面给出了drc_inst()函数可检测的部分违反规则的设计缺陷:
* 非法或遗漏的符号库混淆。PCB设计中的所有符号必须来自共同符号库,使用来自错误符号库的符号是一个极为常见的错误,尤其是对于那些只依赖于符号进行设计的后端处理工具。
* 遗失符号和/或引脚属性,例如那些描述器件几何结构和引脚类型(in、out、bi和tri)的特性。
* 非法的符号和/或引脚属性。例如,引脚类型可具有IN值,但不包括INPUT值。这将对后端封装工具(如pcbfwd)如何为布线工具(如Allegro)提供信息产生影响。
* 符号上的参考标志符值,尤其是对于串行器件(如电阻、电容和电感)。大多数信号完整性工具需要这些器件以字母R、C和L开头,因此可将这些器件作为串联元件而非离散器件进行分析。类似地,drc_inst()函数可将其值同描述的属性进行对比以保证两者完全匹配。
* 非法去耦电容。这可能导致POWER线dv/dt问题。* 非法上拉和下拉电阻。
* 不与符号POWER或GROUND平面相连的POWER或GROUND引脚。
* 未使用的输入引脚不被电阻上拉或下拉,或者该电阻不与POWER或GROUND网路直接相连。
* 当单个电阻器上拉或下拉1个以上输入引脚时发出警告信息。
* 对于直接与POWER或GROUND网路相连的非专用POWER和GROUND引脚发出警告信息。
如果采用了标记技术,那么将检验该标记是否注明了正确的可选器件,例如型号是否有效及其几何结构是否与默认的器件规格匹配。
DRC不应当具备的功能
尽管DRC能够实现很多功能,但仍然可以采用其它方法以期更好更便捷地加以实现。后端封装工具可为布线工具封装PCB设计,因此可提供有效帮助。在ViewDraw中,pcbfwd可用来检测诸多违反规则的设计缺陷和设计错误。
DRC和pcbfwd可检测的问题之间存在重叠,因此何时检测何种设计问题就需要进行折衷考虑。DRC通常在设计完成之后及pcbfwd运行之前才能正确地运行。理想情况下,运行pcbfwd只为了封装设计,因此更多的DRC可以得到更好的检测结果。但设计人员仍然需要在其投入精力开发具有超强功能的DRC与pcbfwd现有的免费功能之间取得平衡。这一节简单地讨论了这些问题。
pcbfwd由配置文件控制,如果布线工具为Allegro,那么配置文件名为allegro.cfg。配置文件中的BeginChkRules -EndChkRules部分可用来检测众多错误,如相同符号的重复属性、非法网路和网路属性名称、损坏的异质封装、异质符号上的冲突属性及遗漏属性。例如,为了在异质符号上获取冲突的属性,可以在allegro.cfg文件中添加如下内容:
CHKBRD _HETERO_ATT ERR 0
但仍有一些问题既不能采用DRC,也不能采用pcbfwd进行检测,如PCB设计中的预期冗余。假定器件包含4个完全相同的部分,其中两个部分用于设计,那么这些部分既可以封装在相同器件中,也可以出于冗余考虑将其封装在两个器件中。如果只需要一个器件,那么两部分用到的符号将具有相同的参考标志符(如U4);如果需要两个器件,那么符号将具有不同的参考标志符(如U4和U5),设计人员必须有意识地加以标注。目前尚无检测这类问题的便捷方法,因此只有通过严谨的设计进行保障。
此外,尽管DRC和/或pcbfwd可以检测符号是否具有所需的几何属性GEOM,但并不能检测其值是否与电路图符号相匹配。例如,ViewDraw符号指定的引脚数目就有可能与Allegro覆盖区的引脚数目不匹配。
这类特殊错误可由Allegro的dev_check进行检测。首先,在ViewDraw电路图上运行pcbfwd工具,创建Allegro设备文件,该文件连同Allegro覆盖区文件将导入至dev_check。假定引脚68、69和70位于Allegro覆盖区而不在ViewDraw上,那么dev_check就能检测到该错误。这些引脚可以是不相连引脚,安装孔引脚,甚至是由于失误而仍留在ViewDraw符号外的POWER/GROUND引脚。不相连引脚和/或安装孔引脚必须赋以NC属性,而POWER/GROUND引脚则必须赋以SIGNAL属性。按这种方式修正符号,然后重新运行pcbfwd 和dev_check。
最后,DRC输出的质量取决于电路图质量。例如,如果输入引脚被错误地指定为OUT属性,那么DRC将产生错误的出错消息。器件的符号质量应仔细而系统地进行控制,因为该质量将影响其它所有工具。
DRC的其它功能
除了检测违反规则的设计缺陷,DRC还可以创建有助于设计分析的附属输出文件,如前所述。输入切换可通知DRC在每次运行时是否创建这些文件。尽管这些文件并不包含DRC出错或警告消息,但仍然能标示出潜在的设计问题。例如,一个文件包含了所有网路及每个网路上的负载数目信息。如果负载数目超出允许值,那么就有可能导致信号完整性问题。PCB设计人员可以迅速地检查该文件以找到潜在的错误。设计人员可以获得尽可能多的附属文件,下面给出了部分列表。
* 按网路名称排序的网路列表及每个网路所在图表的列表。此外,还可能包含引脚编号和网路连接的符号类型(及其参考标志符)。该文件由drc_net()函数创建并可用于查找网路所在的图表。
* 包含所有网路及每个网路上负载数目的列表,由drc_net()函数创建。为了获取更好的信号完整性,网路上的负载数不应超过8个。
* 跨越图表边界的网路列表。这有助于设计人员在调试中调整设计。
* 具有网路属性的网路及其属性。设计人员可以检验网路是否具有正确的属性,该文件由drc_net()函数创建,其基本代码实现如下:
[列表11]
这里,ignetatt()和igattnxt()是可以获取网路属性的ViewBase例程。igattnam()获取属性名,而net_att则是输出文件的文件指针。
* 未使用引脚列表,这些引脚可以是上拉引脚或下拉引脚。该文件由drc_inst()函数创建,可以报告上拉电阻和下拉电阻信息。
* 所有去耦电容及其容值列表,此外还可能包括这些电容所在的电路图表。设计人员应迅速检验该文件以确保PCB上具有足够多的去耦电容
。该文件由drc_inst()函数创建。
* 所有离散器件及其值的列表,如上拉/下拉电阻、传输线终端匹配电阻/电容。此外,还可能包含这些器件所在的电路图表。设计人员可迅速检查器件数目是否合理,该文件由drc_inst()函数创建。
该列表的另一项重要应用则是PCB设计的信号完整性和时序分析[4]。该领域的大多数工具可以通过将所谓的串行元件功能合并为传输线分析结果并从输出文件中取出这些元件,从而自动处理这些串行元件。图2中的R1就是一个串行终端匹配电阻。当信号完整性工具报告网路延迟时,由于R1的存在,延迟将由u1.z到u2.i,而不是先从u1.z到 R1.1,再由R1.2到u2.i。这是正确处理时序分析的方法。
然而,为了使信号完整性工具自动识别串行元件,必须满足一些条件。例如,电阻的参考标志符必须以字母R开头,后面紧跟数字,而电容则必须以字母C开头。另一条件则是每个串行元件符号都必须具有属性值为DISCRETE的TYPE属性。没有这些条件,这些元件就无法得到正确地处理。
被许多其它的PCB复制的模板设计也是一个常见问题。为了避免可能的参考标志符冲突,模板设计中的电阻和电容通常可称为XR1和XC1。在信号完整性工具数据库中,这些器件都必须更改为R10001和C10001(编号略大于原始PCB设计中使用的任何参考标志符)。设计人员可采用由DRC创建的离散器件列表检查到XR和XC参考标志符。
参考文献:
1. Luke L. Chang, "Transient Analysis of the VAX 9000 Memory Power Distribution System", Digital Power Systems, Fall/Winter 1990
2. Brian W. Kernighan & Dennis M. Ritchie, "The C Programming Language", 2nd Edition, Prentice Hall, 1988
3. Bjarne Stroustrup, "The C++ Programming Language", 3rd Edition, Addison-Wesley, 1997
4. Luke L. Chang, "Static Timing Analysis of High-speed Boards", IEEE Spectrum, March 1997
Luke L. Chang is a Senior Verification Leader in the StorageComponent Division of Intel (Hudson, MA). Previously, he has held bothengineering and management positions at several high-tech companies, inthe areas of hardware design/verification and of electronic designautomation (EDA).
联系客服