数字ic后端设计从入门到精通(含fusion compiler, tcl教学)
pin
在集成电路设计中,特别是在使用工具如 Fusion Compiler 时,理解“引脚”(pin)的基础知识对于设计、优化和验证电路至关重要。以下是从 Fusion Compiler 的角度出发,关于引脚(pin)的基础知识介绍,包括其定义、类型、属性以及如何在 Fusion Compiler 中操作和查询引脚。
引脚(Pin)基础知识
1. 什么是引脚?
- 引脚是电路元件或模块的输入输出接口,用于与其他元件或模块进行信号传输。
- 在数字设计中,引脚可以连接到网络(nets),形成信号路径。
- 引脚可以是物理引脚(如芯片上的引脚)或逻辑引脚(如模块内部的连接点)。
2. 引脚的类型
- 输入引脚(Input Pin):接收来自其他元件或模块的信号。
- 输出引脚(Output Pin):向其他元件或模块发送信号。
- 双向引脚(Inout Pin):既可以作为输入也可以作为输出的引脚。
- 电源引脚(Power Pin):提供电源电压。
- 地引脚(Ground Pin):提供接地参考。
3. 引脚的主要属性
- 名称(Name):引脚的标识符。
- 方向(Direction):输入、输出、双向等。
- 连接的网络(Connected Nets):引脚连接到哪些网络。
- 电平标准(Electrical Standards):如 LVCMOS, LVTTL 等。
- 负载(Load):引脚的负载特性,影响信号完整性。
- 时序约束(Timing Constraints):如建立时间、保持时间等。
create pin
命令概述
- 命令名称:
create_pin
- 功能:在一个或多个单元(cell)上创建引脚。
- 用途:用于定义单元的输入、输出或双向引脚。这些引脚可以后续用于连接网络(nets)以传递信号。
语法
collection create_pin [-design design] [-direction in | out | inout] pin_names
参数说明
-
[-design design]
- 类型:集合(collection)
- 含义:指定要在哪个设计中创建引脚。如果未指定,则默认在当前设计中创建。
- 示例:
create_pin -design my_design {data1 data2}
-
[-direction in | out | inout]
- 类型:可选参数
- 含义:指定引脚的方向。如果不指定,默认方向为
in
(输入)。 - 选项:
in
:输入引脚。out
:输出引脚。inout
:双向引脚。
- 示例:
create_pin -direction out {output1 output2}
-
pin_names
- 类型:列表(list)
- 含义:指定要创建的引脚名称。每个引脚名称必须是唯一的。
- 示例:
create_pin {input1 input2}
详细描述
-
作用:
- 在当前设计(或通过
-design
指定的设计)中的单元上创建引脚。 - 创建的引脚是标量引脚(单比特),即每次只能创建一个单独的引脚。
- 在当前设计(或通过
-
限制:
- 如果指定的引脚名称已经存在于目标单元上,则会显示错误消息。
- 创建的引脚不会自动连接到任何网络(net)。需要使用
connect_net
命令手动建立连接。
-
重要提示:
- 引脚的方向决定了它在电路中的作用(输入、输出或双向)。
- 引脚的命名必须唯一,避免冲突。
示例用法
示例 1:在单元上创建输入和输出引脚
# 在单元 u14 上创建输入引脚 data1
create_pin -direction in u14/data1# 在单元 u14 上创建输出引脚 data2
create_pin -direction out u14/data2
- 结果:
- 创建了一个名为
u14/data1
的输入引脚。 - 创建了一个名为
u14/data2
的输出引脚。
- 创建了一个名为
示例 2:在嵌套单元上创建多个输入引脚
# 在嵌套单元 u23/u8/u1 上创建输入引脚 xg1 和 xg2
create_pin {u23/u8/u1/xg1 u23/u8/u1/xg2}
- 结果:
- 创建了两个输入引脚
u23/u8/u1/xg1
和u23/u8/u1/xg2
(默认方向为in
)。
- 创建了两个输入引脚
示例 3:切换当前实例并创建引脚
# 切换到单元 u5/u7
current_instance u5/u7# 在单元 u5/u7 上创建输入引脚 usr1 和 usr2
create_pin -direction in {usr1 usr2}
- 结果:
- 创建了两个输入引脚
u5/u7/usr1
和u5/u7/usr2
。
- 创建了两个输入引脚
注意事项
-
引脚的唯一性:
- 每个单元上的引脚名称必须唯一。如果尝试创建一个已经存在的引脚,工具会报错。
-
引脚的连接:
- 使用
create_pin
创建的引脚默认未连接到任何网络。需要使用connect_net
命令将引脚连接到特定的网络。
- 使用
-
设计范围:
- 如果未指定
-design
参数,命令将在当前设计中执行。 - 如果指定了
-design
参数,则命令将在指定的设计中执行。
- 如果未指定
-
引脚方向:
- 默认方向为
in
(输入)。如果需要其他方向,必须明确指定-direction
参数。
- 默认方向为
总结
create_pin
命令的核心功能是在设计中的单元上创建引脚,并指定其名称和方向。- 主要用途包括定义单元的输入、输出或双向接口。
- 最佳实践:
- 确保引脚名称唯一。
- 创建引脚后,使用
connect_net
命令建立连接。 - 在低功耗或多电源域设计中,合理规划引脚的方向和位置。
get_pins
get_pins
是 Synopsys Fusion Compiler 中的一个命令,用于从网表中创建一个引脚(pins)的集合。这个命令非常强大且灵活,允许用户通过多种方式选择和过滤引脚,以满足不同的设计需求。以下是对其主要参数和用法的详细解释:
主要用途
- 获取引脚集合:
get_pins
命令可以帮助你从设计中提取特定的一组引脚,这些引脚可以基于名称、连接的对象、物理位置等条件进行筛选。 - 支持多种查询方式:你可以通过指定模式、对象、点、区域等方式来获取所需的引脚集合。
参数详解
-
基本语法
collection get_pins [options] [patterns | -of_objects objects | -at point | -within region | -touching region | -intersect region]
这里的
collection
是返回的引脚集合,而options
和后面的参数用于定义如何筛选这些引脚。 -
常用选项
-hierarchical
:层次化搜索引脚,适用于需要跨层级查找的情况。-filter expression
:使用表达式进一步过滤结果集中的引脚,比如根据引脚属性。-regexp
:将模式视为正则表达式而非简单的通配符模式。-nocase
:忽略大小写进行匹配。-exact
:精确匹配,禁用简单模式匹配。-leaf
:仅包含叶子单元上的引脚,通常与-of_objects
一起使用。-physical_context
:只搜索物理引脚。-design design_name
:在指定的设计中查找引脚。
-
筛选引脚的方式
- patterns:基于名称模式匹配引脚。可以使用通配符
*
和?
或者正则表达式(如果启用了-regexp
)。 - -of_objects objects:获取与指定对象(如单元、网络等)相连的所有引脚。
- -at point:获取位于指定坐标
{x y}
上的所有引脚。 - -within region:获取完全位于指定矩形或多边形区域内的所有引脚。
- -touching region:获取与指定区域接触的所有引脚。
- -intersect region:获取与指定区域相交的所有引脚。
- patterns:基于名称模式匹配引脚。可以使用通配符
-
其他选项
-expect exact_count
:期望找到的确切数量的引脚,如果不是该数量则报错。-expect_at_least minimum_count
:期望找到的最少数量的引脚,如果不是至少该数量则报错。-expect_each_pattern_matches
:确保每个模式都至少匹配到一个对象,否则报错。-hsc separator_character
:指定分隔符,默认为/
。
示例
-
按名称模式获取引脚
set pins [get_pins "u1/*"]
获取名为
u1
的模块下的所有引脚。 -
基于对象获取引脚
set net_pins [get_pins -of_objects [get_nets "net_name"]]
获取与名为
net_name
的网络相连的所有引脚。 -
基于位置获取引脚
set pin_at_point [get_pins -at {100 200}]
获取位于坐标
(100, 200)
上的所有引脚。 -
使用过滤器
set filtered_pins [get_pins -filter "DIRECTION==IN" -of_objects [get_cells "cell_name"]]
获取名为
cell_name
的单元中方向为输入的所有引脚。
通过这些例子可以看出,get_pins
命令提供了丰富的选项来帮助设计师高效地管理和操作设计中的引脚,是后端设计流程中不可或缺的一部分。
核心功能
-
创建引脚集合:
get_pins
命令的主要功能是从当前设计中提取一组满足条件的引脚。- 返回值是一个 集合(collection),可以包含零个或多个引脚。
-
支持多种筛选方式:
- 通过名称模式、对象连接关系、物理位置、区域等条件来筛选引脚。
- 可以使用过滤器表达式进一步缩小结果范围。
-
自动链接设计:
- 如果没有找到匹配的对象,并且当前设计未链接(linked),工具会尝试自动链接设计。
-
支持总线(bus)引脚:
- 对于具有总线结构的引脚,可以通过通配符、正则表达式或下标模式来匹配多个引脚。
-
嵌套使用:
get_pins
的结果可以直接作为其他命令的输入,也可以赋值给变量以便后续操作。
关键概念
1. 引脚的层次化搜索
- 默认行为:
get_pins
默认只在当前实例的同一层级上搜索引脚。 - 跨层级搜索:
- 使用
-hierarchical
参数可以跨越层次结构搜索引脚。 - 使用
-leaf
参数可以仅返回叶子单元上的引脚,同时跨越层次边界。
- 使用
2. 基于对象的引脚筛选
- 当使用
-of_objects
参数时,get_pins
会查找与指定对象(如单元或网络)相连的所有引脚。 - 两种变体:
- 默认行为:仅返回与对象在同一层级上的引脚。
- 结合
-leaf
:仅返回与叶子单元相连的引脚。
3. 总线引脚的匹配
- 通配符匹配:
- 示例:
u1/A[*]
匹配总线A[0]
,A[1]
, 等等。
- 示例:
- 下标模式:
- 总线下标模式:
u1/A[0:7:2]
表示从索引 0 到 7,步长为 2 的引脚(即A[0]
,A[2]
,A[4]
,A[6]
)。 - 名称扩展下标模式:
u1/B(0:4:2)C(1:2,5)
表示生成所有符合规则的引脚名称(如B0C1
,B2C5
等)。
- 总线下标模式:
4. 正则表达式匹配
- 使用
-regexp
参数可以将模式视为正则表达式。 - 正则表达式的匹配是锚定的,意味着它必须完全匹配引脚名称的开头和结尾。
- 示例:
这将匹配所有以get_pins -regexp {o.*_reg/CP}
o
开头并以_reg/CP
结尾的引脚。
5. 过滤器表达式
- 使用
-filter
参数可以根据引脚的属性进行过滤。 - 示例:
这将返回所有方向为输入的引脚。get_pins -filter "DIRECTION == IN"
常见用例
1. 按名称模式获取引脚
get_pins o*/CP
- 获取所有以
o
开头且后缀为/CP
的引脚。 - 输出示例:
{"o_reg1/CP", "o_reg2/CP", "o_reg3/CP"}
2. 基于总线下标获取引脚
get_pins {U1/A[0:1,3:7:2]}
- 获取总线
A
的特定索引引脚。 - 输出示例:
{"U1/A[0]", "U1/A[1]", "U1/A[3]", "U1/A[5]", "U1/A[7]"}
3. 基于名称扩展获取引脚
get_pins U1/B(0:4:2)C(1:2,5)
- 获取名称符合扩展规则的所有引脚。
- 输出示例:
{"U1/B0C1", "U1/B0C2", "U1/B0C5", ...}
4. 基于对象获取引脚
set csel [get_cells o_reg1]
query_objects [get_pins -of_objects $csel]
- 获取
o_reg1
单元的所有引脚。 - 输出示例:
{"o_reg1/D", "o_reg1/CP", "o_reg1/CD", "o_reg1/Q", "o_reg1/QN"}
5. 区分局部引脚和叶子引脚
get_pins -of_objects [get_nets NET1]
get_pins -leaf -of_objects [get_nets NET1]
- 第一条命令返回
NET1
的局部引脚。 - 第二条命令返回
NET1
的叶子引脚(跨越层次边界)。
6. 创建时钟信号
create_clock -period 8 -name CLK [get_pins o_reg*/CP]
- 创建一个名为
CLK
的时钟信号,周期为 8,作用于所有匹配o_reg*/CP
的引脚。
注意事项
-
空结果处理:
- 如果没有找到匹配的引脚,命令返回空字符串。
- 可以使用
-quiet
参数抑制警告信息。
-
引脚数量限制:
- 默认情况下,工具最多显示 100 个引脚。
- 可以通过设置
shell.common.collection_result_display_limit
来调整显示数量。
-
特殊字符转义:
- 在使用总线下标模式时,
[]
和()
是 Tcl 的特殊字符,需要转义。例如:get_pins U1/A\[0:7\]
- 在使用总线下标模式时,
-
组合选项:
- 某些选项是互斥的,比如
patterns
和-of_objects
不能同时使用。 - 需要根据具体需求选择合适的参数组合。
- 某些选项是互斥的,比如
总结
get_pins
是一个灵活且功能强大的命令,适用于各种引脚筛选场景。通过掌握其基本语法、常用选项和实际用例,你可以高效地管理设计中的引脚集合,从而优化后端设计流程。如果还有其他问题或需要更深入的解释,请随时告诉我!
port和pin
在集成电路设计中,特别是在使用工具如 Fusion Compiler 时,port 和 pin 是两个相关但不同的概念。理解它们之间的关系对于有效地进行电路设计和优化至关重要。
Port(端口)
-
定义:
- 端口是模块或设计单元的输入、输出或双向接口。
- 它们用于定义模块与外部环境或其他模块之间的信号交互点。
-
用途:
- 端口通常在高层次的设计描述(如 Verilog 或 VHDL 文件)中定义,并作为模块接口的一部分。
- 端口可以是标量(单比特)或总线(多位)形式。
-
属性:
- 方向:输入(input)、输出(output)、双向(inout)。
- 类型:标量端口或总线端口。
- 名称:端口名称必须唯一且符合语言规范。
Pin(引脚)
-
定义:
- 引脚是物理或逻辑上的连接点,用于连接模块内部的信号到外部网络或其他模块。
- 在综合后或布局布线阶段,端口会映射为具体的引脚。
-
用途:
- 引脚用于表示模块内部逻辑单元之间的具体连接点。
- 在物理设计中,引脚还可能指代芯片封装上的实际物理引脚。
-
属性:
- 方向:输入、输出、双向。
- 连接的网络:每个引脚都会连接到一个网络(net),用于信号传输。
- 其他电气属性:驱动强度、负载等。
关系
- 端口与引脚的关系:
- 抽象与实现:端口是一个更高层次的概念,属于设计描述的一部分;而引脚则是端口的具体实现,在物理设计中有明确的位置和连接。
- 映射:在设计过程中,端口会被映射为引脚。例如,在综合阶段,HDL 中定义的端口将被转换为网表中的引脚。
- 对应性:通常,一个端口对应一个或多个引脚。对于简单的设计,这种对应是一对一的;但对于复杂的设计(如总线端口),一个端口可能对应多个引脚。
示例说明
假设有一个简单的模块 my_module
:
module my_module (input wire clk, // 输入端口input wire reset_n, // 输入端口output reg [7:0] data_out // 输出端口(总线)
);// 模块内部逻辑...
endmodule
在这个例子中:
clk
和reset_n
是输入端口。data_out
是一个8位宽的输出端口。
在综合和布局布线之后:
clk
和reset_n
将被映射为具体的输入引脚。data_out
将被映射为8个独立的输出引脚(每个位一个引脚)。
使用 Fusion Compiler 创建端口和引脚
创建端口
使用 create_logic_port
命令创建端口:
# 创建输入端口
create_logic_port clk -direction in
create_logic_port reset_n -direction in# 创建输出端口
create_logic_port data_out -direction out
创建引脚
使用 create_pin
命令创建引脚:
# 在单元上创建输入引脚
create_pin -direction in {clk reset_n}# 在单元上创建输出引脚(假设数据总线宽度为8)。
create_pin -direction out {data_out[0] data_out[1] data_out[2] ... data_out[7]}
总结
- Port(端口):是模块对外的接口,用于定义模块与其他模块或外部环境之间的信号交换点。
- Pin(引脚):是端口的具体实现,代表了物理或逻辑上的连接点,用于信号的实际传递。
- 关系:端口在高层次设计中定义,经过综合和布局布线后映射为具体的引脚。
- fusion compiler: 由于该工具既能综合又能布线,所以同时存在上述两种命令
在 Synopsys Fusion Compiler 2019(简称 FC2019)中,查看引脚(pin)的宽度、面积等物理参数需要使用相关的查询命令和工具功能。以下是具体的步骤和方法:
1. 使用 get_attribute
命令
get_attribute
命令可以用来查询对象(如 pin、net、cell 等)的属性值。对于引脚(pin),可以通过以下方式获取其物理参数:
语法
get_attribute [get_pins <pin_name>] <attribute_name>
常见物理属性
-
宽度(Width):
- 引脚的宽度通常由金属层的宽度定义。
- 示例:
get_attribute [get_pins u1/A] WIDTH
-
面积(Area):
- 引脚的面积可能与其形状或占用的金属资源相关。
- 示例:
get_attribute [get_pins u1/A] AREA
-
位置(Location):
- 获取引脚的物理坐标(X 和 Y)。
- 示例:
get_attribute [get_pins u1/A] LOCATION
-
层(Layer):
- 查看引脚所在的具体金属层。
- 示例:
get_attribute [get_pins u1/A] LAYER
-
方向(Direction):
- 查看引脚的方向(输入、输出或双向)。
- 示例:
get_attribute [get_pins u1/A] DIRECTION
2. 使用 report_pin
命令
report_pin
是一个专门用于生成引脚相关信息的报告命令。它可以显示引脚的物理和逻辑信息。
语法
report_pin [-physical] [-verbose] <pin_name>
选项说明
-
-physical
:- 显示引脚的物理属性(如宽度、层、位置等)。
- 示例:
report_pin -physical [get_pins u1/A]
-
-verbose
:- 显示更详细的引脚信息。
- 示例:
report_pin -verbose [get_pins u1/A]
输出示例
运行上述命令后,工具会输出类似以下的信息:
Pin: u1/ADirection: inputLayer: METAL3Width: 0.12Height: 0.08Location: (100.5, 200.3)Area: 0.0096
3. 使用图形化界面(GUI)
如果您的设计已经加载到 Fusion Compiler 的 GUI 中,您可以通过图形化界面直接查看引脚的物理参数。
步骤
- 打开设计并进入布局视图(Layout View)。
- 在视图中选择目标引脚(可以通过搜索功能快速定位)。
- 右键单击引脚,选择“Properties”或“Attributes”。
- 在弹出的窗口中查看引脚的物理参数(如宽度、面积、层等)。
4. 使用 query_objects
命令
query_objects
命令可以用来显示对象的详细信息,包括引脚的物理参数。
语法
query_objects [get_pins <pin_name>]
示例
query_objects [get_pins u1/A]
输出示例
Object: PINName: u1/AType: INPUTLayer: METAL3Width: 0.12Height: 0.08Location: (100.5, 200.3)Area: 0.0096
5. 使用 report_timing
或 report_power
命令
虽然这些命令主要用于时序和功耗分析,但它们也可能间接提供引脚的相关信息。例如:
report_timing
可能显示引脚的负载电容(Capacitance)。report_power
可能显示引脚的动态功耗。
示例
report_timing -to [get_pins u1/A]
report_power -pin [get_pins u1/A]
6. 注意事项
-
确保设计已链接(Linked):
- 如果设计未链接,某些物理属性可能无法查询。使用以下命令检查或链接设计:
check_design link_design
- 如果设计未链接,某些物理属性可能无法查询。使用以下命令检查或链接设计:
-
单位系统:
- Fusion Compiler 默认使用库文件中的单位(如微米、皮法拉等)。确保您了解当前设计的单位设置。
-
权限限制:
- 某些高级属性可能需要特定的许可证或工具配置才能访问。
-
空结果处理:
- 如果引脚没有定义某些物理属性(如宽度或面积),命令可能会返回空值。
总结
在 Synopsys Fusion Compiler 2019 中,查看引脚的宽度、面积等物理参数可以通过多种方式实现,包括使用 get_attribute
、report_pin
、query_objects
等命令,或者通过图形化界面直接查看。根据具体需求选择合适的方法,并确保设计已正确链接和初始化。
net
在数字 IC 后端设计中,net
是另一个非常重要的概念。它是信号在电路中的传输路径,连接了不同引脚(pins)或单元(cells)。以下是对 net
的基础知识的详细讲解,涵盖定义、类型、属性以及在工具中的操作方法。
1. 什么是 Net?
- 定义:
Net
是电路中的一条信号路径,用于连接多个引脚或单元。- 它表示一个逻辑信号在网络中的传播路径。
- 作用:
- 在逻辑上,
net
定义了信号的流向。 - 在物理上,
net
对应于实际的金属连线(wires)。
- 在逻辑上,
2. Net 的类型
根据功能和连接方式,net
可分为以下几种类型:
- 信号网(Signal Net):
- 用于传输普通信号(如数据、控制信号)。
- 示例:时钟信号(CLK)、数据信号(DATA)。
- 电源网(Power Net):
- 提供电源电压。
- 示例:VDD、VSS。
- 地网(Ground Net):
- 提供接地连接。
- 示例:GND。
- 时钟网(Clock Net):
- 专用于传输时钟信号。
- 示例:全局时钟网络。
3. Net 的属性
每个 net
都有一些关键属性,这些属性会影响信号完整性和时序性能:
- 电气属性:
- 负载电容(Capacitance):网络的总电容值。
- 电阻(Resistance):网络的总电阻值。
- 驱动能力(Drive Strength):网络的驱动能力。
- 物理属性:
- 布线层(Routing Layer):网络所在的金属层。
- 长度(Length):网络的总长度。
- 宽度(Width):金属线的宽度。
- 时序属性:
- 延时(Delay):信号在网络上的传输延迟。
- 扇出(Fanout):网络连接的负载数量。
- 其他属性:
- 是否为电源或地(Is Power/Ground):标记该网络是否为电源或地。
- 网络名称(Name):网络的唯一标识符。
4. Net 在工具中的操作
在后端设计工具(如 Synopsys Fusion Compiler)中,net
的操作包括创建、修改、删除和查询:
-
创建 Net:
create_net -name new_net_name
-
修改 Net 属性:
set_attribute -name ROUTE_LAYER -value METAL3 [get_nets net_name]
-
删除 Net:
remove_net [get_nets net_name]
-
查询 Net:
get_nets "pattern"
-
获取与 Net 相关的 Pin:
get_pins -of_objects [get_nets net_name]
get_nets
get_nets
是 Synopsys Fusion Compiler 中的一个重要命令,用于从设计的网表(netlist)中提取一组网络(nets)。它可以用来查询、筛选和操作设计中的信号网络。以下是对该命令的详细解释,包括其语法、选项和用法。
核心功能
-
创建网络集合:
get_nets
命令的主要功能是从当前设计或指定设计中提取满足条件的网络。- 返回值是一个 集合(collection),可以包含零个或多个网络。
-
支持多种筛选方式:
- 通过名称模式、对象连接关系、物理上下文等条件来筛选网络。
- 可以使用过滤器表达式进一步缩小结果范围。
-
嵌套使用:
get_nets
的结果可以直接作为其他命令的输入,也可以赋值给变量以便后续操作。
-
自动链接设计:
- 如果没有找到匹配的对象,并且当前设计未链接(linked),工具会尝试自动链接设计。
-
支持层次化搜索:
- 可以跨越层次结构搜索网络,或者仅返回特定层级的网络。
语法概述
get_nets [-options] patterns | -of_objects objects
-
patterns:
- 匹配网络名称的模式,支持通配符(
*
和?
)或正则表达式。 - 示例:
get_nets "data*"
,get_nets {clk\[0:7\]}
。
- 匹配网络名称的模式,支持通配符(
-
-of_objects:
- 根据指定的对象(如引脚、单元、网络等)提取与其连接的网络。
- 示例:
get_nets -of_objects [get_pins u1/A]
。
关键选项
1. 指定设计范围
-design design
:- 指定要搜索的设计。如果不指定,则默认在当前设计中搜索。
- 示例:
get_nets -design top_module "data*"
2. 层次化搜索
-hierarchical
:- 在当前实例的层次结构中搜索网络。
- 默认情况下,只匹配同一层级的网络名称。如果启用了
-physical_context
,则按物理层次逐级搜索。 - 示例:
get_nets -hierarchical "muxsel"
3. 过滤器
-filter expression
:- 使用表达式对网络进行过滤。
- 示例:
get_nets -filter "CAPACITANCE > 0.1"
4. 正则表达式匹配
-regexp
:- 将模式视为正则表达式而不是简单的通配符。
- 示例:
get_nets -regexp {data_\d+}
5. 精确匹配
-exact
:- 禁用通配符匹配,要求完全匹配网络名称。
- 示例:
get_nets -exact "data_bus"
6. 预期数量检查
-
-expect exact_count
:- 指定期望返回的网络数量。如果实际数量不符,则抛出错误。
- 示例:
get_nets -expect 1 "clk"
-
-expect_at_least minimum_count
:- 指定最少返回的网络数量。如果实际数量少于指定值,则抛出错误。
- 示例:
get_nets -expect_at_least 2 "data*"
7. 物理上下文
-physical_context
:- 仅搜索物理网络(physical nets)。
- 示例:
get_nets -physical_context "power_net"
8. 边界类型
-boundary_type lower | upper | both
:- 指定如何处理边界引脚的网络。需要与
-of_objects
配合使用。 - 允许的值:
lower
:返回层次内部的网络。upper
:返回层次外部的网络。both
:返回层次内外的网络。
- 示例:
get_nets -of_objects [get_pins u1/A] -boundary_type both
- 指定如何处理边界引脚的网络。需要与
9. 分段搜索
-segments
:- 返回网络的所有全局分段(global segments)。
- 示例:
get_nets -segments "clk"
10. 屏蔽网络
-
-include_shielded
:- 包含屏蔽网络(shielded nets)。
- 示例:
get_nets -of_objects [get_shapes shield] -include_shielded
-
-shielded_only
:- 仅返回屏蔽网络。
- 示例:
get_nets -of_objects [get_shapes shield] -shielded_only
常见用例
1. 按名称模式获取网络
get_nets "data*"
- 获取所有以
data
开头的网络。 - 输出示例:
{"data_bus", "data_in", "data_out"}
2. 基于对象获取网络
get_nets -of_objects [get_pins u1/A]
- 获取与引脚
u1/A
连接的网络。 - 输出示例:
{"net1"}
3. 层次化搜索网络
get_nets -hierarchical "muxsel"
- 在层次结构中搜索名为
muxsel
的网络。 - 输出示例:
{"u1/muxsel"}
4. 按属性过滤网络
get_nets -filter "CAPACITANCE > 0.1"
- 获取电容大于 0.1 的网络。
- 输出示例:
{"clk_net", "data_net"}
5. 获取物理网络
get_nets -physical_context "power_net"
- 获取名为
power_net
的物理网络。
6. 获取屏蔽网络
get_nets -of_objects [get_shapes shield] -include_shielded
- 获取与屏蔽形状相关的网络。
注意事项
-
空结果处理:
- 如果没有找到匹配的网络,命令返回空字符串。
- 使用
-quiet
参数可以抑制警告信息。
-
互斥选项:
- 某些选项是互斥的,例如
-regexp
和-exact
不能同时使用。 patterns
和-of_objects
也不能同时使用。
- 某些选项是互斥的,例如
-
特殊字符转义:
- 在使用总线下标模式时,
[]
和()
是 Tcl 的特殊字符,需要转义。例如:get_nets U1/A\[0:7\]
- 在使用总线下标模式时,
-
组合选项:
- 某些选项需要与其他选项配合使用,例如
-boundary_type
必须与-of_objects
配合使用。
- 某些选项需要与其他选项配合使用,例如
总结
get_nets
是一个功能强大的命令,适用于各种网络筛选场景。通过掌握其基本语法、常用选项和实际用例,你可以高效地管理设计中的网络集合,从而优化后端设计流程。如果还有其他问题或需要更深入的解释,请随时告诉我!
在之前的解释中,我们已经详细介绍了 get_nets
命令的基本功能、语法和选项。现在我们将基于您提供的描述和示例进一步深入讲解,帮助您更好地理解该命令的使用场景和高级特性。
核心概念补充
1. 隐式查询与显式查询
-
隐式查询:
- 当直接在命令行运行
get_nets
时,工具会自动显示匹配的网络集合。 - 默认情况下,最多显示 100 个对象。如果需要更多或更少的对象显示数量,可以通过设置以下选项调整:
set_app_options -name shell.common.collection_result_display_limit -value <limit>
- 当直接在命令行运行
-
显式查询:
- 如果需要更灵活的输出(如显示对象类型、属性等),可以将
get_nets
的结果作为参数传递给query_objects
命令。 - 示例:
query_objects [get_nets "data*"]
- 如果需要更灵活的输出(如显示对象类型、属性等),可以将
2. 正则表达式与通配符的区别
-
通配符模式:
- 使用
*
和?
匹配名称。 - 示例:
get_nets "data*"
会匹配所有以data
开头的网络。
- 使用
-
正则表达式模式:
- 使用
-regexp
参数启用正则表达式匹配。 - 示例:
get_nets -regexp {^data_\d+$}
会匹配以data_
开头且后面跟随一个数字的网络。 - 注意:正则表达式默认是“锚定”的,即从名称开头开始匹配。如果需要放宽匹配范围,可以在表达式前后添加
.*
。
- 使用
3. 子脚本模式
-
子脚本模式允许通过索引范围来获取总线网络(bus nets)或扩展名称的网络。
-
总线子脚本模式:
- 格式:
name[begin_index:end_index:step_n]
- 示例:
输出:get_nets {A[0:7:2]}
{"A[0]", "A[2]", "A[4]", "A[6]"}
- 格式:
-
名称扩展子脚本模式:
- 格式:
name(begin_index:end_index:step_n)
- 示例:
输出:get_nets B(0:4:2)C(1:2,5)
{"B0C1", "B0C2", "B0C5", "B2C1", "B2C2", "B2C5", "B4C1", "B4C2", "B4C5"}
- 格式:
4. 层次化搜索
-
普通层次化搜索:
- 使用
-hierarchical
参数时,工具会在当前实例的层次结构中搜索网络。 - 示例:
输出:get_nets * -hierarchical
{topnet u1/net5 u2/net7}
- 使用
-
顶层网络过滤:
- 使用
-top_net_of_hierarchical_group
参数时,仅返回层次化组中的顶层网络。 - 示例:
输出:get_nets * -hierarchical -top_net_of_hierarchical_group
{topnet}
- 使用
-
物理上下文搜索:
- 使用
-physical_context
参数时,工具会搜索物理网络(physical nets),忽略逻辑层次。 - 示例:
输出:get_nets -physical_context
{topnet}
- 使用
5. 边界类型
-
-boundary_type
参数用于控制如何处理层次边界上的网络。 -
lower
:- 返回层次内部的网络。
- 示例:
输出:get_nets -of_objects u2/in -boundary_type lower
{u2/net7}
-
upper
:- 返回层次外部的网络。
- 示例:
输出:get_nets -of_objects u2/in -boundary_type upper
{topnet}
-
both
:- 返回层次内外的所有相关网络。
- 示例:
输出:get_nets -of_objects u2/in -boundary_type both
{u2/net7 topnet}
示例解析
示例 1:总线子脚本模式
get_nets {A[0:1,3:7:2]}
- 这是一个总线子脚本模式的例子。
- 它会匹配索引范围
[0:1]
和[3:7:2]
中的网络。 - 输出:
{"A[0]", "A[1]", "A[3]", "A[5]", "A[7]"}
示例 2:名称扩展子脚本模式
get_nets B(0:4:2)C(1:2,5)
- 这是一个名称扩展子脚本模式的例子。
- 它会生成所有符合
Bx Cy
格式的网络名称,其中x
和y
分别来自指定的索引范围。 - 输出:
{"B0C1", "B0C2", "B0C5", "B2C1", "B2C2", "B2C5", "B4C1", "B4C2", "B4C5"}
示例 3:层次化搜索与顶层网络过滤
get_nets * -hierarchical
- 搜索所有层次中的网络。
- 输出:
{topnet u1/net5 u2/net7}
get_nets * -hierarchical -top_net_of_hierarchical_group
- 仅返回层次化组中的顶层网络。
- 输出:
{topnet}
示例 4:边界类型控制
get_nets -of_objects u2/in -boundary_type lower
- 返回层次内部的网络。
- 输出:
{u2/net7}
get_nets -of_objects u2/in -boundary_type both
- 返回层次内外的所有相关网络。
- 输出:
{u2/net7 topnet}
注意事项
-
转义特殊字符:
- 在使用总线子脚本模式时,
[]
是 Tcl 的特殊字符,需要使用反斜杠\
转义,或者用大括号{}
包裹。 - 示例:
或get_nets A\[0:7\]
get_nets {A[0:7]}
- 在使用总线子脚本模式时,
-
性能优化:
- 在大规模设计中,使用
-filter
参数可以显著减少搜索范围,提高效率。 - 示例:
get_nets -filter "CAPACITANCE > 0.1"
- 在大规模设计中,使用
-
空结果处理:
- 如果没有找到匹配的网络,命令会返回空集合。
- 使用
-quiet
参数可以抑制警告信息。
总结
get_nets
命令是 Synopsys Fusion Compiler 中一个非常强大的工具,能够高效地筛选和操作设计中的网络集合。通过掌握其高级选项(如层次化搜索、边界类型控制、子脚本模式等),您可以更灵活地管理设计中的信号路径,从而优化后端设计流程。