我是靠谱客的博主 壮观楼房,最近开发中收集的这篇文章主要介绍DC学习-第五章,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

5使用主存中的设计
Design Compiler从设计文件中将设计读入到主存中。多个设计可以同时驻存于主存中。在设计读入后,你可以以多种方式来改变它,譬如对其自设计进行分组和解除分组或者改变子设计的引用。
本章包含了一下部分:
 设计的术语
 读取设计
 列出主存中的设计
 设置当前设计
 连接设计
 列出设计对象
 指定设计对象
 创建设计
 复制设计
 重命名设计
 改变设计层次
 编辑设计
 不同工艺库间设计的转换
 从主存中移除设计
 保存设计
 使用属性
设计术语
不同的公司会对他们自己的设计和组件有不同的术语。本节描述了Synopsys综合工具使用的术语。
关于设计
设计是执行逻辑功能的电路描述。设计可以使用多种设计格式,譬如VHDL或者verilog HDL。
逻辑级设计表现为布尔方程组。门级设计,譬如网表,表现为互相连接的单元。
设计可以单独的存在和单独的编译,或者它们可以被用作更大的设计的子设计。设计可以是打平的或者是层次化的。
打平的设计
打平的设计时指没有子设计只有一个结构层次。它们子包含库单元。
层次化设计
层次化设计会包含一个或多个设计作为子设计。每个子设计可以进一步包含自身的子设计,来创建多层的设计层次。包含子设计的设计被称为父设计。
设计对象
图5-1 显示了名为TOP的设计的设计对象。Synopsys命令,属性和约束都指向特定的设计对象。
图5-1 设计对象

设计
一个设计由实例,线,端口和引脚组成。它可以包含子设计和库单元。在图5-1中,TOP,ENCODER和REGFILE都是设计。激活的设计(处于工作状态的设计)被称为当前设计。大部分命令都是作用于当前设计的,也就是说,它们是在当前设计的上下文中国运行。
引用
一个引用是指一个库部件或者可以用于构建一个更大的电路的设计。一个引用的结构可以是简单的逻辑门或是一个更复杂的设计(一个RAM核或者CPU)。一个设计可以对一个引用进行多次使用;每次使用都是一个实例。
引用可以使你在不影响其他设计中的单元的前提下,对单个设计的每个单元(譬如NAND门)进行优化。一个设计中的引用和其他设计中的相同的引用是独立的。在图5-1中,INV,ENCODER和REGFILE都是引用。
实例和单元
一个实例是载入到主存的引用电路的一次使用;每一个实例都有一个单独的名字。一个设计可以包含多个实例;每个指向同一个引用的实例都有不同的名字以便互相区分。一个实例也可以被称为单元。
一个设计在另一个设计中的实例称为层次化实例。一个设计中库单元的实例称为leaf cell。一些命令工作在当前设计的层次化实例上下文中。当前实例为特定实例命令定义了激活的实例。在图5-1中,U1,U2,U3和U4都是实例。
Ports(端口)
端口是设计的输入和输出。端口方向只能被指定为输入,输出或者inout。
Pins(引脚)
引脚是设计中单元的输入和输出。子设计的端口便是父设计的pins。
Nets
Nets是连接端口和引脚和引脚互联的线。
设计,实例和引用之间的关系
图5-2 显示了设计,实例和引用之间的关系。
图5-2 实例和引用

EXREF设计办了两个引用:NAND2和MULTIPLIER。NAND2被例化了三次,MULTIPLIER被例化了一次。
NAND2的三个实例的名字为U1,U2,和U3。在EXREF设计中NAND2和MULTIPLIER的引用和其他设计中的相同的引用是相互独立的。
关于解析引用的信息,请参考“连接设计”。
报告引用
你可以用report_reference命令来报告关于当前实例或当前设计中所有引用的信息。使用-hierarchy选项来显示在当前实例或当前设计的夸层次信息。
使用引用对象
当你使用get_references名时,Design Compiler返回有特定引用的实例的集合,并对这些实例进行操作。
举个例子,下面的命令返回当前设计的有引用AN2实例的集合:

使用以下命令来查看引用名:

读取设计
Design Compiler可以以表5-1中列出的格式读取设计。
表5-1 支持的输入格式

读取设计文件的命令
Design Compiler提供下面的方式来读取设计文件:
 analyze和elaborate命令
 read_file命令
使用analyze和elaborate命令
analyze命令会进行以下操作:
 读取HDL源文件
 检查错误(单不会为设计建立generic 逻辑)
 以HDL无关的中间格式创建HDL库对象
 在你指定的位置存储中间文件
如果analyze报告了错误,需要在HDL源文件中修改这些错误并且再一次运行analyze。
按照如下的方式使用analyze命令的选项:
表5-2 使用analyze命令选项

elaborate命令会进行以下操作:
 将设计从analysis过程中产生中间文件翻译成工艺无关的设计(GTECH)
 允许源代码定义的参数值的改变
 允许VHDL结构的选择
 将代码中HDL算数操作符替换为DesignWare部件
 自动执行link命令,用于解析设计引用
按以下的方式使用elaborate命令的选项:
表5-3 使用elaborate命令选项

更多关于analyze和elaborate命令的信息,请参考man pages和HDL Compiler for Verilog User Guide 或者HDL Compiler for VHDL User Guide。
使用read_file命令
read_file命令会进行以下操作:
 读取几种不同的格式
 执行与analyze和elaborate命令相同的操作
 为VHDL创建.mr和.st中间文件
 不会自动执行link命令(参考“连接设计”)
 不会为Verilog创建任何中间文件(但是,你可以通过将hdlin_auto_save_templates变量设置true来让read_fil命令创建中间文件)
对于主存中的设计,Design Compiler使用path_name/design.ddc的命名规则。其中path_name是读取初始文件的目录,design是设计的名字。如果你稍后要读取有相同文件名的设计,Design Compiler会覆盖之前的设计。为了防止这种情况发生使用read_file命令的-single_file选项。
如果你不指定设计的格式,read_file命令会基于文件的拓展名来推断格式。如果使用了未知的拓展名,工具会假设是.ddc格式。支持自动推断的拓展名是不去人大小写的。read_file命令允许读取除.ddc格式外的压缩文件,ddc格式在内部写入时就被压缩了。为了能让工具为压缩文件自动推断文件格式,使用下面的命名结构:..gz。
支持下面的格式:
 ddc格式:使用.ddc拓展名
 db格式:使用.db,.sldc,.sdc,.db.gz,sldb.gz和.sdb.gz拓展名
 Verilog格式:使用.v,.verilog,.v.gz和.verilog.gz拓展名
 SystemVerilog:使用.sv,.sverilog,.svn.gz和.sverilog.gz拓展名
 VHDL:使用.vhdl,.vhdl,vhd.gz和.vhdl.gz拓展名
表5-4 使用read_file命令选项

表5-5 总结了使用read_file命令和使用analyze加elaborate命令来读取设计文件的不同之处
图5-5 read_file对比analyze和elaborate命令

读取HDL设计
使用下面任一种方式来读取HDL设计文件:
 analyze和elaborate命令
为了使用这种方法,一由下而上的顺序analyze顶层设计和所有子设计,然后以自顶向下的方式elaborate顶层设计和那些需要为参数赋值或重写的子设计。
例如,输入

 read_file命令
例如,输入

 read_verilog或者read_vhdl命令
例如,输入

你也可以使用read_file –format VHDL和read_file –format verilog命令。
读取.ddc文件
使用read_ddc命令或者read_file -format ddc命令来读取.ddc 文件的设计数据。例如,

注意:
.ddc文件时向后兼容(你可以打开更早版本软件生成的ddc文件)的而非向前兼容的(你无法打开更新版本软件生成的ddc文件)。
读取.db文件
虽然你可以使用.db格式,但是还是建议使用.ddc格式。为了读取.db文件。使用read_db命令或者read_file –format db命令。
例如,

.db文件的版本就是创建该文件的Design Compiler的版本。对于一个将要被读入到Design Compiler的.db文件。器版本必须不晚于你所使用的Design Compiler的版本。如果你试图读取一个有晚于你使用Design Compiler版本的Design Compiler生成.db文件,会出现error信息。Error信息提供了版本不匹配的细节。
列出主存中的设计
使用list_designs命令可以列出载入到内存中的设计的名字。

设计A后的星号(*)表示A是当前设计。
使用-show_file选项可以列出与每个设计名相对应的主存文件名。

设计A后的星号(*)表示A是当前设计。文件B.ddc包含了设计B和设计C
设置当前设计
你可以通过下面的方式来设置当前设计(你正在工作的设计):
 使用read_file命令
当read_file命令成功地执行完后,它会将当前设计设置成读入的设计,

 使用elaborate命令
 使用current_design命令
使用这个命令可以将dc_shell主存中的任意设计设置为当前设计。

显示当前设计的名字,请输入以下命令:

使用current_design命令
你应该避免在脚本中使用大量的current_design命令,譬如在一个循环中使用该命令。大量的使用current_design命令会增加运行时间。更多信息,请参考第五章的Design Compiler Command-Line Interface Guide。
若干命令接受实例对象(层次中较低层的单元)。你可以对设计中的任何层级的层次化设计进行操作,而不必使用current_design命令。下面列出了增强的命令:
 网表编辑命令
更多信息,请参考“Editing Designs”。
 ungroup,group和uniquify命令
更多信息,请参考“Removing Levels of Hierarchy”和”Uniquify Method”。
 set_size_only命令
该命令为指定的leaf cell设置属性列表,这样优化可以在编译时对这些单元进行尺寸优化。
 Change_link命令
更多信息,请参考“Changing Design References”。
连接设计
对于一个完整的设计,它必须连接到所有的库组件和它引用的设计。这个过程称为(连接)linking或者解析引用。
Design Compiler使用link命令来解析引用。link命令使用link_library和search_path系统变量与local_link_library属性来解析设计引用。
Design Compiler通过以下几步来解析引用:
1、 它决定哪些库部件和子设计在当前设计和其层次被引用。
2、 它搜索link libraries来定位这些引用。
a、 Design Compiler会优先搜索当前设计的local_link_library属性定义的库。
b、 如果在link_library变种指定了星号,Design Compiler会在主存中搜索引用。
c、 Design Compiler然后搜索link_library变量定义的库和设计文件。
3、 如果它无法在link libraries中找到引用,它会搜索由search_path变量指定的目录。请参考“Locating Designs by Using a Search Path”。
4、 它将找到的引用连接到设计。
注意:
在层次化设计中,Design Compiler使用顶层设计的本地link library。它会忽略和子设计相关的本地link library。
Design Compiler使用它找到的第一个引用。如果它找到了其他同名的引用,它会产生一个告警信息来指明将这个同名引用忽略。如果Design Compiler没有找到引用,一个提示引用无法解析的警告会生成。
默认情况下,引用过程是否区分大小写取决于引用的源。为了明确定义连接过程是否是区分大小的,请设置link_force_case变量。
图5-3的箭头显示了连接过程中增加的实例,引用和link libraries之间的连接。在这个例子中,Design Compiler寻找库部件NAND2和LIBRARY_2 technology library;它在一个设计文件中寻找子设计MULTIPLIER。
图5-3 解析引用

通过Search Path来寻找设计
你可以通过使用完整的路径或者仅仅通过文件名来指定设计文件。如果你只是通过文件名来指定,Design Compiler会使用search_path变量中定义的搜索路径。Design Compiler会从search_path变量指定最左边的目录开始寻找设计文件,并使用它找到的第一个设计文件。默认情况下,搜索路径包含当前工作目录和 S Y N O P S Y S / l i b r a r i e s / s y n , 其 中 SYNOPSYS/libraries/syn,其中 SYNOPSYS/libraries/synSYNOPSYS是Design Compiler的安装目录。在使用搜索路径时,可以使用which命令来查看Design Compiler在哪里找到的文件。例如,输入

当需要为默认搜索路径添加其他路径时,使用下面的命令:

改变设计引用
使用change_link命令来改变一个单元或引用连接的部件或者设计。
 对于一个单元,那个单元的连接会被改变。
 对于一个引用,所有由该引用的单元的连接都会被改变。
连接只能被修改到一个有同样数目的端口部件或设计,并且和原来的引用的尺寸和方向一致。
当你使用chang_link时,所有的link信息都会从老的设计被复制到新的设计。如果老的设计时综合后的模块,所有的老的属性都作用于新的连接。
在运行了chang_link命令后,你必须用link命令再运行一次设计。
Change_link命令接受实例对像(层次中低层次的单元)。另外,当object_list中的任何单元是下一层的实例并且他的父单元不是唯一的,你可以使用-all_instances选项。同样父设计中所有类似的单元都会自动连接到新的引用设计中。你不是必须通过改变当前设计来改变这些单元的连接。如果boject_list中没有一个单元是低层次的实例或者其父单元是唯一的,你就不是必须使用-all_instances选项。
例1
下面的命令显示了单元U1和U2是如何从当前设计连接到MY_ADDER的:

例2
下面的命令改变了单元U1的连接,U1是位于层次中较低的层级:

例3
这个例子显示了你如果使用-all_instances选项来改变inv1的连接,其父设计(bot)被多次例化。这个设计bot被例化了两次:mid1/bot1和mid1/bot2.

列出设计对象
Design Compiler提供了访问设计对象的命令。这些命令涉及的设计对象都是位于当前设计的。表5-6中的每个命令都会执行下面动作中的一个:
 List
提供最小信息的清单
 Display
提供包含设计对象特征的报告
 Return
返回可以作为另一个dc_shell命令的输入的集合。
表5-6 接受设计对象的命令

指定设计对象
你可以使用相对路径或者绝对路径来指定设计对象。
使用相对路径
如果你使用相对路径来指定一个设计对象,这个对象必须位于当前设计。指定路径是相对于当前实例的。当前实例是当前设计的引用框架。默认情况下,当前实例是当前设计的顶层。使用current_instance命令来改变当前实例。
举个例子,为Count_16设计中的层次单元U1/U15设置don’t_touch属性,你可以输入

或者

在第一个命令序列中,引用框架依然是设计Count_16的顶层。在第二个命令序列中,引用框架变成了实例U1。Design Compiler解释和实例U1相关的所有未来对象的规范。
输入不带任何参数的current_instance命令可以将当前实例复位到当前设计的顶层。

Current_instance变量指向当前实例。输入以下命令,可以显示当前实例:

使用绝对路径
当你使用绝对路径来指定设计对象时,这些对象可以是dc_shell主存中的任一设计。用下面的语法来指定使用绝对路径的对象:

file
memory文件的路径名后跟一个分号(:)。当在主存中有多个同名的设计时,需要使用文件参数。
design
dc_shell主存中一个设计的名字。
object
设计对象的名字,包括其层次路径。如果若干不同类型的对象有同样的名字并且你没有指定对象类型,Design Compiler通过使用该命令允许的类型来寻找对象。
使用get_*命令来指定对象类型。更多关于这些命令的信息,请参考Design Compiler Command-Line Interface Guide。
例如,为Count_16设计中的层次化单元U1/U15设置don’t_touch属性,输入

创建设计
Creat_design命令会穿件一个新的设计。存储文件名时my_design.db,并且其路径就是当前工作目录。

由creat_design创建的设计不包含设计对象。使用适当的创建命令(譬如creat_clock,creat_cell或者creat_port)来为新设计增加设计对象。更多关于这些命令的信息,请参考“Editing Designs”。
复制设计
Copy_design命令复制内存中的设计,并为副本重命名。副本和原设计由同样的路径和存储文件。

你可以使用copy_design命令配合change_link命令来手动创建一个独立的实例。例如,假设设计有两个一样的单元,U1和U2都连接到了COMP。
输入下面的命令来创建一个独立的实例:

重命名设计
使用rename_design命令来重命名主存中的设计。你可以为设计指定一个新名字或者将设计列表移动到一个文件中。使用write命令可以保存重命名的文件。可以以如下的方式使用rename_design命令的选项:
表5-7 使用rename_design命令选项

下面的例子中,list_design命令用于在使用rename_design命令前后显示设计。

你可以使用-prefix,-postfix和-update_links选项来重命名设计并为整个设计层次更新单元连接。例如,下面的脚本为设计D的名字添加NEW_的前缀并且为它的实例单元更新连接:

单元b_in_a/c_in_b/d1_in_c和b_in_a/c_in_b/d2_in_c例化设计D。在你运行rename_design D –prefix NEW -update_links命令后,实例会被重新连接到重命名的引用,设计NEW_D。
改变设计层次
如果可能,在你的HDL描述中反映出你的设计分块。如果你的HDL代码已经开发完成,Design Compiler允许你在不改变HDL描述的前提下改变层次结构。
report_hierarchy命令显示了设计层次。使用这个命令在做出改变前来理解当前层次并且用来确认层次的改变。
Design Compiler提供了下面的操作层次的能力:
 增加层次的层级
 移除层次的某些层级
 从不同子设计中合并单元
下面的章节描述了这些能力。
增加层次的层级
增加层次的层级被称为分组(grouping)。你可通过对单元或者相关组件分组到子设计中以创建一个层次的层级。
将单元分组到子设计
你使用group命令来将设计中的单元(实例)分组到新的子设计中,来创建层次中一个新的层级。分组的单元会被引用新子设计的新的实例(单元)替换。
新的子设计的端口以他们在设计中连接到的网线命名。新的子设计的每个端口的方向由对应网线的引脚决定的。
通过group命令来创建子设计时,按照以下方式使用它的参数和选项:
表5-8 使用group命令

注意:
对单元进行分组可能不会保持原单元所有的属性和约束。下面的例子解释了如何使用group命令。
例1
将两个单元分组到一个名为SAMPLE的新设计并命名为U,输入

例2
将以alu为开头命名的单元分组到的新设计UP中,并命名为UCELL,输入

例3
下面的例子,三个单元(bot1,fool1和j)会被分组到一个新的名为SAMPLE的子设计中,并且其例化名为U1。该单元在层次中的低层级中并且都在同一层;其父设计是唯一的。

前面的命令等价于以下两个命令:

将相关组件分组到子设计
你一样要使用group命令(但是使用不同的选项)来将相关组件分组到子设计中。为了将相关组件分组,按以下的方式使用group命令的选项:
图5-9 使用group命令的选项

注意:
-design_name和-cell_name可和hdl_all_blocks或hdl_bussed选项配合使用
例1
将在过程ftj的HDL功能条中所有单元分组到设计new_block中,输入

例2
将过程ftj下的所有总线化的门电路分组到层次中单独的层级,输入

移除层次中的层级
Design Compiler不会跨层次边界;因此,你或许想要移除特定设计的层次。通过这么做,你或许可以提高时序结果。
移除层次中的层级称为解分组。解分组会将层次中给定的层级的子设计合并到父单元或父设计中。解分组可以在优化前或者优化中完成(显示的或自动的)。
注意:
有dont_touch属性的设计,子设计和单元是无法在优化前或者优化中被解分组(包括自动解分组)的。
优化前对层次结构解除分组
你可以使用ungroup命令在优化前来解分组一个或多个设计。
为ungroup命令使用下面的参数和选线:
表5-10 使用ungroup命令的选项

注意:
如果你解分组单元然后使用change_names命令来修改层次分隔符(/),你可能会失去属性和约束信息
例1
解分组一系列单元,输入

例2
解分组单元U1并在创建新单元时为其制定前缀,输入

例3
完全打平当前设计的层次的设计,输入

例4
递归的解分组属于CELL_X单元,其中CELL_X是位于当前设计下的第三层。输入

例5
递归的解分组单元,该单元位于当前设计下的第三层,并且输入单元U1和U2(U1和U2是当前设计的子单元),输入

例6
递归的解分组所有当前设计下第三层的单元,输入

例7
本例显示了当父设计唯一时ungroup命令如何接受实例对象(低层次的单元)。在例子中,M1D1/BOT1时设计BOT的唯一实例。这个命令解分组单元MID1/BOT1/FOO1和MID1/BOT1/FOO2

前面的命令等效于下面两条命令:

在优化过程中解分组层次
你可以在优化过程中显示的或自动的解分组设计。
在优化过程中显式地解分组层次
你可以通过使用set_ungroup命令跟在compile命令或者-ungroup_all编译选项后来控制哪一个设计在优化期间解分组。
 当你想指定解分组的单元或者设计时使用set_ungroup命令。这个命令为指定的单元或引用设计设置ungroup属性。如果你对一个设计设置这个属性,所有引用这个设计的引用都会解分组。
例如,为了在优化期间分组单元U1,输入下面的命令:

查看一个对象是否有ungroup属性设置,可以使用get_attributemingl。

移除ungroup属性,使用remove_attribute命令或者将ungroup属性设置为false。

在优化过程中自动的解分组层次
自动地在优化期间解分组层次,你可以使用compile_ultra命令或者compile命令的-auto_ungroup选项。Design Compiler提供了两个选项来自动解分组层次:基于面积的自动解分组和基于延时的自动解分组。
默认情况下,conpile_ultra命令执行基于延时的自动解分组。它沿着关键路径解分组层次,本质上是用于时序优化。另外,这个命令会在初始化映射时执行基于面积的自动解分组。工具为未映射的层次进行评估并且移除小的子设计;其目标就是提升面积和时序的结果。
使用compile命令的自动解分组能力,输入

一次只能使用一个参数:要么是基于面积的自动解分组的area参数,要么是基于延时的自动解分组的delay参数。
在解分组开始前,工具会发出消息来指明指定的层次被解分组。
在自动解分组后,使用report_auto_ungroup命令来获取关于一些层次的报告。这些层次在cell-count-basel自动解分组或者基于延时的自动解分组的过程中会被解分组。这个报告会给出实例名。单元名和每个解分组层次的实例数量。更多关于自动解分组的信息,请参考Design Compiler Optimization Reference Maual。
在解分组勤俭保持层次化引脚的时序约束
层次化管脚会在单元被解分组时被移除。取决于你在优化前或者优化后是否解分组层次,Design Compiler会以不同的方式处理层次化管脚上的时序约束。下面的表总结了解分组对不同编译流程中时序约束的影响。
表5-11 保存层次化引脚的时序约束

当保持时序约束时,Design Compiler会为合适的相邻的,延绵的管脚(就是在解分组后在同样的网线上的pin脚)重新分配时序约束。约束会向前或向后移动到同一根线连接的其他pin脚。注意,只有在该pin脚只驱动了原层次的pin而没有驱动其他pin脚时,约束才能向后移动,否则约束只能向前移动。
如果约束移动到了leaf cell,而该单元会被赋予size_only属性来在编译期间保持约束。因此,size_only的单元数量会增加,这样可能限制优化过程的范围。为了克服这种影响,当向前或者向后都可以时,Design Compiler会选择新产生size_only属性的leaf cell数量少的方向。
当你对未映射的设计进行解分组时,层次的pin的约束移动到一个leaf cell而且会被赋予size_only的属性。但是约束只会在未映射的单元和target library单元之间有一一映射时才会在整个编译期间一直保持。
只有以下的命令设置的时序约束才会被保留:
 set_false_path
 set_multicycle_path
 set_min_delay
 set_max_delay
 set_input_delay
 set_output_delay
 set_disable_timing
 set_case_analysis
 creat_clock
 creat_generated_clock
 set_propagated_clock
 set_clock_latency
注意:
set_rtl_load约束不会被保留。同样的,只有当前设计的时序约束会被保留。其他设计的时序约束可能会应为当前设计的解分组层次而丢失。
合并来自不同子设计的单元
为了将来自不同子设计的单元合并到一个新的子设计中,

  1. 将单元分组到新的设计。
  2. 将新的设计解分组。
    举个例子,下面的命令序列创建了新的alu设计,该设计包含了最初位于子设计u_add和u_mult的单元。

编辑设计
Design Compiler为增量编辑主存中设计提供了命令。这些命令允许你通过使用dc_shell命令而不是外部格式改变网表或者编辑设计。
表5-12 设计编辑任务和命令

对于唯一的设计,这些网表编辑命令接受实例对象(也就是层次中低层次的单元)。你可以操作层次设计中任何层级的设计而不必使用current_design命令。例如,你可以输入下面命令来在设计mid1中创建一个称为foo的单元:

当连接或断开网络时,使用all_connected命令来查看连接到网络,端口,或者pin脚的对象。例如,下面序列的命令将引用从单元U8替换为high-power反相器。

注意:
你可以通过使用change_link命令获得和上面列出的一系列命令获得一样的结果。例如,下面的命令将单元U8替换为high-power 反相器:

类似于IC编译的额外的网表编辑命令是有效的。这些命令描述如下:
 调整单元尺寸
你可以使用get_alternative_lib_cell命令来返回等效于特定单元或库单元的库单元的集合。然后你可以使用这个集合来替换单元或调整单元的尺寸。size_cell命令允许你通过连接到新的满足需求的库单元来改变驱动leaf cell能力。
 插入buffer或反相器对
你可以使用insert_buffer命令来为pin脚或者端口哦增加buffer。-inverter_pair选项允许你指定插入一对反向库单元而不是单个非反向库单元。你可以使用get_buffer命令来检索所有苦衷buffer和反相器。
 插入中继器
insert_buffer命令的-no_of_cell选项允许你选择两个pin网络的驱动器并在由该驱动器驱动的网络中插入单散出buffer链。
 移除buffer
你可以使用remove_buffer命令来移除buffer。
将设计从一种工艺转换到另一种工艺
使用translate命令来将设计从一种工艺翻译到另一种工艺。如果你正在使用Design Compiler的topographical模式,使用compile_ultra –inc命令。设计会一个单元一个单元的被从原technology库转换到新的technology库,并同时保留原设计的门级结构。翻译器使用每个现存的单元(部件)功能描述来决定新technology库(target library)的匹配部件。如果一个部件没有精准的替换部件,那么就会使用target library中的部件来重映射。
你可以通过偏好或禁止特定的库单元(使用set_prefer和set_dont_use命令)和指定寄存器类型(使用set_register_type命令)来影响替换单元的选择。target_library变量指定了target libraries。顶层设计的local_link_library变量在设计被连接后会被设置为target_library的值。
translate命令不会对有don’t_touch属性的单元或者设计进行操作。在翻译过程结束后,Design Compiler会报告没有成功翻译的单元。
在Design Compiler中翻译设计
大部分设计会用到下面的步骤,但是对一些复杂的设计,手动干预可能是必要的。
为了翻译设计,
1、 读入你的映射的设计。

2、 为新的technology library设置target library。

3、调用translate命令

在设计被翻译后,你可以编译它来改进在新technology库中的实现。
在Design Compiler Topographical模式中翻译设计
为了在Design Compiler topographical模式中将设计映射到新technology,
1、将原technology library添加到link library:

2、为新的target technology设置Design Compiler。
a.指定逻辑库
b.指定物理库
3、 读取映射后的设计:

4 、运行compile_ultra –incremental命令来将设计翻译到新technology。
工艺转换的限制
当你将设计从一种工艺翻译到另一种时,请记住以下限制:
 translate命令只是在翻译阶段翻译功能逻辑而不会保留驱动力。它总是使用最低驱动能力版本的单元。这样可能导致网表违例。
 如果你想将CMOS三态门单元翻译到FPGA,两种工艺之间的功能等价可能不存在。
 CMOS三台部件的总线驱动必须被完全译码(Design Compiler认为只有一个总线驱动可以处于激活状态)。如果是这样的话,总线驱动会被翻译为控制逻辑。为了使用这个功能,在翻译前将变量compile_assume_fully_decoded_three_state_buses设置为true。
 如果设计中的三态总线连接到了一个或者多个输出端口,将这个总线翻译成多路复用信号会改变端口的功能。因为translate不会改变端口功能,所有这种情形会被当做错误报告出来。
从主存中移除设计
remove_design命令从dc_shell主存中移除设计。例如,在完成了一个变异会话并且保存了优化后的设计之后,你可以使用remove_design来在读入另一个设计之前删除主存中的这个设计。
默认情况下,remov_design命令只会移除指定的设计。如果想移除一个子设计,请指定-hierarchy选项。如果想移除主存中的所有设计(和库),指定-all选项。
如果你定义了引用设计对象的变量,Design Compiler会在你从主存移除设计时移除这些引用。这样就阻止了后面的命令去试图操作不存在的设计对象。例如,

保存设计
你可以在任何时间使用不同的名字或格式来保存(写入磁盘)设计和子设计。在设计被修改后,你应该手动的保存它。Design Compiler不会在退出前自动保存设计。
表5-13列出了Design Compiler支持的设计文件格式。
表5-13 支持的输出格式

保存设计文件的命令
Design Compiler提供了下面的方法来保存设计文件:
 write命令
 write_milkway命令
使用write命令
你可使用write命令来将主存中的设计转换为你指定的格式,并将其保存在磁盘中。
按如表5-14所示的选项来使用write命令。
表5-14 使用write命令的选项

使用write_milkway命令
你可以在dc_shell中使用write_milkway命令来写milkway database。Write_milkway命令基于主存中的网表创建设计文件并将当前设计的数据保存在该文件中。更多信息,请参考第11章,“Using a Milkyway Database”。
以.ddc格式保存设计
使用write –format ddc命令将设计数据保存在.ddc文件中。
默认情况下,write命令只保存顶层的设计。为了保存整个设计,请指定-hierarchy选项。如果你没有使用-output选项来指定输出文件的名字,write –format ddc命令会创建一个名为top_design.ddc的文件,其中top_design是当前设计的名字。
例1
下面的命令将层次中指定的设计中所有层次的设计写出:

例2
下面的命令将多个设计写入到一个文件中:

确保设计数据和网标命名的一致性
在从dc_shell写入网标前,需要确保所有的线网和端口名遵循你使用的layout工具的命名规则。同时也要确保你使用的是一套一致的总线命名格式。
一些ASIC和EDA供应商有创建包含将名字转换为他们自己风格的命令的.synopsys_dc.setup文件的程序。如果你需要改变线网或者端口名,使用define_name_rule和change_names命令。
.synopsys_dc.setup文件的命名规则部分
例5-1 显示了由特定布局工具供应商创建的示例命名规则。这些命名规则会进行以下的事:
 将对象名现在在数字字母字符
 将DesignWare单元名字改成可用的名字(将“*cell”改为”U”,”-return”改为“RET”)
你的供应商可能会使用不同的命名规则。请与供应商联系,以确定需要遵循的命名约定。
例5-1 .synopsys_dc.setup文件的命名规则部分

使用define_name_rules –map命令
例5-2 显示了如何使用define_name_rule的-map选项来避免字符串格式的错误。如果你不准守该规则,会有错误出现。
例5-2 使用define_name_rule –map

例如,从单元名中删除尾随的下划线,输入

更多define_name_rule命令的信息,请参考man page。
解决流程中的命名问题
你可能在设计对象,输入输出文件和工具设置中遇到命名规则冲突。在设计数据文件中,有很多设计对象(譬如端口,线网,单元,逻辑模块和逻辑模块引脚),每一种对象都有他们自己的命名规则。此外,你或许会正在你的流程中使用多种输入输出的文件格式。每一种文件格式都不相同并且都自己的语法定义。使用来自多个供应商的工具设置可能会映入额外的命名问题。
为了解决命名问题,使用change_names命令以确保所有的文件名匹配。正确的命名会消除设计中的名称转移或不匹配的错误。
更多的关于change_names命令的信息,请参考man page。
解决命名问题的方法
为了解决命名问题,在写入任何文件前改变设计数据中的名字。你初始流程是

  1. 读入你的RTL并提供约束。
    这里不需要更改你的方法

  2. 编译设计以产生门级描述。
    按照你常规的方法编译或重优化你的设计。使用标准的脚本集。

  3. 进行名称的改变并解决名字问题,在你写设计前使用change_names命令和它的verilog或VHDL开关。
    重要信息:
    当你想写一个verilog和VHDL设计时,使用change_names -rules -[verilog|vhdl] –hierarchy命令。因为设计数据文件的命名不是verilog或者VHDL兼容的。例如,输入

  4. 将文件写入到磁盘。使用write –format Verilog 命令。
    查看报告的名称更改,者意味着你需要重复步骤3并优化命名规则。

  5. 如果做出了所有的合适的命名改变,你的输出文件就可以和设计数据文件匹配。输入下面的命令并比较输出。

  6. 为第三方工具写入文件。
    如果你需要特定命名控制,请使用define_name_rule命令。参考“Using the define_name_rules –map Command”。
    修改名称的命令的总结
    表5-15 总结了修改名字的命令。
    表5-15 修改名字的命令的总结

使用属性
属性描述了设计数据中的对象的逻辑,电子,物理和其他的特性。属性附加于一个设计对象且和设计数据保存在一起。
Design Compiler对下面类型对象使用属性:
 整个设计
 譬如时钟,线网,引脚和端口的设计对象
 设计中的设计引用和单元实例
 Technology libraries,库单元和单元引脚
一个属性有名字,类型和值。属性可以有以下类型:字符串,数字和逻辑(布尔)。
一些属性是预定义的并且可以被Design Compiler识别;其他属性是用户定义的。附录C列出了预定义的属性。
一些属性是只读的。Design Compiler设置这些属性的值并且你无法修改它们。其他属性是可读可写的。你可以在任何时候改变这些值。
大部分属性应用于一个对象类型;例如,rise_drive属性只应用于输入和inout端口。一些属性应用于多个对象类型;例如,don’t_touch属性可以应用于线网,单元,端口,引用和设计。你可以获取关于预定义属性的详细信息,这些属性可应用于每种对象类型,获取这些信息可以使用表5-16中列出的命令。
表5-16 获取属性描述的命令

设置属性值
使用下面方式的一种来设置属性的值。
 一个特定属性的命令
 set_attribute命令
使用特定属性的命令
使用特定属性的命令来设置命令的相关属性的值。
例如,

使用set_attribute命令
使用该命令来设置任何属性的值或者定义新属性并设置其值。
举个例子,为了为lsi_10k/FJK3这个库单元的don’t_touch属性,输入

set_attribute命令会对预定义属性类型强制执行并在你尝试为一个属性设置错误的值时产生一个错误。
使用list_attributes –application命令来确定预定义属性的类型。该命令生成所有属性以及他们类型的列表。为了生成更简洁的报告,你可以使用-class属性来将列表限制为应用于以下类型的属性:设计,端口,单元,时钟,引脚,线网,lib或引用。
例如,max_fanout属性具有预定义的浮点类型。假设你输入下面的命令,Design Compiler显示一个错误的信息:

如果一个属性应用于不止一个对象类型,Design Compiler在数据库中搜索命名对象。更多关于搜索顺序的信息,请参考“the object Search order”。
当你为一个引用(子设计或者库单元)设置属性时,该属性会应用于所有该引用的设计。当你为一个实例(单元,线网或者pin)设置属性时,该属性会覆盖由实例的引用集成而来的属性。
查看属性值
使用report_attribute命令来查看一个对象的所有属性。

为了查看一个对象的特定的属性,请使用get_attribute命令。
例如,为了获取端口OUT7的最大散出值,输入

如果一个属性应用于不止一个对象类型,Design Compiler会在数据库中搜索命名了的对象。更多关于搜索顺序的信息,请参考“The Object Search Order”。
保存属性值
Design Compiler不会在你退出dc_shell时自动保存属性值。使用write_script命令来生成用于重建属性值得dc_shell脚本。
注意:
write_script命令不支持用户定义的属性。
默认情况下,write_script会打印在屏幕上。使用重定向操作符(>)来重定向输出到文件。

定义属性
set_attribute命令允许你创建新的属性。使用”Using the set_attribute Command”中描述的set_attribute命令。
如果你想改变属性的值,先移除属性然后重建该属性来存储想要的类型。
移除属性
使用remove_attribute命令来移除一个对象的特定属性。
你无法使用remove_attribute命令来移除内在的属性。例如,如果don’t_touch属性被赋予了一个引用,从这个引用移除属性,而不是从继承了该属性的单元来移除属性。
例如,为了移除端口OUT7的max_fanout属性,输入

你可以通过使用remove_*命令来移除选定的属性。注意,一些属性依然需要带-default选项的set_*命令来移除之前由命令设置的属性。查看特定命令的man page来决定它是否有-default选项或者使用了对应的remove命令。
使用reset_design命令可以从当前设计移除所有的属性。

Reset_design命令移除所有的设计信息,包括时钟,输入和输出延时,路径组,操作条件,时间范围,和线负载模型。使用reset_design的结果通常等价于从头开始启动设计过程。
对象搜索顺序
当Design Compiler寻找一个对象时,搜索顺序是和命令相关的。对象包括设计,单元,线网,引用和库单元。
如果你不使用get命令,Design Compiler使用隐含顺序来定位对象。可以对多个类型的对象设置属性的命令使用这个搜索顺利来决定属性作用的对象。
例如,set_dont_use命令对单元,线网,引用和库单元进行操作。如果你通过set_dont_use命令义一个对象,X,并且两个对象(诸如设计和单元)都命名为X,Design Compiler将该属性应用于找到的第一个对象类型。这种情况下,这种属性会被设置到设计上,不是单元上。
Design Compiler会一直搜索直到它找到匹配的对象,或它在找不到匹配对象时显示一个错误信息。
你可以通过使用dctcl的get_*命令指定对象来重写默认搜索顺序。
例如,假设当前设计同时包含了名为critical的单元和线网。下面的命令会因为默认搜索顺序为其中的critical的单元设置don’t_touch属性:

为了将don’t_touch属性设置到线网上而不是单元上,使用以下命令:

最后

以上就是壮观楼房为你收集整理的DC学习-第五章的全部内容,希望文章能够帮你解决DC学习-第五章所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(43)

评论列表共有 0 条评论

立即
投稿
返回
顶部