数字ic后端设计从入门到精通2(含fusion compiler, tcl教学)

上篇回顾

上一篇文章需要讨论了net,pin的基础用法,让我们来看一下高级一点的用法

instance

current_instance

current_instance 是 Synopsys 工具(如 Fusion Compiler 或 Design Compiler)中用于在设计层次结构中导航的关键命令。它允许用户设置当前的工作实例(即设计中的某个子单元或模块),从而使得其他命令可以相对于该实例执行操作。

以下是对 current_instance 命令的详细说明和用法介绍:


1. 基本功能

  • 作用

    • 设置当前工作实例(instance)。
    • 定义命令执行的上下文(context),以便后续命令(如 get_cells, get_nets, report_timing 等)能够针对特定的实例范围运行。
  • current_design 的区别

    • current_design:设置当前的设计(design)并自动将上下文重置到设计的顶层。
    • current_instance:仅设置当前实例,而不改变设计本身。

2. 语法

tcl 复制代码
current_instance [instance]
  • 参数
    • instance
      • 指定要切换到的目标实例路径。
      • 如果未指定 instance 参数,则返回到当前设计的顶层(top-level)。
      • 支持多种格式的路径表达方式(见下文)。

3. 参数详解

(1) 不指定参数
  • 效果

    • 返回到当前设计的顶层(top-level)。
  • 示例

    tcl 复制代码
    current_instance
    • 输出可能为:

      复制代码
      Current instance is the top-level of block 'TOP.design'.
(2) 使用 "."
  • 效果

    • 保持当前实例不变。
  • 示例

    tcl 复制代码
    current_instance .
    • 当前实例不会发生变化。
(3) 使用 ".."
  • 效果

    • 将上下文向上移动一级(类似于 UNIX 中的 cd ..)。
  • 示例

    tcl 复制代码
    current_instance ..
    • 如果当前实例是 TOP/U1/U2,则切换到 TOP/U1
(4) 使用具体实例名称
  • 效果

    • 切换到指定的子单元实例。
  • 示例

    tcl 复制代码
    current_instance U1
    • 如果当前设计是 TOP,则切换到 TOP/U1
(5) 多级路径
  • 效果

    • 可以通过使用斜杠 / 遍历多级层次结构。
  • 示例

    tcl 复制代码
    current_instance U1/U2
    • 如果当前设计是 TOP,则切换到 TOP/U1/U2
(6) 使用绝对路径
  • 效果

    • 路径以 / 开头时,会同时设置当前设计和实例。
  • 示例

    tcl 复制代码
    current_instance /TOP/U1
    • 将当前设计设置为 TOP,并将实例切换到 TOP/U1
(7) 使用相对路径
  • 效果

    • 结合 ".." 和具体实例名称,可以在当前上下文中灵活导航。
  • 示例

    tcl 复制代码
    current_instance "../../U3"
    • 如果当前实例是 TOP/U1/U2,则切换到 TOP/U3

4. 示例场景

(1) 查看当前实例
tcl 复制代码
current_instance
  • 输出:

    复制代码
    Current instance is the top-level of block 'TOP.design'.
(2) 切换到子单元
tcl 复制代码
current_instance U1
  • 输出:

    复制代码
    U1
(3) 返回到上一级
tcl 复制代码
current_instance ..
  • 输出:

    复制代码
    Current instance is the top-level of block 'TOP.design'.
(4) 遍历多级层次
tcl 复制代码
current_instance U1/U2
  • 输出:

    复制代码
    U1/U2
(5) 使用绝对路径
tcl 复制代码
current_instance /TOP/U1
  • 输出:

    复制代码
    U1
(6) 返回到顶层
tcl 复制代码
current_instance /
  • 输出:

    复制代码
    Current instance is the top-level of block 'TOP.design'.
(7) 查询所有实例

结合 all_instances 查询当前层级的所有实例:

tcl 复制代码
query_objects [all_instances]
  • 输出:

    复制代码
    {"U1", "U2", "U3", "U4"}

5. 注意事项

  1. 实例路径的正确性

    • 确保指定的实例路径存在。如果路径错误,工具会报错:

      复制代码
      Error: Nothing matched for instance (SEL-005)
  2. 设计加载状态

    • 确保设计已正确加载(通过 linkreport_design 检查)。
  3. 区分大小写

    • 实例名称通常是区分大小写的,请确保拼写正确。
  4. 多线程环境

    • 在多线程环境中,不同线程可能会有不同的 current_instance 上下文,需注意隔离。

6. 总结

current_instance 是一个强大的命令,用于在设计层次结构中导航。以下是常用的用法总结:

  • 返回到顶层:

    tcl 复制代码
    current_instance
  • 切换到子单元:

    tcl 复制代码
    current_instance U1
  • 返回到上一级:

    tcl 复制代码
    current_instance ..
  • 遍历多级层次:

    tcl 复制代码
    current_instance U1/U2
  • 使用绝对路径:

    tcl 复制代码
    current_instance /TOP/U1

redirect

要在 Synopsys 工具(如 Fusion Compiler 或 Design Compiler)中将某个命令的输出结果保存到 .txt 文件中,可以使用 redirect 命令。以下是完整的命令和步骤。


完整命令

假设你要对 get_nets 命令的输出结果进行重定向,并保存到 nets_output.txt 文件中:

tcl 复制代码
redirect /home/nets_output.txt {get_nets}

解释

  1. redirect

    • 这是 Synopsys 提供的一个专门用于重定向输出的命令。
    • 它会将指定命令的输出保存到文件中。
  2. /home/nets_output.txt

    • 输出文件的路径和名称。

    • 如果文件已存在,默认会被覆盖。

    • 如果目录不存在,请先创建它:

      bash 复制代码
      mkdir -p /home/result
  3. {get_nets}

    • 要执行的命令及其输出将被重定向。
    • {} 用于包裹命令,确保复杂命令能够正确解析。

追加模式(可选)

如果你希望将输出追加到现有文件中,而不是覆盖文件内容,可以使用 -append 选项:

tcl 复制代码
redirect -append /home/result/nets_output.txt {get_nets}

验证输出

  1. 执行上述命令后,检查文件是否生成:

    bash 复制代码
    ls /home/result/nets_output.txt
  2. 查看文件内容:

    bash 复制代码
    cat /home/result/nets_output.txt

注意事项

  1. 目录权限

    • 确保 /home/result 目录存在,并且当前用户对该目录有写权限。

    • 如果没有权限,可以尝试以下命令更改权限:

      bash 复制代码
      chmod 755 /home/result
  2. 路径格式

    • 使用绝对路径(如 /home/result/nets_output.txt)以避免路径问题。
    • 如果使用相对路径,请确保当前工作目录

reference

Reference(引用)

Reference 通常指的是对库单元或模块的引用。它代表了一个特定类型的单元或模块定义,该定义存在于库中。例如,在标准单元库中,AND2X1 可能是一个逻辑门的定义,这个定义可以被多次引用以创建多个实例。

  • 特点

    • 唯一性:每个参考(Reference)通常是唯一的,表示一种特定类型的设计单元。
    • 复用性:一个参考可以在设计中被多次使用,每次使用都会创建一个新的实例。
    • 定义性:它包含了关于单元的功能、时序模型等信息,但并不包含具体的位置或连接信息。
  • 示例

    如果你有一个名为 AND2X1 的标准单元库中的逻辑门,那么 AND2X1 就是这个逻辑门的 reference。无论你在设计中放置了多少个这样的逻辑门,它们都引用同一个 AND2X1 reference。

Instance(实例)

Instance 是基于某个 reference 创建的具体对象。它是 reference 在设计中的具体实现,具有明确的位置、连接和其他物理属性。换句话说,instance 是 reference 在设计中的具体化。

  • 特点

    • 多样性:同一 reference 可以有多个 instance,每个 instance 都可能有不同的位置、名称、参数设置等。
    • 具体性:instance 包含了具体的物理布局信息,如坐标位置、连线关系等。
    • 命名:每个 instance 都有一个唯一的名称,用于区分设计中的其他 instances。
  • 示例

    假设你在设计中放置了三个 AND2X1 的逻辑门,这三个逻辑门将分别成为独立的 instances,比如 u1, u2, u3。尽管它们都是基于同一个 AND2X1 reference 创建的,但在设计中它们是独立的对象,可能位于不同的位置,并且与不同的信号相连。

总结

  • Reference:是对库中某种类型单元的定义或模板,它定义了单元的功能、特性等信息。
  • Instance:是基于 reference 创建的具体对象,具有明确的位置、连接等物理属性。

在实际操作中,当你查看设计时,report_reference 命令会显示所有使用的 references(即设计中引用的不同单元),而 current_instance 则允许你在设计的层次结构中导航,聚焦于特定的 instance 上进行更详细的操作或检查。理解这两者之间的关系有助于更好地管理和优化你的设计。

如何检查并确认设计是否已正确加载所有部分

1. 使用 report_reference 查找未解析的引用
tcl 复制代码
report_reference
  • 这个命令会列出所有单元及其状态。查找是否存在任何标记为 unresolved 的单元。
2. 正确使用 check_design

为了确保全面检查设计,可以尝试如下命令:

tcl 复制代码
check_design -checks {all}

或者更具体地:

tcl 复制代码
check_design -checks {unresolved_references unconnected_ports}

这将帮助识别设计中存在的潜在问题,如未解析的引用或未连接的端口。

3. 验证 current_instance 的路径

既然 link 已经确认设计已加载,接下来需要确保你尝试切换到的实例路径是正确的。基于你之前的描述,如果 reuse_wrapper_dummy_tile_t 存在于设计中,你应该使用其完整路径进行切换:

tcl 复制代码
current_instance reuse_wrapper/reuse_wrapper_dummy_tile_t

确保路径是从顶层设计开始的完整路径。

  1. link 命令的输出

    • 输出表明设计已经链接("Block 'TileBuilderIntFX_Apr-20-2025_37.nlib:reuse_wrapper.design' is already linked."),这意味着 link 命令确认设计已经被正确加载。
    • 但是,这并不直接说明设计中的所有实例都能被正确解析。它仅表示库和设计之间的基本连接没有问题。
  2. report_reference 的输出

    • 你提到的输出实际上是库中不同单元的信息,而不是 report_reference 命令的结果。这些信息显示了当前设计引用的不同单元及其面积等属性。
    • 要检查未解析的引用,应该使用 report_reference 命令,并关注是否有任何标记为 unresolved 的条目。
  3. check_design 命令的错误

    • 错误提示 -checks 参数是必需的。这是因为 check_design 需要指定具体要执行的检查类型。例如,你可以通过以下方式运行 check_design 来检查特定方面的问题:

      tcl 复制代码
      check_design -checks {all}
    • 或者针对特定类型的检查,如未连接端口、未解析的引用等:

      tcl 复制代码
      check_design -checks {unresolved_references unconnected_ports}

pitch

在 Fusion Compiler 的布局布线领域,pitch 是一个非常重要的参数,它用于定义设计元素之间的间距。这个概念贯穿于多个方面,包括标准单元的排列、电源网格的设计、以及信号线的布线等。理解 pitch 的含义及其在不同场景下的应用对于优化设计性能和确保物理实现的成功至关重要。

Pitch 的基本定义

  • Pitch:指的是两个相邻结构(例如金属线条、晶体管栅极、标准单元或电源条带)中心点之间的距离。它可以是水平方向上的间距(x_pitch),也可以是垂直方向上的间距(y_pitch)。Pitch 决定了这些结构在物理层面上的密度和分布方式。

在布局布线中的具体应用

1. 标准单元布局
  • 在标准单元布局中,pitch 可以指一行或一列标准单元之间的距离。这直接影响到芯片的面积利用率和布线复杂度。
  • 通过调整 pitch,设计师可以优化单元之间的间距,确保有足够的空间进行信号线的布线,同时尽量减少芯片的整体面积。
2. 电源网格设计
  • 在电源网格设计中,pitch 指的是电源/地线之间的间距。合理的电源网格 pitch 对于保证电源分配网络(PDN)的质量至关重要。
  • 例如,在创建电源环 (create_pg_ring) 或电源网 (create_pg_mesh) 时,pitch 参数决定了电源条带或过孔之间的距离,从而影响电源传输效率和电压降(IR Drop)。
3. 自动布线
  • 在自动布线过程中,pitch 可能涉及到设定导线之间的最小间隔,以满足制造工艺的要求,并防止短路或其他电气问题。
  • 调整 pitch 值可以帮助工具更好地处理拥挤区域,提高布线成功率。

总结

在 Fusion Compiler 的布局布线流程中,pitch 参数主要用于控制设计元素之间的间距,无论是标准单元、电源网格还是信号线。合理设置 pitch 值可以帮助优化设计的性能指标,如面积利用率、电源完整性、布线成功率等。理解并正确使用 pitch 对于实现高效且可靠的物理设计至关重要。

相关推荐
摇滚侠1 小时前
Spring Boot3零基础教程,云服务停机不收费,笔记71
java·spring boot·笔记
j七七1 小时前
5分钟搭微信自动回复机器人5分钟搭微信自动回复机器人
运维·服务器·开发语言·前端·python·微信
豐儀麟阁贵1 小时前
5.5类的主方法
java·开发语言
不光头强1 小时前
maven进阶
java·maven
大锦终1 小时前
【Linux】HTTP协议
linux·运维·服务器·网络·http
搬砖的小码农_Sky1 小时前
远程桌面:Ubuntu Desktop操作系统上如何安装Rustdesk远程桌面客户端(离线安装包)
linux·ubuntu·远程工作
智海观潮2 小时前
聊聊Spark的分区
java·大数据·spark
rengang662 小时前
020-Spring AI Alibaba DashScope Image 功能完整案例
java·人工智能·spring·spring ai·ai应用编程
ragnwang2 小时前
解决 Ubuntu 安装 NVIDIA 固件时的包冲突问题
linux·运维·ubuntu
-Initiation2 小时前
数据库的安全与保护(下)
java·数据库·oracle