什么是物理综合 physical synthesis

物理综合就是将RTL综合为coarse-placement的网表;这需要让DC工作在TOPO mode' 并使用compile_ultra 命令;

需要一个布局文件,一般是ICC生成的;(icc ii design planning);

DC NTX topological mode 是支持物理综合的

DC NTX in topological  mode 使用virtual routing 去估计net的长度; virtual routing 使用 Manhattan distance估计两个pin之间的线网的长度;

RC参数的计算也是基于net的长度而不是fanout;

Day1: objectives

  1. 加载RTL设计和逻辑库

  2. 加载物理库和technology data 包括: physical 或 layout library (NDMdirectories) technology routing layer definition file (tf file) RC modeling files (TLUplus & map files)

  3. 加载布局的信息; TCL的物理约束或者来自ICCII的DEF文件

所以整个NTX topo mode flow的输入包括: RTL design .v文件,design constraints 设计约束文件,db库文件,物理库文件 ,floorplan的DEF文件

指定technology的逻辑库

DCNTX flow 需要指定technology的逻辑库,才能完成综合;

  1. 标准单元库

  2. 宏单元和IP库

每个逻辑库对应单一的PVT属性或者工作条件;

标准单元的功能和属性信息

通过.lib中对标准单元的表述我们可以获得以下信息:

cell的name ,面积,引脚信息,design rule constraints(每个引脚的 function max_capacitance mian_capacitance)

附加的需求: DC NTX generic logic library(DC的通用逻辑库)

这个generic logic library 是由DCNTX提供的,在仅进行功能的综合时,可以用他来描述RTL结构.

通用的逻辑库用来在读入RTL文件加载入DCNTXshell转换成未布局的gtech ddc 格式

target library:用来选择指定工艺的单元

用来生成,technology-specific的门级网表;

DC NTX 会选择指定工艺库中最小的满足DRC timing和逻辑功能的单元.

在综合之前,需要指定实际的由芯片的供应商或者库组提供的标准单元库文件

set_app_var target_library libs/20nm_wc.db

使用以下命令可以查看那些从默认设置中修改的所有application variable:

get_app_var -list -only_changed_vars *

link_library:用来解析实例化的reference

用来link设计,解析RTL设计中或者门级网表中实例化的参考;

在link设计之前指定标准单元和IP 逻辑库的名字

reference(参考),是那些门,逻辑块,子设计,在设计中的实例化

search path:用来指定搜索路径

search_path = “. <install_dir>/libraries/syn

<install_dir>/dw/sim_var

"

默认的search_path包括需要的通用库的路径;

增加search_path到默认路径,而不是over_write(覆盖)

set_app_var search_path "$search_path\

mapped

libs

cons"

application variables是全局的变量而非私有的

在相同的工具环境下会应用到所有的设计中;

设置也不会跟随设计而保存;当工具的会话结束时(tool session ends) 这些application variable会恢复到默认状态;

所以application variables需要在工具启动时重新设置;

处理analyze命令产生的中间文件(intermediate files)

会产生 .syn .pvl .mr文件

这些文件被保存在由 application variable"WORK”指定的路径中,默认是CWD,这会使CWD文件夹很杂乱,使用以下命令可以获得更整洁的CWD;

CWD : current design directory

define_design_lib WORK -path ./work

analyze -f verilog TOP.v

你可以指定独立的libraries name 在analyze的时候;

define_design_lib MID -path ./mid

define_design_lib BOT -path ./bot

analyze -f  sverilog -library BOT bot.sv

analyze -f  sverilog -library MID mid.sv

物理综合的需求

物理综合会将输入的RTL模型生成一个门级网表附带标准单元的粗布局

topo mode 会在综合时生成粗布局布线估计;但这需要物理单元库使用NDM(new data model)格式拥有technology data;并且需要布局的信息;

NDMcell library 或者叫做 CLIBs 包含frame和timing view frame view包含物理拓扑信息,timing view 包含所有的来自原始db库的信息,包含逻辑定义,时序,功耗和其他属性信息;

物理综合所需要的物理信息

来自ASIC代工厂或者library group的 物理单元库,(NDM format),包括标准单元的frame view 和 IP核和宏单元的frame view;工艺信息(technology data)包括工艺文件(technology file) TLUPlus文件(RC寄生参数的信息)  layer mapping files()

一个"design library”设计库用来存储工艺文件内容和指向物理单元库;

什么是物理单元库

一个标准单元是用指定工艺的基础逻辑门提前设计好版图的

每个标准单元通常都有相同标准的高度

一个物理单元库包含用frame view描述的标准单元的集合,并且在NDM格式下是可用的;

DC NTX和ICCII使用相同的NDMformat,但是ICC使用的物理单元库的格式叫milkways

technology file (.tf文件)

工艺文件,对于每一个technology来说是唯一的

定义了所有的工艺参数;这个文件主要定义的一些 layer的信息,金属,mos管的一些参数,DRCs等等;

布线的方向 routing direction

tech file 并不会定义金属层的优先布局方向;这需要全局的基于布线的拥塞分析;

指定routing direction

set_preferred_routing_direction -layers {M1 M3 M5 M7} -direction horizontal   set_preferred_routing_direction -layers {M2 M4 M5 M8 MRDL} -direction vertical

必须在读入了RTL代码或者DDC网表之后 才能设置 routing_direction 否则会报错;当前设计没有定义,无法找到object M1

TLUplus file

包含RC的查找表

layer mapping file

是匹配technology file和TLUPlus file的信息;

物理综合需要一个Design library;

更像一个容器,包含设计所需要的工艺文件信息,并指向物理单元库;

第一次综合,创建加载设计库 design library

//create the design library and set tluplus files set ndm_reference_library .../CLIB/saed32_lvt.ndm   set ndm_design_library  ./MY_design.dlib   if{! [file isdirectory $ndm_design_library]} {   create_lib -reference_library $ndm_reference_library  \     -technology ./tech/saed32_1p9m.tf $ndm_design_library  check_library     //检查逻辑库和物理库的一致性 consistency   }else{    open_lib $ndm_design_library   }   set_tlu_plus_files -max_tluplus  ./tech/***.tluplus  \   -tech2itf_map  ./tech/ ***.map

关于综合后的网表和floorplan先有鸡还是先有蛋;

解决方法:

  1. two-Phase SPG synthesis flow; 双向的SPG综合流程

pre_floorplan使用的是默认的布局约束

如果没有指定约束的话;

它会使用: 1. 方形的core的放置区域

  1. 核心的大小基于60%的利用率

  2. 将宏单元和标准单元一起摆放

  3. 顶层端口的位置是任意摆放的

那如何修改pre_floorplan的默认布局约束呢

默认的core size and shape

set_utilization 0.6 标准单元利用率 60%

set_aspect_ratio 1 正方形

定义精确的矩形/直线 core或die的面积

先将默认的utilization和aspect ratio改掉

标准单元和宏单元放在 core area

pads和 I/Opins 放在die area

默认 DCNTX 声明的core area和die diearea 是一样大的;

除非用 crate_site_row被用来定义 core area 的边界;

create_die_area -coordinate {{0 0}{600 400}}

用它来定义core area的面积边界

example : 物理约束文件

post_floorplan synthesis 布局后综合,加载floorplan

在经过ICCII的设计布局后,布局的信息通过 write_floorplan 输出为 DRF文件和floorplan的tcl文件

在DCNTX中加载ICCII的floorplan

create_net -power “VDD VDDL"

create_net -ground VSS

read_floorplan floorplan_dc/floorplan.tcly

读取tcl文件就会将DEF文件读入?

时序约束

输出capacitive laod的影响

输出端口的电容负载会影响transition time,因此会影响到cell输出到outputdriver的delay,

DCNXT默认outpu的capa load为0;所以给output capa load 一个估计(为capa load 建模)是十分必要的;

所以设置负载的方式有两个:

  1. 直接给输出端口 赋 capa的值

set_load -max [expr {30.0/1000}] [get_ports B]

  1. 为输出端口指定具体的标准单元,利用laod_of 计算此标准单元的capa

set_load -max [load_of my_lib/AN2/A] [get_ports B]

set_laod -max [expr {[laod_of my_lib/AN@2/A] * 3}] [get_ports B]

输入Transiton time的影响

和输出的capa 为一对 ,同样会影响 cell delay of the input gate,同样DC在默认情况下, input的transitiontime 也为0;

同样有两种方式,like output_load :来指定input_transition:

  1. set_input_transition -max 0.12 [get_ports A]

  2. set_driver_cell -max -lib_cell OR3B[get_ports A] 对于这种一输出的门来说,不用指定pin

  3. set_driver_cell -max -lib_cell FD1 -pin Qn [get_ports A]

如果在综合之前,你不知道input_driver 和output_load呢

这就需要 load budget;

load budget assumptions 负载预算假设;

应用一个弱驱动,在输入引脚(作为保护) :inv1a1

应用一个合理情况下最大的负载;

_

_(待补充)

负载预算脚本

reset_design

source timing_budget.tcl

set all_in_exp_clk ...

set_driver_cell -max -no_design_rule -lib_cell inv1a1 $all_in_exp_clk

set max_capacitance [expr {[load_of ssc_core_slow/and2a1/A]* 10 }] &all_in_exp_clk

set_load -max [expr {[load_of ssc_core_slow/and2a1/A] * 3 }]  [all_outputs]

其中set_max_capacitance是设计规则的约束 DRC 限制一个端口扇出的capacitance,默认情况下,DRCs 比时序面积约束又会更高的优先级;所以不要过度约束用户定义的DRCs 是十分重要的;

DC NXT Ultral synthesis tech DC的极端综合科技

一个最优的综合结果需要:

  1. 高质量的RTL代码 适合综合的

  2. 完整精确的约束

  3. 适用所有DC ultra的优化选项

  4. 利用DCNXT 物理指向的有点;

简化综合流程,对大的设计最好使用 top-down的综合

默认的优化选项of compile ultra

1, 三个层次上的优化

architecture

logic level

gate level

什么是DesignWare library 设计容器库

soft IP和datapath 元件的集合,这里的IP主要是算术运算符的小IP

当输入输出的宽度超过4bit的话,会封装成hierarchy

单算术运算的优化

DW库会使用数据路径生成器去建立不同算术运算符的运算结构

这些不同的结构使得compile_ultra可以选择执行最好的结构应用到设计中;

一旦选择了某一结构的运算符,便会针对目标工艺库进行优化;

数据路径的优化,CSA transformation

CSA: carry save adder,其实指的是carry save adder tree; 超前进位加法器;

超前进位加法器在大部分情况下,相较于传统的加法器,是小而快的;

关键路径的二次综合;re_synthesis

在compile_ultra下国建路径的二次综合会在需要的时候自动执行;

CPR (critical path re-synthesis)在compile指令下也可以执行,加option -map_effort high

当门级不符合时序,或存在违例的关键路径,会返回logic_level进行忧化;然后再次mapping 网表;这样循环往复;

负载划分和组合逻辑的复制

会减少critical_path的延迟,得到更快的电路,但是面积会更大;

这个选项是常开的,没有option可以将其关闭;

库的分析 library analysis (ALIB)

会利用库中的单元,创建一个缓存区,存储一些常用复杂布尔运算逻辑的实现

会得到的更好的面积优化的结果;

ALIB 对于每一个工艺库都会生成一次,可以在下次使用此库时继续使用,也可被别的用户使用;

当ALIB不存在时候,使用alib_analyze_libs命令,可以人为生成ALIB,一般在第一次执行compile_ultra命令时,会自动生成,使用alib_library_analysis_path选项,指定ALIB生成的文件路径;

子模块pins的保持

默认综合必须保持子模块在层次上pins的定义;

旨在优化逻辑上冗余,可以被合并或者剔除的逻辑门;

自动解除组合 auto_ungroup 是默认开启的;

它会自动将poorly  partition(congestion 比较大)的层次解组,所谓的poorly partition:如果他的数据输入,并不是直接与寄存器输出相连,或者所有的输出是不被储存的;换句话说:一个好的分割(well partition),的子设计没有用 没有时钟的组合逻辑或者寄存器输入作为层次便捷的划分;

可以在compile_ultra 后加option 解除自动的ungroup;

compile_ultra -no_autoungroup;

也可以指定不能被ungroup的design或者cell;

自动的ungroup允许组合和时序偶记电路的优化;,但是这会可能影响形式验证

在综合期间,工具会自动生成default.svf文件,这个文件记录了设计中的边界优化,寄存器复制和ungroup;可以被formality 做形式验证时读入;

set_svf <My_svf.svf> 命令可以自定义svf文件的名字,此命令要在读入RTL设计之前执行;

DW库hierarchy的自动ungroup;

auto_ungroup 也会自动解除DW库的hierarchy结构;可以单独控制不对DW库做ungroup;

set_app_var compile_ultra_ungroup_dw false

boundary optimization 边界优化 默认开启

在未开启ungroup的时候,compile_ultra 还会利用boundary optimization在保持当前hierarchy结构的前提下,对sub_design的内部边界逻辑进行优化;

当然边界优化也是可控的,通过设置app_var 可以指定design不被边界优化,+option,关闭compile_ultra的自动boundary optimization;

DesignPartitioning 设计划分;

将涉及划分成子设计或者块(block) 对于大型的设计来说是十分必要的,driven by following:

  1. 划分单独的功能区

  2. 实现可行的规模和复杂性

  3. 在团队工作中管理项目

  4. 设计的复用;

设计的划分准则 for DCNXT

在可用的内存资源和可接受的运行时间的允许下尽可能大的划分block;

划分sub_design尽可能用寄存器作为输出;

考虑层次化布局的需要;

自动的 shift_register 识别

compile_ultra 在-scan的option下 会自动将电路的移位寄存器进行识别,并直将第一个寄存器替换为扫描链用的寄存器;

默认是自动打开的,可以通过设置appvar将其关闭;

adaptive retiming(移动寄存器的位置)

通过移动寄存器,去减少关键路径的违例;(WNS) worst negative slack; 特别是对于pipeline结构的逻辑电路来说;

Adaptive retiming的基本原则

Adaptive retiming 通过移动,分割,合并寄存器来实现WNS的减少;

end_to_end的功能并不会改变;

如果综合后的网表文件中存在 R_##的寄存器 就说明此设计被retiming了

可以指定特定的cell 和设计不被retiming:set_dont_retime <cell name or designs> true

时序优先的综合(High_Effort timing optimization)

默认情况下,max_transition max_fanout max_capacitance 这些DRCs拥有更高的优先级,相较于timing来说;如果智能优化解决DRC的违例和时序的违例其中的一个,那么DRC的违例会被解决;

但是有是有对于综合来说,fix setup timing要比DRC违例要更重要;

所以可以使用以下命令: set_cost_priority -delay

在许多工艺库中,那些不伤害delay的情况下没有办法被修复的重大的DRC的违例,像:输入端口存在大量的外部负载,或者在一端标记dont_touch的逻辑,将max_delay的优先级放在DRC之前,允许这些DRC的违例在不伤害delay的情况下去解决;

比如 DCNXT 可能会在另外一个模块里面重新设置驱动的大小;

当综合一个小的逻辑块的时候:比如从一个大设计中摘取出的一小部分电路区域;很有可能在这个块的边界其over_constraints 比较高,在他重组进大的设计之前,最好将DRC的fixing放在次要的位置;(postponed)

时钟网络,默认DRC -disabling;

默认情况下:DRC的fixing对于那些直接与寄存器的时钟引脚相连的时钟网络来说是关闭的;

时钟网络从clockpin 被逻辑分离出来的不是DRC无效的,可能会添加buffer 使其满足DRC;

当然有办法将所有的时钟网络都是DRC检查无效的;

set_auto_disable_drc_nets -on_clock_network true

这里有好几种方式可以将时钟网络的DRC检查关闭:

除了上面的哪种方法之外,做常用的还有:

set_dont_touch_network [get_ports clk]

set_ideal_network [get_ports clk]

默认的路径分组(path group)

在综合期间每一个时序路径,都会依照路径相关联的时钟放在一个路径组中;

DC NXT会依次优化每一个路径组;每一个路径组中的关键路径;

使用report_path_group 可以报告当前的设计中定义的路径分组;

Problem: 忽略sub-critical path

默认情况下,优化停止的条件是:

  1. 这个路径组中的所有的路径都满足时序要求

  2. 或者 critical_path没有办法进一步被优化,

在默认分组的情况下很容易产生的问题就是;

比critical_path稍微好一点,但也是违例的路径是不会被优化的;

however: 如果sub_critical_path和critical_path是互相缠绕的,也就是说他们有共享的逻辑电路:很有可能通过提升critical_pathd的timing,就可以解决sub_critical_path的timing问题;

Problem:忽略Reg-to-reg path

solution:用户定义的路径组

用户定义的路径组允许在优化时更多的控制;

每一个路径组都是独立优化的;

一组中最坏的违例不会阻止另一组的违例优化;

创建用户定义的path group

group_path -name INPUTS -from [all_inputs]

group_path -name OUTPUTS -to [all_outputs]

group_path -name COMBO -from [all_inputs] -to [all_outputs]

打开 Near-critical Path的优化

group_path -name clk -critical_rang 0.2

0.2 这个range 不能超过时钟周期的10%

path_group的优先级 -weight

report_path_group

TNS-Driven的placemnet

set_app_var palcer_tns_driven true

compile_ultra

reduce large datdapath delay

减少大型的数据路径的delay;

尝试将datapath中改为流水线结构; 用面积换delay;

一是在RTL代码中自己去插寄存器;

直接将比较长的公式,拆解成几步去完成;

此时时钟的频率被运行最慢的流水线级所限制;

二是工具帮你去插pipeline; register retiming

在综合之前设置application variable: set_optimize_register true -design Pipeline

在执行 compile_ultra

register retiming和adaptive retiming是不太相同的,但可以交替使用;

register retiming 的目的是提升纯流水线结构设计的时序和面积

而adaptive retiming目标是减少非pipeline设计的WNS

所以两个优化是可以同时执行的,

所以可以将寄存器(几级流水线,就插几级寄存器)放在要优化的datapath的最前面或者最后见面,用register retiming自己去规划将流水线插在哪.

它会使每一级流水线的所用的时间都是差不多的;

DC NXT TOPO flow (1)SPG flow 基础相关推荐

  1. 深度学习编译器Data Flow和Control Flow

    深度学习编译器Data Flow和Control Flow 本文介绍了一下深度学习框架的Data Flow和Control Flow,基于TensorFlow解释了TensorFlow是如何在静态图中 ...

  2. 【论文阅读】【综述】从Optical Flow到Scene Flow

    文章目录 Optical Flow FlowNet(2015ICCV) FlowNet2.0(2017CVPR) PWCNet(2018CVPR) MaskFlowNet(2020CVPR) Sene ...

  3. [论文简述+翻译]Just Go with the Flow: Self-Supervised Scene Flow Estimation(CVPR 2020)

    论文简述 第一作者:Himangi Mittal 发表年份:2020 发表期刊:IEEE Conference on Computer Vision and Pattern Recognition(C ...

  4. Git的使用——Git 常用命令总结、Git的使用、Git 的分支、远程仓库的使用、IDEA 中使用Git、Git 工作流(Git Flow、Github Flow、GitLab Flow)

    Git的使用--Git 常用命令总结.Git的使用.Git 的分支.远程仓库的使用.IDEA 中使用Git 一.Git 常用命令总结 为了方便后续查找命令,故先把总结放前面,教程放后面 1.git 基 ...

  5. 一文弄懂 Gitflow、Github flow、Gitlab flow 的工作流

    Git 作为一个源码管理系统,不可避免涉及到多人协作. 协作必须有一个规范的工作流程,让大家有效地合作,使得项目井井有条地发展下去."工作流程"在英语里,叫做"workf ...

  6. 使用Spring Web Flow—Spring Web Flow的配置

    Spring中配置Web Flow Spring Web Flow 是 Spring 的一个子项目,其最主要的目的是解决跨越多个请求的.用户与服务器之间的.有状态交互问题,比较适合任何比较复杂的.有状 ...

  7. Spring Web Flow —— 第一个Flow - 010

    在学习每一门新语言时,第一个程序往往是Hello World.这里我们写一个非常简单的flow,使用常用标签,在深入讲解之前有一个感官上的认识 需求说明 假设有如下简单流程:要求程序启动,显式输入界面 ...

  8. 【Markdown】Markdown 中的Flow flowchart.js 的基础教程

    文章目录 基本格式 操作块 详细说明有哪些可以用的模块 (很容易理解,都是英文直译) 判断和位置控制 (所有符号都用半角:就是在英文状态下输入) 流程控制 基本格式 ···mermaid //前面是三 ...

  9. 【Git】GitHub flow笔记 | GitHub flow和Git flow的区别

    GitHub flow 特点 轻量级 分支作为基础 创建分支 基于master 命名是基于功能描述,让团队成员看到你的分支的作用 提交 清晰的说明提交消息,方便查看和回滚 使用Pull Request ...

最新文章

  1. 6.Mybatis中的动态Sql和Sql片段(Mybatis的一个核心)
  2. Java8之Consumer、Supplier、Predicate和Function攻略
  3. Eclipse导入项目常见问题----服务器版本问题02
  4. 【IOS】集成zxing(二维码扫描)
  5. 吴恩达深度学习 —— 4.6 前向传播和反向传播
  6. php持久对象,php-在理论中具有两个外来身份的持久对象
  7. 【BZOJ2758】Blinker的噩梦,扫描线+splay+链剖
  8. [转]对企业管理和团队的理解
  9. python 科学计算思维导图
  10. 上班时间应该包含交通时间
  11. Sumatra PDF——好用快捷工具介绍及使用
  12. java程序员面试自身优缺点,详细说明
  13. E2-AEN: End-to-End Incremental Learning with Adaptively Expandable Network
  14. MyBioSource p53 肿瘤抑制蛋白 (TP53),多克隆抗体
  15. 一文搞懂HTTP协议(带图文)
  16. 定义一个接口ITest,接口中有3个抽象方法如下。
  17. Python-hrvanalysis库 挖掘心电信号特征 方法总结
  18. 51单片机之闹钟制作
  19. 经验分享——关于大学生科研那些事
  20. 分布式事务解决方案全解析

热门文章

  1. 深度学习中的算法学习与记忆,利用故事联想帮助大家记忆,每个人都会
  2. USACO2013 island travels
  3. 手机上app测试总结
  4. 计算机网络杨庚第一章答案,《计算机通信与网络》习题答案
  5. 机器学习之LSI:文本主题模型之潜在语义分析(LSI)
  6. 计算机ppt2007考试试题,全国计算机等级考试二级officeppt演示文稿题目
  7. android 语言的设置与获取
  8. Gephi简易学习[一]———— Gephi安装,并了解Gephi
  9. C语言经典面试笔试题
  10. 攻击微软、三星等大型企业的黑客组织LAPSUS$成员被逮捕