《综合与Design_Compiler》学习笔记——第一章综合综述 第二章verilog语言结构到门级的映射 第三章 使用DC进行综合

这篇具有很好参考价值的文章主要介绍了《综合与Design_Compiler》学习笔记——第一章综合综述 第二章verilog语言结构到门级的映射 第三章 使用DC进行综合。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


前言

2023.6.25
2023.6.27 和之前学的芯动力mooc中很多内容相似,这篇整理的逻辑更好些


一、综合综述

1、综合

将RTL代码转换到基于工艺库的门级网表。一般分为如下三个步骤。

《综合与Design_Compiler》学习笔记——第一章综合综述 第二章verilog语言结构到门级的映射 第三章 使用DC进行综合,IC后端相关,学习,笔记,DC

《综合与Design_Compiler》学习笔记——第一章综合综述 第二章verilog语言结构到门级的映射 第三章 使用DC进行综合,IC后端相关,学习,笔记,DC

2、综合的不同层次

(1)逻辑级综合

设计被描述成布尔等式的形式,触发器、锁存器这样的基本单元采用元件例化(instantiate)的方式表达出来,下面是一个加法器的代码。

《综合与Design_Compiler》学习笔记——第一章综合综述 第二章verilog语言结构到门级的映射 第三章 使用DC进行综合,IC后端相关,学习,笔记,DC

(2)RTL级综合

电路的数学运算和行为功能分别通过HDL语言特定的运算符和行为结构描述出来。电路在每个时钟边沿的行为都被确切的描述出来。

《综合与Design_Compiler》学习笔记——第一章综合综述 第二章verilog语言结构到门级的映射 第三章 使用DC进行综合,IC后端相关,学习,笔记,DC

(3)行为级综合

电路的行为可以描述成一个时序程序(sequential program),没有明确规定电路的时钟周期,综合工具的任务就是根据指定的设计约束,找出哪些运算可以在哪个时钟周期内完成,需要在多个周期内用到的变量值需要通过寄存器寄存起来。

《综合与Design_Compiler》学习笔记——第一章综合综述 第二章verilog语言结构到门级的映射 第三章 使用DC进行综合,IC后端相关,学习,笔记,DC

二、verilog语言结构到门级的映射

1、always语句描述的组合逻辑电路,敏感列表要包含所有的输入变量。

2、ifcase语句不完整会综合出锁存器,解决方法:在最开始的时候给变量赋初值或者把语句写完整(写default)。

3、如果设计者知道case语句不会有其他值,且不想综合出锁存器,可以使用一条综合指令:synopsys full_case,这句话以注释的形式加在设计代码里面。

带来的问题:降低代码的可移植性,会让他依赖于综合工具;产生的网表和当初的verilog建模有区别,带来验证的复杂性。

《综合与Design_Compiler》学习笔记——第一章综合综述 第二章verilog语言结构到门级的映射 第三章 使用DC进行综合,IC后端相关,学习,笔记,DC

4、casex语句是有优先级的(如优先编码器),相当于if-else if-else,如果想要产生互斥的语句,也就是平行结构,可以加上synopsys parallel_case

5、常见的循环语句有4种:forforeverwhilerepeat。循环语句综合时相当于展开循环体,把相同的电路结构重复多次,会造成综合后的面积和性能受到影响。

6、DesignWare 是集成在DC综合环境中的可重用电路的集合,DesignWare 分为 DesignWare BasicDesignWare Foundation,DesignWare Basic 提供基本的电路,DesignWare Foundation 提供性能较高的电路结构。针对同一种算术符,可以有不同的算法,根据添加的约束条件来选择。

在使用的时候,需要有license,同时在综合的时候要设置synthetic library
《综合与Design_Compiler》学习笔记——第一章综合综述 第二章verilog语言结构到门级的映射 第三章 使用DC进行综合,IC后端相关,学习,笔记,DC

《综合与Design_Compiler》学习笔记——第一章综合综述 第二章verilog语言结构到门级的映射 第三章 使用DC进行综合,IC后端相关,学习,笔记,DC

三、使用DC进行综合

lib格式:用户可读,其中包含信息有工艺条件、单位、基本单元的引脚、方向、时序信息等。
db格式:供DC软件读取的格式

《综合与Design_Compiler》学习笔记——第一章综合综述 第二章verilog语言结构到门级的映射 第三章 使用DC进行综合,IC后端相关,学习,笔记,DC

1、定义

流程:准备设计文件、指定库文件、读入设计、定义设计环境、设置约束、编译(选择编译策略)、报告、存储数据

工艺库(technology library):目标库和链接库统称为工艺库,一般只要设置好这两个

set : 自己自定义的一些变量,方便定义系统变量,相当于减少一些重复的代码,同时增加了代码的可读性,和tcl的语法是一样的。

set_app_var定义DC内部的系统变量、指定DC内部的连接等。主要指定有:search_path、synthetic_library、target_library、link_library、symbol_library 以及其他的一些命令开关等。

define_design_lib work -path $WORK_PATH:DC内部命令格式,指定设计和库的工作路径。

printvar target_library:启动DC后,可以通过该命令来查看库的名称。

dcprocheck xxx.tcl:检查该文件的语法是否正确。

source:是用来定义一些命名规则,去掉网表中的一些符号,防止后端工程师拿到的网表中带一些奇怪的符号从而引起不必要的错误。(没有用这个)

source -v -e ./../../../xxxxx/syn/work/hs_name_rules.tcl

在和物理库相关的时候需要使用拓扑模式来启动dc,选项为-topo,同时可以把启动dc时的相关信息输出到log文件,指令为tee -i,中间的|为管道连接符,连接输入和输出

dc_shell -topo | tee -i start_report.log

2、写时序约束

模块如下所示:
《综合与Design_Compiler》学习笔记——第一章综合综述 第二章verilog语言结构到门级的映射 第三章 使用DC进行综合,IC后端相关,学习,笔记,DC

设计约束规格书如下所示:
《综合与Design_Compiler》学习笔记——第一章综合综述 第二章verilog语言结构到门级的映射 第三章 使用DC进行综合,IC后端相关,学习,笔记,DC

create_clock -period 3 [get_ports clk]
set_clock_latency -source -max 0.7 [get_clocks clk]   //时钟延迟中的时钟源延迟的最大值为0.7ns
set_clock_latency -max 0.3 [get_clocks clk]  //时钟网络延迟的最大值
set_clock_uncertainty -setup 0.15 [get_clocks clk] //0.15=0.03+0.03+0.04+0.05,两个时钟之间的最大延时偏差为0.06,再加上该时钟的时钟抖动0.04,同时加上留的裕量0.05
set_clock_transition 0.12 [get_clocks clk]

《综合与Design_Compiler》学习笔记——第一章综合综述 第二章verilog语言结构到门级的映射 第三章 使用DC进行综合,IC后端相关,学习,笔记,DC

《综合与Design_Compiler》学习笔记——第一章综合综述 第二章verilog语言结构到门级的映射 第三章 使用DC进行综合,IC后端相关,学习,笔记,DC

//输入延迟时间是相对于clock的相对时间,而这里给出的是绝对时间,所以要减去时钟延迟,1.4-0.7-0.3=0.4(每台明白)
set_input_delay -max 0.4 -clock clk [get_ports sel] 

//3-2.2-0.2-0.15=0.45,这里只给出了内部的组合逻辑延时,如果要知道外部的输入延时的话,用一个时钟周期去-组合逻辑延时-Tsetup-uncertainty
set_input_delay -max 0.45 -clock clk [get_ports data*] 
set_output_delay -max 0.5 -clock clk [get_ports out1] //0.42+0.08

set_output_delay -max 2.04 -clock clk [get_ports out2] //3-0.81-0.15=2.04

set_output_delay -max 0.4 -clock clk [get_ports out3]

《综合与Design_Compiler》学习笔记——第一章综合综述 第二章verilog语言结构到门级的映射 第三章 使用DC进行综合,IC后端相关,学习,笔记,DC

3-0.15-输入延时-2.45=输出延时
输入延时+输出延时=0.4 只要满足这个要求即可,可以根据后端要求再进行调整
set_input_delay -max 0.1 -clock clk [get_ports Cin*]
set_output_delay -max 0.3 -clock clk [get_ports Cout]

3、写环境约束

《综合与Design_Compiler》学习笔记——第一章综合综述 第二章verilog语言结构到门级的映射 第三章 使用DC进行综合,IC后端相关,学习,笔记,DC

(1)设置环境条件

一般不设置的话默认用库里面默认的norminal

set_operating_conditions -max $OPERA_CONDITION -max_library $LIB_NAME

(2)设置连线负载模型

在计算时序路径的延迟,需要知道门单元延迟连线的延迟

门单元的延迟采样非线性延迟模型,依据输入转换时间输出负载的查找表得出,
同时查找出输出转换时间,作为下一级电路的输入转换时间。

连线的延迟通过线负载模型进行估算,根据连线的扇出来估算连线的寄生参数RC。
线负载模型(右侧)给出的是单位连线的电阻/电容/面积信息。
下面的计算超出了最大扇出长度,根据slope来外推计算。

《综合与Design_Compiler》学习笔记——第一章综合综述 第二章verilog语言结构到门级的映射 第三章 使用DC进行综合,IC后端相关,学习,笔记,DC

set  auto_wire_load_selection  false  //DC可以自动选择合适的连线负载模型,可以使用命令关掉

set_wire_load_model  -name  $WIRE_LOAD_MODEL  -library  $LIB_NAME

连线负载模型的模式:围绕(enclosed)、顶层(top)、分段(segmented)
enclosed模式:使用的是包围该模块的连线负载模型。
top模式:最悲观的情况,使用的是顶层的连线负载模型。
segmented模式: 位于两个小模块中的部分采用这两个小模块对应的连线负载模型, 中间部分采用子模块的连线负载模型。也就是连线位于哪个模块就采样哪个模块的模型。

set_wire_load_mode enclosed/top/segmented

《综合与Design_Compiler》学习笔记——第一章综合综述 第二章verilog语言结构到门级的映射 第三章 使用DC进行综合,IC后端相关,学习,笔记,DC

(3)设置驱动强度

默认情况下会认为输入转换时间为0,为了得到真实的延迟,我们需要给输入端加上驱动

set_drive 0/100  //0表示最大驱动强度,通常为时钟端口,其他数字的单位为电阻
set_driving_cell -lib_cell FD1 -pin Q [get_potrs IN1] //指定一个真实的外部单元来进行驱动,指定cell和cell的哪个引脚来进行驱动,不指定引脚的话也会有个默认引脚

set_input_transition 10 [get_ports IN1]  //也可以直接指定某个输入端的转换时间

(4)设置电容负载

同理,默认情况下外部端口电容负载为0

set_load 5 [get_potrs IN1]   //直接设置为某个具体的值
set_load load_of cell/lib/pin [get_ports out1]  //设置为某个特定单元的引脚,一般为输入端口 
set_load [expr [load_of my_lib/inv1a0/A]*3] out1  //相当于设置输出端同时连接3个反相器

和输入输出延迟一样,一般不知道每个模块输入端口的外部驱动单元和/或输出端口的外部输出负载,可以假设输入端口为驱动能力弱的单元驱动(即转换时间长),同时限制每一个输入端口的输入电容(负载),限制输出端口的驱动模块数目。

(5)设置设计规则约束(DRC)

一般设计规则约束的优先级最高,其中优先级依次为最大电容最大转换时间最大扇出

设置约束如下:

set  DRIVE_PIN  TECH_LIB/invla27/Y     //设置某个单元的输出引脚为外部驱动单元
set  MAX_CAP  [get_attribute   $DRIVE_PIN   max_capacitance]  //得到最大电容值
set  CONSERVATIVE_ MAX_CAP   [expr  $MAX_CAP  /  2.0]   //除以一半,留点裕量
set_max_capacitance  $CONSERVATIVE_MAX_CAP  [get_ports IN1]   //设置最大电容值

set_max_capacitance 3.0  $current_design   //为整个设计添加最大电容约束

set_ max_transition  $CONSERVATIVE_MAX_TRANS  [get_ports IN1]

set_max_fanout  6  [get_ports IN1]   //这里设置的是最大扇出负载,并不是扇出的绝对数目
get_attribute  TECH_LIB/invla1/A   fanout_load //0.6,用来查看load,根据上面可以得出6/0.6=10,u也就是可以驱动10个这样的单元

(6)面积约束

面积的衡量单位有三种:2输入与非门(2-input-NAND-gate)、晶体管数目(Transistors)、平方微米(Square microns),可以通过report_area这个指令来判断面积的单位,输出为1第一种,输出为4第二种,输出为其他第三种。

不设置面积约束的情况下,DC也会对其进行面积优化,设置为0的话会进行最大限度的优化,直至不能再继续优化了。对于较小的设计,可以设置面积约束为0,但是对于较大的设计,这样会消耗很多的时间。

set_max_area  0

(7)完整的环境约束

set LIB_NAME slow                 //最差劲的情况
set WIRE_LOAD_MODEL tsmc090_w150
set DRIVE_CELL INVX1              //驱动单元选的是库中的反相器
set DRIVE_PIN Y
set OPERA_CONDITION slow
set ALL_IN_EXCEPT_CLK [remove_from_collection [all_inputs] [get_ports "$CLK_NAME"]]   //从all_inputs这个对象集合中,移除掉CLK_NAME这些代表的端口
set MAX_LOAD [expr [load_of $LIB_NAME/INVX8/A]*10]

set_operating_conditions -max $OPERA_CONDITION -max_library $LIB_NAME

set auto_wire_load_selection false
set_wire_load_mode top
set_wire_load_model -name $WIRE_LOAD_MODEL -library $LIB_NAME

set_driving_cell -lib_cell ${DRIVE_CELL} -pin ${DRIVE_PIN} $ALL_IN_EXCEPT_CLK
set_load [expr $MAX_LOAD * 3] [all_outputs]

四、输出结果

综合之后把门级网表和约束交付给后端,进行布局布线和时钟树综合等流程。
如果时序违例大于时钟周期的25%,需要重新修改RTL代码。
时序违例在10-25%之间,可以进行优化,如利用指令compile_ultra,在拓扑模式下进行编译,适合于高性能的电路优化。

//设置搜索路径和工艺库
set search_path "../lib/logic   ../src"   #设置搜索路径

set target_library " slow.db "     #设置标准元件库
set link_library   "* $target_library "
set symbol_library " smic18.sdb "  #设置标准元件图标库

set access_internal_pins true

set report_path "./reports"    #设置reports文件夹
set output_path "./outputs"    #设置outputs文件夹

//读入设计文件
read_file -format verilog cic_filter.v   #读取verilog设计文件
read_file -format verilog divider64.v

//指定当前设计
current_design cic_filter   #指明主程序
link   #工艺库链接
uniquify


set     design_name     [get_object_name [current_design]]

//设置环境约束,包括线负载模型
set_wire_load_model -name "smic18_wl10"    #设置线负载模型
set_wire_load_mode top


//设置时钟约束
create_clock -period 156 -waveform {0 78} [get_ports clk]  -name clk    #设置时钟,周期156ns,脉宽0-78ns

create_generated_clock  [get_pins div/clk_div] -source [get_ports clk]  -divide_by 64 -name clk_div   #分频64后的时钟

set_clock_latency 2.5 clk    #延迟时间2.5ns
set_clock_transition 0.3 clk    #翻转时间0.3ns
set_clock_uncertainty 1.5 -setup clk   #建立时间1.5ns
set_clock_uncertainty 0.3 -hold clk    #保持时间0.3ns

//设置环境约束
set_drive 0 [list clk rst_n]      #设置输入驱动强度为0
set_driving_cell -lib_cell NAND2X1  in   #设置驱动单元


set_input_delay  35 -clock [get_clocks clk] {in rst_n}   #设置输入延时35ns
set_output_delay 35 -clock [get_clocks clk_div] [get_ports out]   #设置输出延时35ns
set_load          2        [all_outputs]    #设置输出负载为2pF

set_max_area 0

//输出综合前的时序信息和设计信息
check_design > $report_path/check_design_before_compile.rpt
check_timing > $report_path/check_timing_before_compile.rpt

//综合的指令compile
compile
compile -incremental_mapping -map_effort high   

//把文件进行保存,DC是不会保存的
write_sdf -version 2.1         $output_path/${design_name}_post_dc.sdf   #时序描述
write -f ddc -hier -output     $output_path/${design_name}_post_dc.ddc
write -f verilog -hier -output $output_path/${design_name}_post_dc.v    #网表
write_sdc                      $output_path/${design_name}_post_dc.sdc  #约束

//报告时序、面积、功耗等相关信息
report_constraint -all_violators -verbose          > $report_path/constraint.rpt
report_qor                > $report_path/qor.rpt
report_power              > $report_path/power.rpt
report_area               > $report_path/area.rpt
report_cell               > $report_path/cell.rpt
report_clock              > $report_path/clk.rpt
report_hierarchy          > $report_path/hierarchy.rpt
report_design             > $report_path/design.rpt
report_reference          > $report_path/reference.rpt
report_timing             > $report_path/timing.rpt


//最后检测时序、设计信息
check_design > $report_path/check_design_post_compile.rpt
check_timing > $report_path/check_timing_post_compile.rpt

#start_gui

五、简答

1、目标库和链接库的区别

target library是rtl代码映射到工艺库时stdcell所在的库,link library是包括了target library,同时还包括了设计中用到的IP等宏模块,查找reference进行连接时所搜寻的库,是为了更好地理解design。

link库路径面前加*号表示开辟一块单独的内存空间给DC自己使用,然后先搜寻内存中已有的库,然后再搜寻变量link_library指定的其他库。DC搜寻的库为search_path指定的目录(比如说之前读入设计时读入了库a,库a存到内存里;这时DC在进行综合的时候,发现缺少某个东西,于是就先从库a里面找,找不到时就会从列表里面的变量路径中找)。

一般情况下,我们只用一个工艺库,需要引用目标工艺库,因此指定target_library;此外我们还有可能用到synopsys公司的IP核,因此需要指定他的DW库。文章来源地址https://www.toymoban.com/news/detail-519071.html

到了这里,关于《综合与Design_Compiler》学习笔记——第一章综合综述 第二章verilog语言结构到门级的映射 第三章 使用DC进行综合的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 《EDA技术实用教程(第六版)》学习笔记——第一章

    ASIC(Application-Specific Integrated Circuit):专用集成电路 SOC(System-on-Chip):片上系统 SOPC(System-on-Programmable-Chip):片上可编程系统 EDA(Electronic Design Automation):电子设计自动化 HDL(Hardware Description Language):硬件描述语言 FPGA(Field-Programmable Gate Array):现场可编程门阵列

    2024年01月17日
    浏览(25)
  • 云计算学习笔记--第一章(《云计算》刘鹏第三版)

    大数据时代 为什么全球数据量增长如此之快: 一方面是由于数据产生方式的改变。另一方面,人类的活动越来越依赖数据。一是人类的日常生活已经与数据密不可分。 何为大数据: 海量数据或巨量数据,其规模巨大到无法通过目前主流的计算机系统在合理时间内获取、存储、

    2023年04月09日
    浏览(20)
  • JS深入学习笔记 - 第一章.构造函数原型与原型链

    1.1 概述 在典型的  OOP 语言中(如Java),都存在类的概念, 类就是对象的模板,对象就是类的实例 ,但在ES6之前,JS并没有引入类的概念。 在 ES6之前 ,对象不是基于类创建的,而是一种称为 构建函数 的特殊函数来定义对象和它们的特征。 有三种创建对象的方式: 对象字面

    2024年02月08日
    浏览(22)
  • Rx.NET in Action 第一章学习笔记

    什么是反应式程序?它们有什么用?使用反应式扩展(Rx)编程,会如何改变你编写代码的方式?在开始使用 Rx 之前应该做些什么?为什么 Rx 比传统的事件驱动编程更好? 这些都是我们将在前三章开始讨论的问题。 你将了解什么是反应式系统及反应式程序,以及为什么要关

    2024年02月13日
    浏览(19)
  • ROS2 Navigation 进阶教程学习笔记 第一章

    Nav2提供了新的拱你和工具,使创建机器人应用程序变得更容易 在本单元中,将学习 1. 通过simple Commander API进行基本Nav2操作 2. 通过followwaypoints使用waypoint follower和task executor插件 3. 禁区和限速区简介 然后您将基于Nav2创建一个基本的自主机器人demo。您将经常在一个仿真仓库中

    2024年02月08日
    浏览(21)
  • 《Pytorch深度学习和图神经网络(卷 2)》学习笔记——第一章

    PyTorch深度学习和图神经网络(卷2)——开发应用一书配套代码: https://github.com/aianaconda/pytorch-GNN-2nd- 百度网盘链接:https://pan.baidu.com/s/1dnq5IbFjjdekAR54HLb9Pg 提取码:k7vi 压缩包密码:dszn 2012年起,在ILSVRC竞赛中获得冠军的模型如下 2012年:AlexNet 2013年:OverFeat 2014年:GoogLeNet、

    2024年02月16日
    浏览(23)
  • 《MetaGPT智能体开发入门》学习笔记 第一章第二章

    使用从 - 通过github仓库获取MetaGPT 代码拉下来后在config文件夹中配置chatGPT key 使用的python环境为3.9.2 metaGPT代码下载后在metagpt文件夹中找statup.py文件,运行以下命令,我是没有成功可能是chatgpt没钱 智能体 = LLM+观察+思考+行动+记忆 多智能体 = 智能体+环境+SOP+评审+路由+订阅+经

    2024年01月17日
    浏览(34)
  • 《EDA技术实用教程(第六版(黄继业, 潘松))》学习笔记——第一章

    ASIC(Application-Specific Integrated Circuit):专用集成电路 SOC(System-on-Chip):片上系统 SOPC(System-on-Programmable-Chip):片上可编程系统 EDA(Electronic Design Automation):电子设计自动化 HDL(Hardware Description Language):硬件描述语言 FPGA(Field-Programmable Gate Array):现场可编程门阵列

    2024年01月22日
    浏览(22)
  • Linux高性能服务器编程 学习笔记 第一章 TCP/IP协议族

    现在Internet使用的主流协议族是TCP/IP协议族,它是一个分层、多协议的通信体系。 TCP/IP协议族包含众多协议,我们只详细讨论IP协议和TCP协议,因为它们对编写网络应用程序有最直接的影响。如果想系统学习网络协议,RFC(Request For Comments,评论请求)是首选资料。 TCP/IP协议

    2024年02月09日
    浏览(38)
  • 计算机网络原原理学习资料分享笔记---第一章/第六节(为有梦想的自己加油!)

    第六节 计算机网络与 因特网发展简史 第六节 计算机网络与因特网发展简史 知识点 1 计算机网络与因特网发展简史 第六节 计算机网络与因特网发展简史 3 、 1972 年底, ARPAnet已经发展到 15 个交换结点。 4 、 20 世纪 70 年代早期与中期,除了ARPAnet之外,还诞生了许多其他分

    2024年04月27日
    浏览(18)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包