DC
DC综合
1、综合分类
- 行为级综合
- RTL级综合
- 逻辑级综合
准备好源代码,最终完成RTL级综合
2、DC综合
2.1 转换
综合工具将源代码转化为中间网表
2.2 优化
综合工具对中间级网表优化,去掉冗余单元,加入限制条件对电路进行优化。
2.3 映射
将优化后的电路映射到工艺库
3、编写利于综合的HDL代码
具体语法略过
case语句不全,但没有别的条件时,可以用synopsys full_case告诉综合工具避免latch。但不利于验证。
Design ware basic提供基本电路,design ware foundation提供性能较高的电路结构。
lappend link_library $synthetic_library 链接对应库,使DC将*、/等运算直接综合。
4、如何使用DC
4.1 预综合(Pre_synthesis Processes)
4.1.1 启动方式
-
图形界面方式
dc_shell gui_start
-
脚本方式
dc_shell -f script dc_shell -t -f script #tcl脚本
4.2 库文件设置
4.2.1 工艺库(target_library)
综合后的电路网表最终映射到的库
RTL代码先由synnopsys自带的gtech库转为中间格式,然后经过DC映射到工艺库,并且进行优化生成门级网表。这个工艺库是晶圆厂foundary提供的.db或.lib文件,DC在综合时根据工艺库中的单元电路参数来计算路径延迟。
set target_library my_tech.db
4.2.2 链接库(link_library)
设置模块或者单元电路的引用(DC可能用到的库或IP)
设置时注意“”表示DC在引用实例化模块或者单元电路时首先搜索已经调进DCmemory的模块和单元电路,如果不包含“”,就不会使用DCmemory中已有的模块。出现告“unresolved design reference”。
lappend search_path{bob} #链接库默认路径在DC运行目录下,使用这条命令添加bob文件夹作为路径
set link_library "*my_tech.db"
4.2.3 符号库(symbol_library)
定义单元电路显示的schematic的库(把连接关系画出来)
启动图形界面就可看电路实际综合后的样子。符号库后缀.sdb,如果没有设置,DC会使用默认符号库。
set symbol_library
4.2.4 综合库(synthetic_library)
对于扩展的design ware,需要在synthetic_library中设置。比如需要一些特殊的加法器、乘法器,如果不进行设置,DC就会将“*”“+”综合成它默认的加法器乘法器。
set synthetic_library
4.3 启动文件
设置synopsys_dc.setup
DC启动时首先在三个目录下(DC安装目录的默认设置、$Home下一些用户本人的个性化设置和变量、DC启动目录下与实际设计相关的设置)读这个文件,三个文件夹下的setup文件优先级依次增加。
4.4 读入设计文件
tcl模式下读取不同文件格式需要不同命令
read_db example.db
read_verilog example.v
read_vhdl example.vhdl
4.5 施加设计约束(Constraining the design)
4.5.1 时序与面积约束
4.5.1.1 定义面积约束
dc_shell -t > current_design PRGRM_CNT_TOP
dc_shell -t > set_max_area 100
100的单位由foundry规定,三种情况:100个门逻辑、100个晶体管、100平方微米等
4.5.1.2 同步设计的时序特点和目标
- 约束输入到寄存器的路径
- 约束寄存器到寄存器的路径
- 约束寄存器到输出的路径
4.5.1.3 定义时钟
所有时序电路以及组合电路的优化都是以时钟的基准来计算路径延迟
定义时钟源clock source、时钟周期、占空比duty cycle、时钟偏移clock skew和时钟名
dc_shell -t > create_clock - period 10[get_ports CLK] #时钟名CLK,时钟周期10ns
dc_shell -t > set_dont_touch_network[get_clocks CLK] #告诉DC工具不要优化,防止自动根据负载插入buffer
4.5.1.4 约束输入路径N
告诉DC图中FF1+M的延时不和灰色模块一起综合,不然可能会出现无法满足灰色模块的setup time
dc_shell -t > set_input_delay -max 4 -clock CLK[get_ports A]
-max指建立时间
-min指保持时间
4.5.1.5 约束输出路径S
要对后一级触发器留出时间裕量。
对于信号经过灰色模块到达后级电路来说,后级电路看到的时间是T的电路延时和触发器建立时间。
当T和触发器建立时间确定后,被综合模块内部的输出延时就会被约束。
假设时钟周期20ns,外围触发器输入延时5.4ns,那么灰色模块内部只能处理输出路径小于13.6ns的情况。
dc_shell -t > set_output_delay -max 5.4 -clock clk[get_ports A]
4.5.2 环境属性
上述只考虑了面积时序等约束,但实际上待综合模块还需要考虑周边环境变化对物理器件的影响,例如温度变化、电路供电电压变化等,并且面积时序约束没考虑电平翻转时间。实际点评翻转时间由外围电路的驱动能力和负载大小决定。这些种种都归入环境属性约束中考虑。
4.5.2.1 设置输出负载
对于模块输出时序,除了需要知道输出延时外,还需要输出电路所接负载。如果负载过大,会增加电路的transition time,影响时序特性。理想情况下负载为0,电平转换时间也为0.
set_load 5[get_ports OUT1]#负载设为5
set_load [load_of my_lib/and2a0/A][get_ports OUT1]#在out1接my_lib中的and2a0单元的A管脚
set_load [expr [load_of my_lib/and2a0/A]*3] OUT1 #让out1连接三个并行A管脚
4.5.2.2 设置输入驱动
默认情况下DC认为输入驱动能力无限大,电平转换时间为0.
set_driving_cell -lib_cell and2a0\ [get_ports IN1] #将输入端口IN1连接and2a0作为驱动
4.5.2.3 设置工作条件
主要包含温度、电压、工艺等。
foundry提供的工艺库中,各个单元的延时是在标准条件下测得,若工作条件发生改变,电路时序特性也将受到影响。
单元延时跟温度和工艺尺寸成正比,跟电压成反比。综合时候只需要考虑最差情况和最好情况。最差情况用于分析建立时间,最好情况用于分析保持时间。
4.5.2.4 设置连线负载模型
连线的延时通过设置连线负载模型确定。
连线负载模型由foundry提供,可根据连线的扇出,估计电阻电容等寄生参数。
模块内部连线
dc_shell -t > set current_design addtwo
dc_shell -t > set_wire_load_model -name 160KGATES
addtwo为模块名,160KGATES为模型名
默认情况下DC根据综合的模块大小自动选择负载模型,通过report_lib ssc_core_slow可以查看具体怎么选。
模块之间连线
-
围绕模式:子模块负载模型采用上级模块负载模型
set_wire_load_mode_enclosed
-
顶层模式:用顶层模块的负载模型代替
set_wire_load_mode top
-
分段模式:根据穿过的三段模型相加得到
set_wire_load_mode segmented
4.5.2.5 时序和负载预算
约束过程中具体应该约束多少数值,一般由架构工程师完成。
4.5.3时序分析
将电路分解成不同的路径timing path,每条时序路径起点是输入端口或触发器的时钟驶入段,终点是输出端口或触发器的数据输入端。根据终点所在的触发器的时钟分组计算每段路径的延时,包含单元延时和连线延时。将不同路径进一步划分得到一段段时序弧,检查所有路径的延时看是否满足时序要求。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
· 为什么 退出登录 或 修改密码 无法使 token 失效