Design Compiler:目标(target)库、链接(link)库、符号(symbol)库、综合(synthetic)库和物理(physical)库的详细解析

发布时间:2026/8/1 20:19:38
Design Compiler:目标(target)库、链接(link)库、符号(symbol)库、综合(synthetic)库和物理(physical)库的详细解析 相关阅读Design Compilerhttps://blog.csdn.net/weixin_45791458/category_12738116.html?spm1001.2014.3001.5482哪些库是需要的在线负载模式(wire load mode)下Design Compiler使用逻辑库包括目标库和链接库、符号库和综合库又称DesignWare库。在拓扑模式(topographical mode)下Design Compiler除上述库外还使用物理库。逻辑库逻辑库由半导体供应商维护和分发包含每个单元的特性和功能信息例如单元名称、引脚名称、面积、时序弧和引脚负载。它们还定义了设计规则约束如线网的最大转换时间等条件。此外逻辑库还指定特定工艺技术的工作条件和线负载模型只用于线负载模式。Design Compiler支持使用非线性延迟模型(Non-Linear Delay Model, NLDM)和复合电流源模型(Composite Current Source Timing Model, CCST)计算延迟需要注意的是对于Design Compiler而言CCST模型无法直接被使用Design Compiler会先将其导出为NLDM模型。如果库同时包含NLDM和CCST模型当lib_cell_using_delay_from_ccs变量设置为true默认时则Design Compiler会使用CCST模型导出的NLDM模型并在使用report_delay_calculation命令时提示Information: Using CCS timing information. (TIM-026)当lib_cell_using_delay_from_ccs变量设置为false时Design Compiler会直接使用库中的NLDM模型。这里插个题外话对于IC Compiler和PrimeTime而言如果设计尚未布线即未反标RC网络或者说详细(Detailed, Distributed)寄生参数则会像Design Compiler那样将CCST模型导出为NLDM模型后使用使用report_delay_calculation命令时提示Information: Using CCS timing information. (TIM-026)如果设计已布线即已反标RC网络或者说详细(Detailed, Distributed)寄生参数则rc_driver_model_mode变量默认值为advanced和rc_receiver_model_mode变量默认值为advanced可以控制是否直接使用真正的CCST模型此时使用report_delay_calculation命令时提示Information: Using CCS timing info. (TIM-025)和Advanced receiver/driver-modeling used for rise and fall.。Design Compiler需要逻辑库是.db格式。通常情况下半导体供应商会提供.db格式的逻辑库。如果只有逻辑库的源代码(例如.lib格式)则需要首先使用Library Compiler以前集成在Design Compiler中后脱离变成单独的工具将其编译为.db格式。Design Compiler使用逻辑库的主要目的包括实现设计功能Design Compiler在优化过程中映射到的逻辑库称为目标库这些库包含用于生成网表的标准单元目标库是用于综合设计的链接库的子集。解析单元引用Design Compiler使用链接库解析单元引用链接库可以包含标准单元和设计文件。计算时序值和路径延迟链接库定义用于计算时序值和路径延迟的延迟模型。计算功耗提供了有关功耗计算的信息。Design Compiler使用在link_library变量中找到的第一个逻辑库作为主库用于在缺少显式规范时获取默认值和设置。这些设置包括工作条件、线负载模型选择组、线负载模式和线网延迟计算。如果其他库的度量单位与主库的单位不同Design Compiler会将所有单位转换为主库中指定的单位。Design Compiler从主库中获取以下默认值和设置单位定义工作条件K因子线负载模型选择输入和输出电压时序范围RC转换点线网转换时间衰减表目标库Design Compiler在映射过程中从目标库中选择功能正确的门电路来构建电路。它还使用供应商提供的这些门电路的时序数据来计算电路的时序。要指定目标库可以使用target_library变量。你应当只指定Design Compiler用于映射设计中标准单元如组合逻辑和触发器的标准单元库。不应指定任何DesignWare库或宏库例如pads或memory。链接库为了完成设计设计中的所有单元必须与库中的标准单元和被引用的设计进行链接。这个过程称为链接设计或解析引用。为了解决引用问题Design Compiler使用以下变量和属性设置的链接库link_library变量列出Design Compiler用于解析引用的库文件.db格式和设计文件.ddc格式。Design Compiler将从左到右搜索link_library变量中所列文件的内容并在找到引用时停止搜索。如果在link_library变量中指定了星号(*)则表示Design Compiler会在内存中搜索引用博主注貌似目前版本的Design Compiler中该行为默认如果不显式将星号包括在link_library变量内视为星号在最左边如果显式包括则按照实际情况进行搜索。例如如果将link_library变量设置为{* typical.db}Design Compiler会首先在内存中搜索引用然后在typical库中搜索。local_link_library属性可以使用set_local_link_library命令给当前设计指定local_link_library属性在解析当前设计的引用时Design Compiler会首先搜索local_link_library属性中的库文件和设计文件。可以将这两者统称为link_path当Design Compiler在link_path指定的文件搜索后但还是没有成功解析引用时会在search_path变量指定的目录路径下查找名字是引用名.ddc或引用名.db的文件并查找其内容中是否有需要的引用最后尝试在默认设计库WORK中解析引用。search_path变量简介指定工具在查找库文件和设计文件时使用的目录路径列表。符号库符号库包含在设计原理图中表示库单元的图形符号定义。这些符号库由半导体供应商维护和分发。Design Compiler使用符号库来生成原理图视图。要查看原理图必须使用Design Vision工具。当你生成原理图时Design Compiler会将网表中的单元与符号库中的单元进行一对一的映射。每个Design Compiler的安装包中都包含一个默认的符号库文件generic.sdb该文件位于Design Compiler安装目录/libraries/syn中。这个文件包含通用符号以及所有Verilog标准逻辑门符号。为了加载原理图符号Design Vision首先会检查你通过symbol_library变量指定的符号库文件。例如symbol_library变量的值为tech.sdb时工具会在名为tech.sdb的文件中搜索符号。如果指定的库中不包含所需符号工具会搜索Design Compiler安装目录/libraries/syn目录中的generic.sdb文件。如果还是没有找到匹配项工具会将单元实例显示为矩形这是默认的表示形式。与逻辑库相同如果只有符号库的源代码(例如.slib格式)则需要首先使用Library Compiler将其编译为.sdb格式。综合库DesignWare库是一个可重用电路设计构建模块组件的集合与Synopsys的综合环境紧密集成。在综合过程中Design Compiler会从DesignWare库中选择速度和面积优化最优的组件。Synopsys提供了实现许多实现内置HDL操作符的DesignWare组件这些操作符包括取绝对值、加法、减法、比较、移位、乘法、除法等。除此之外你可以使用DesignWare Developer在本地开发个性化的DesignWare库或者从Synopsys或第三方获得DesignWare库的许可。要使用许可的DesignWare库你需要获取这些库的许可证密钥。如果在synthetic_library变量中设置的任何DesignWare库需要DesignWare许可证Design Compiler会检查该许可证。无需指定内置HDL操作符的标准综合库standard.sldb或者称为Basic DW因为Design Compiler会自动使用此库。如果进阶综合库dw_foundation.sldb或者称为Licensed DW不在synthetic_library变量中但已成功检查出DesignWare许可证dw_foundation.sldb库会自动添加到synthetic_library变量中。这种行为仅适用于compile_ultra命令提示Warning: DesignWare synthetic library dw_foundation.sldb is added to the synthetic library in the current command. (UsN-4)用户指定的synthetic_library和link_library变量不会受到影响。一般来说compile命令默认只使用标准综合库除非将进阶综合库添加到synthetic_library变量中compile_ultra命令可以使用标准综合库和进阶综合库自动添加。默认情况下所有DesignWare层次结构在使用compile_ultra命令综合的过程中会被无条件解组。你可以通过将compile_ultra_ungroup_dw变量设置为false来防止这种解组行为默认值为true。在Synthetic modules较小比如三位乘法器时无论是compile命令还是compiler_ultra命令都会对Synthetic modules进行解组此时无论compile_ultra_ungroup_dw变量设置为何值。除了标准综合库和进阶综合库还有低功耗综合库dw_minpower.sldb使用该库后综合工具可以通过自动构建低翻转活动性的数据路径抑制逻辑毛刺从而在复杂组合逻辑如乘法器和 DSP中降低动态和漏电功耗。综合工具会根据真实的翻转活动性、跳变概率、可用标准单元及不同架构配置自动选择最优实现方案并利用增强型时钟门控、内建数据路径门控和数据跟踪流水线管理等低功耗技术来实现整体的最低功耗设计。在2019版本之前需要将低功耗综合库dw_minpower.sldb添加到synthetic_library变量中从2019版本开始低功耗综合库被合并到了进阶综合库中只需要将power_enable_minpower变量设置为true即可启用低功耗综合优化。如果现有脚本中synthetic_library变量包含dw_minpower.sldb工具会自动设置power_enable_minpower变量保持向后兼容性。物理库Synopsys曾经推出过一个用于物理综合的工具——Physical Compiler它将逻辑综合和物理设计整合在一个工具中。这意味着在综合阶段就可以引入物理信息如单元的物理布局、线长、拥塞情况等而不用等到布局布线阶段才发现物理设计。进行物理综合时需要物理库它可以是.pdb格式Library Compiler编译.plib文件或者.lef文件(Library Exchange Format)生成也可以是Milkyway设计库Milkyway参考库和技术文件生成。后来推出的DC Ultra有topographical模式这时不再使用线负载模型作为互联延迟的估算方式而是根据单元的布局情况计算延迟这种模式下也需要物理库最初支持.pdb格式和Milkyway设计库但是在2009版本中.pdb格式的物理库已经不受支持了。Design Compiler NXT还支持使用IC Compiler II中的NDM库作为物理库它可以同时包含物理信息和时序信息。详细说明在默认的情况下Design Compiler默认的库变量的设置情况如例1所示这因为Design Compiler安装目录/admin/setup下的.synopsys_dc.setup初始化文件有相关初始化设置命令该文件会在每次Design Compiler启动时自动执行。# 例1 dc_shell printvar target_library # 或者使用echo命令和puts命令 target_library your_library.db dc_shell printvar link_library link_library * your_library.db dc_shell printvar symbol_library symbol_library your_library.sdb dc_shell printvar synthetic_library synthetic_library 在Design Vision也能观察到这些变量默认的值如图1所示。图1 变量设置窗口为了更好地说明首先在Design Compiler的启动目录中新建一个.synopsys_dc.setup文件加入例2所示的命令Design Compiler会优先执行启动目录下的初始化文件。# 例2 set_app_var target_library # 或者使用set命令 set_app_var link_library set_app_var symbol_library set_app_var synthetic_library 目标库的使用此时我们使用read_verilog命令或read_file命令读取一个未映射的Verilog文件时此时输出如例3所示。# 例3 dc_shell read_verilog test2.v Loading db file /opt/Synopsys/syn2018/syn/O-2018.06-SP1/libraries/syn/gtech.db Loading db file /opt/Synopsys/syn2018/syn/O-2018.06-SP1/libraries/syn/standard.sldb Loading link library gtech Loading verilog file /home/zhangchen/Desktop/folder/folder1/folder2/test2.v可以看出在读取Verilog文件前Design Compiler首先自动读取了两个库文件即使它们并未显式设置gtech.db库被设置为了链接库这是为了解析从Verilog格式转化后的GTECH格式而standard.sldb库用于DesignWare组件。此时无法直接综合如例4所示。# 例4 dc_shell compile -exact_map Warning: No target library specified. (UIO-15)即使使用read_db或者read_file命令读取了一个库文件也是徒劳的如例5所示。# 例5 dc_shell read_db typical.db Loading db file /opt/Synopsys/syn2018/syn/O-2018.06-SP1/libraries/syn/typical.db Loaded 0 designs. dc_shell list_lib Logical Libraries: ------------------------------------------------------------------------- Library File Path ------- ---- ---- gtech gtech.db /opt/Synopsys/syn2018/syn/O-2018.06-SP1/libraries/syn standard.sldb standard.sldb /opt/Synopsys/syn2018/syn/O-2018.06-SP1/libraries/syn typical typical.db /opt/Synopsys/syn2018/syn/O-2018.06-SP1/libraries/syn 1 dc_shell compile -exact_map Warning: No target library specified. (UIO-15) 0这是因为target_library变量设置为空所以即使库文件已经被读取Design Compiler也不知道要使用其进行综合。例6设置了target_library变量的值为typical.db并成功进行了综合。# 例6 dc_shell set_app_var target_library typical.db # 或者使用set命令 typical.db dc_shell compile -exact_map Information: Evaluating DesignWare library utilization. (UISN-27) | DesignWare Building Block Library | Version | Available | | Basic DW Building Blocks | O-2018.06-DWBB_201806.1 | * | | Licensed DW Building Blocks | | | Beginning Pass 1 Mapping ------------------------ Processing grandchild_module Updating timing information Information: Updating design information... (UID-85) Information: Design grandchild_module has no optimization constraints set. (OPT-108) Beginning Mapping Optimizations (Medium effort) ------------------------------- Structuring grandchild_module Mapping grandchild_module TOTAL ELAPSED WORST NEG SETUP DESIGN TIME AREA SLACK COST RULE COST ENDPOINT --------- --------- --------- --------- --------- ------------------------- 0:00:01 194.0 0.00 0.0 0.0 0:00:01 194.0 0.00 0.0 0.0 0:00:01 194.0 0.00 0.0 0.0 0:00:01 194.0 0.00 0.0 0.0 0:00:01 194.0 0.00 0.0 0.0 0:00:01 126.3 0.00 0.0 0.0 0:00:01 126.3 0.00 0.0 0.0 0:00:01 126.3 0.00 0.0 0.0 0:00:01 126.3 0.00 0.0 0.0 0:00:01 126.3 0.00 0.0 0.0 0:00:01 126.3 0.00 0.0 0.0 0:00:01 126.3 0.00 0.0 0.0 0:00:01 126.3 0.00 0.0 0.0 Beginning Delay Optimization Phase ---------------------------------- TOTAL ELAPSED WORST NEG SETUP DESIGN TIME AREA SLACK COST RULE COST ENDPOINT --------- --------- --------- --------- --------- ------------------------- 0:00:01 126.3 0.00 0.0 0.0 0:00:01 126.3 0.00 0.0 0.0 0:00:01 126.3 0.00 0.0 0.0 Beginning Area-Recovery Phase (cleanup) ----------------------------- TOTAL ELAPSED WORST NEG SETUP DESIGN TIME AREA SLACK COST RULE COST ENDPOINT --------- --------- --------- --------- --------- ------------------------- 0:00:01 126.3 0.00 0.0 0.0 0:00:01 126.3 0.00 0.0 0.0 0:00:01 126.3 0.00 0.0 0.0 0:00:01 126.3 0.00 0.0 0.0 0:00:01 126.3 0.00 0.0 0.0 0:00:01 126.3 0.00 0.0 0.0 0:00:01 126.3 0.00 0.0 0.0 0:00:01 126.3 0.00 0.0 0.0 0:00:01 126.3 0.00 0.0 0.0 0:00:01 126.3 0.00 0.0 0.0 0:00:01 126.3 0.00 0.0 0.0 Loading db file /opt/Synopsys/syn2018/syn/O-2018.06-SP1/libraries/syn/typical.db Note: Symbol # after min delay cost means estimated hold TNS across all active scenarios Optimization Complete --------------------- 1其实在这里例5所示的手动读取库文件是不必要的只要设置了target_library变量其所指定的库会在使用综合命令后自动进行读取如有必要例6没有读取是因为库文件已被读取。链接库的使用随后我们需要保存综合结果可以将其保存为一个已映射的Verilog文件.v格式或者是一个已映射的设计文件.ddc格式或.db格式不推荐它们两个的区别在于如果保存为已映射的Verilog文件则只会保留网表信息而如果保存为已映射的设计文件则会保存所有信息包括设计的约束。已映射的Verilog文件例7使用write_file命令将综合结果保存为已映射的Verilog文件。# 例7 dc_shell write_file -format verilog -output test2_map.v Writing verilog file /home/zhangchen/Desktop/folder/folder1/folder2/test1_map.v. 1例8首先是移除所有设计随后读取已映射的Verilog文件。# 例8 dc_shell remove_design -designs Removing design grandchild_module dc_shell read_verilog test2_map.v *****此时如果使用link命令则会出错如例9所示。# 例9 dc_shell link Linking design grandchild_module Using the following designs and libraries: -------------------------------------------------------------------------- Information: Building the design DFFRQX2. (HDL-193) Warning: Cannot find the design DFFRQX2 in the library WORK. (LBR-1) Information: Building the design CLKINVX1. (HDL-193) Warning: Cannot find the design CLKINVX1 in the library WORK. (LBR-1) Warning: Unable to resolve reference DFFRQX2 in grandchild_module. (LINK-5) Warning: Unable to resolve reference CLKINVX1 in grandchild_module. (LINK-5) 0上面的提示说明Design Compiler无法解析引用这是意料之中的因为此时即使target_library变量的值为typical.db而link_library变量设置为空即使库文件已经被读取Design Compiler此时只能使用gtech.db库作为链接库如果不是碰巧有同名单元这是不会成功的。例10设置了link_library变量的值为typical.db并成功进行了引用解析。# 例10 dc_shell set_app_var link_library typical.db # 或者使用set命令 typical.db dc_shell link Linking design grandchild_module Using the following designs and libraries: -------------------------------------------------------------------------- typical (library) /opt/Synopsys/syn2018/syn/O-2018.06-SP1/libraries/syn/typical.db 1顺带一提的是就像target_library变量所指定的库文件会在使用综合命令后自动进行读取一样link_path所指定的库文件和设计文件会在必要时自动读取。已映射的设计文件例11使用write_file命令将综合结果保存为已映射的设计文件。# 例11 dc_shell write_file -format ddc -output test2_map.ddc Writing ddc file test2_map.ddc. 1例12首先是移除所有设计随后读取已映射的设计文件。# 例12 dc_shell remove_design -designs Removing design grandchild_module dc_shell read_file -format ddc test2_map.ddc *****此时如果使用link命令不会出错即使link_library变量设置为空如例13所示。# 例13 dc_shell link Linking design grandchild_module Using the following designs and libraries: -------------------------------------------------------------------------- typical (library) /opt/Synopsys/syn2018/syn/O-2018.06-SP1/libraries/syn/typical.db 1这是因为在综合后设计的local_link_library属性会被设置为target_library变量的值将设计保存为.ddc格式会保留这些属性当读取一个设计文件时如其有local_link_library属性指定的库也会像link_library变量一样自动读取解析引用时local_link_library属性指定的库文件也会被搜索。需要注意的是local_link_library属性只对当前设计生效如果一个模块是当前设计的一个子模块则该模块的local_link_library属性不会被使用只有link_library变量和当前设计的local_link_library属性会被使用。link_library变量中的*link_library变量的默认值包含符号*这表示Design Compiler会在内存中查找引用例如父模块child_module中引用了grandchild_module模块且它们都已被读取则可以正常解析引用并构建层次关系。link_library变量中的设计文件link_library变量除了可以包含符号*库文件之外还可以包含设计文件.ddc格式或.db格式。假设这样一个场景grandchild_module模块已被综合且被保存为已映射的设计文件将link_library变量设置为相应的库后将grandchild_module模块所属的设计文件也添加进link_library变量后此时只读取父模块child_module就会自动读取link_library变量中的库文件和设计文件这就可以找到grandchild_module模块的引用而无需将两个模块都用命令读取。符号库的使用符号库会在查看原理图后自动读取如图2所示。图2 符号库的加载综合库的使用运算符推断以例14的RTL代码为例进行说明其中包括一个加法运算符和一个乘法运算符。// 例14 module top_module ( input wire clk, input wire rst_n, input wire [3:0] in_a, input wire [3:0] in_b, output wire [4:0] sum, output wire [7:0] product ); wire [3:0] intermediate_sum; // 实例化加法子模块 adder u_adder ( .a(in_a), .b(in_b), .sum(intermediate_sum) ); // 实例化乘法子模块 multiplier u_multiplier ( .a(in_a), .b(in_b), .product(product) ); // 将加法结果扩展为5位输出 assign sum {1b0, intermediate_sum}; // 高位补0 endmodule // 子模块1加法器 module adder ( input wire [3:0] a, input wire [3:0] b, output wire [3:0] sum ); assign sum a b; endmodule // 子模块2乘法器 module multiplier ( input wire [3:0] a, input wire [3:0] b, output wire [7:0] product ); assign product a * b; endmodule当把例14读取进Design Compiler时在DesignVision中打开原理图可以看到一个加号和乘号模块分别名为ADD_UNS_OP_6_6_7即无符号输入为6位输出为7位的加法运算如图3所示和MULT_UNS_OP_6_6_12即无符号输入为6位输出为12位的乘法运算如图4所示。它们实际上是GTECH形式的模块由Design Compiler中的HDL Compiler进行转换得来如图5所示。图3 加法运算符图4 乘法运算符图5 运算符映射综合完成后加法运算符和乘法运算符被映射到了DesignWare组件或者说图5中的Synthetic modules如图6和图7所示。图6 映射后的加法器图7 映射后的乘法器显式例化显式例化Synthetic modules也是可行的但需要提供相关参数如在例15中显式例化了一个乘法器DW02_mult提供了输入位宽参数。// 例15 module top(input [9:0]A, B, output [19:0]PRODUCT); DW02_mult #(.A_width(10), .B_width(10)) (.A(A), .B(B), .PRODUCT(PRODUCT)); endmodule有些Synthetic modules只能显式例化而无法推断比如RAM如下所示。DW_ram_r_w_s_lat #(WIDTH,DEPTH) memory(.clk(push_clk), .cs_n(1b0), .wr_n(~push), .rd_addr(rd_address), .wr_addr(wr_address), .data_in(data_in), .data_out(dataout));顺带一提如果想强制一个运算符的实现方式可以显式例化Synthetic modules并在Design Compiler中使用set_implementation命令这只针对compile命令如果使用compile_ultra命令Design Compiler可能拒绝用户设置的实现方式并选择有更好QoR的实现。最佳实践一般情况下会将target_library变量设置为需要映射到的工艺库而link_library变量设置为[list * target_library synthetic_library 其他宏单元]。