ASIC设计学习笔记——使用Design Compiler进行综合

这篇具有很好参考价值的文章主要介绍了ASIC设计学习笔记——使用Design Compiler进行综合。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


前言

综合是ASIC的前端设计中极为重要的步骤,所谓的综合过程,是指将行为级描述的电路、RTL级的电路转换到门级网表的过程。本文介绍使用Synopsys公司的Design Compiler作为工具完成综合的过程。


1. 基本概念

1.1 综合(Synthesis)

在ASIC开发中,当使用verilog等硬件描述语言完成对所需要的功能的代码编写和仿真后,可以使用软件来进行翻译,将HDL描述的行为级代码转换为门级电路。这个转换为门级电路的实现与优化工作就是综合。
下图是一个基本的设计流程框图,其中“Design implementation”就是指综合的过程。
design compiler 编译选项,学习,fpga开发

综合本身的过程包括三个阶段:

  • 转换(translation):这一步是将HDL的描述转换成一个与工艺独立的RTL级网表,网表中RTL模块通过连线互联
  • 映射(mapping):接着根据具体指定的工艺库,将RTL级的网表映射到工艺库上,成为门级网表
  • 优化(optimization):最后根据设计者施加的延时、面积等约束条件,对门级网表进行优化。
    这个过程可以用下图表示:
    design compiler 编译选项,学习,fpga开发

1.2 使用Design Compiler进行综合

使用Design Compiler进行综合的过程和通用的综合过程相同,也包括转换、优化和映射三部分,如下图所示。
design compiler 编译选项,学习,fpga开发

  • 在转换阶段,DC读入HDL文件,使用自带的gtech.db库中的RTL级单元来组成与工艺无关的中间网表,这个过程,也就是使用DC的read_vhdl或read_verilog命令读入设计未见的过程,这一过程中,如果需要引入其他的库,可以通过read_db命令读入,这一过程的中间结果也可以通过write命令写入到一个.db文件中
  • 在优化映射阶段,DC对已有的中间网表进行分析,去掉其中的冗余单元,并对不满足约束条件的路径进行优化,再将优化后的电路映射到芯片制造商提供的工艺库上。这个过程也就是DC的compile命令,其输出可以通过write命令写入到文件中,如.v, .db或者.edif文件。

2. 使用DC进行编译

2.1 进入DC环境

在已经安装好Synopsis的工具链的环境里执行如下命令可以进入dc_shell。

$ dc_shell

如果只是想执行某一个编译脚本,则可以直接运行如下命令执行该tcl脚本:

$ dc_shell -f <script>.tcl

2.2 编译过程

2.2.1 设置搜索路径

  • lappend search_path <search_path>: 设置查找HDL源码和库文件的目录,其中lappend为添加该目录到搜索路径中。
lappend search_path <libraries_path>
lappend search_path <source_path>
lappend search_path <other_included_path>

如果HDL代码中用到`include原语包含其他HDL代码,则编译时也是从search_path中寻找include的文件。因此如果有这样的文件,则也需要将这些文件所在的目录加入到search_path中。

2.2.2 库环境设置

  • link_library:链接库,用于查找HDL代码中引用的各个模块,常用的IP库等都需要加入到链接库中,同时,需要加上“*”,用于表示要链接内存中所有的库,包括之前编译的其他HDL代码生成的子模块等;
  • target_library:synthesis的map阶段需要的实际工艺库,一般由厂商提供,格式为.db文件,厂商有时会提供.lib格式的文件,此时需要使用synopsys提供的library_compiler工具进行转换。
  • synthetic_library:如果不是使用默认的综合库,则需要设置该值,比如对于扩展的DesignWare,需要在synthetic_library中设置,同时需要在link_library中设置相应的库以使得在链接的时候DC可以搜索到相应运算符的实现。
set synthetic_library "dw_foundation.sldb"
set link_library     "* <foundry_lib.db> $synthetic_library"
set target_library "<foundry_lib.db>"

2.2.3 编译参数配置

2.2.4 读入设计

有两种方式读入设计:

  • 使用analyze和elabrate两条命令分阶段读取,仅能用于VHDL和verilog。其中:
    • analyze命令用以分析HDL代码,在为设计建立通用库上的逻辑结构前检查设计的错误,并将中间结果存入指定的库中。
    • elaborate命令用于建立设计在GTECH库上的结构级描述,为后续的优化和映射做好准备。
  • 使用read命令直接读取,可以一步完成analyze&elaborate的工作,并且read命令还可以用来读取db、EDIF等格式的设计
set src_list {     \
    top.v            \
    interface.v   \
    reg_map.v   \
    gpio.v          \
    cpu.v           \
}
analyze -format verilog $src_list
elaborate bb_top

2.2.5 编译命令

  • current_design mytop:读入设计后,开始编译前,需要使用current_design命令设置当前设计;
  • uniquify :为设计中的每一个模块产生一个名字唯一的拷贝,可根据每个模块本身特有的环境做优化和映射;
  • link:将读到的DC Memory中的模块连接起来,此时如果出现“unresolved design reference”警告,则不能继续往下,可能是link_library设置错误,或者没有加上"*";
  • compile_ultra:执行编译操作,使用compile_ultra而不是compile命令,compile_ultra会打开一些优化选项,使用一些附加的优化能力,但需要单独的license支持,且编译时间更长。如无其他特殊因素,建议一直使用compile_ultra命令编译。

2.2.6 保存编译结果

2.2.6.1 输出文件格式说明
  • .v文件:以verilog形式保存的门级网表文件
  • .sdf文件:用于仿真时进行时序反标的文件
  • .sdc文件:约束文件,保存有当前设计的约束信息
  • .ddc文件:完整的工程文件,可以通过该文件恢复全部工作环境
  • .svf文件:用于后面的形式验证的映射文件
2.2.6.2 保存报告
  • 使用report_clock命令可以输出时钟信息到文件
  • 使用report_constraint命令可以输出约束信息到文件
  • 使用report_timing命令可以输出时序信息到文件
  • 使用report_disable_timing命令可以输出被disable的时序信息到文件
  • 使用report_area命令可以输出面积信息到文件
  • 使用report_power命令可以输出功耗信息到文件
  • 使用report_qor命令可以输出时序信息到文件

2.3 其他常用命令

  • set_dont_touch:在当前设计和库单元上设置单元格、网格、引用和设计的dont_touch属性,以防止在优化期间修改和替换这些对象;
  • set_wire_load_mode:设置模块间连线负载模式,有三种情况:enclosed、top和segmented;
  • set_wire_load_model:设置模块内部连线模型;
  • compile_seqmap_propagate_constants:默认值为true。控制编译命令是否尝试识别和删除常量寄存器,并且在整个过程中传播常量值。
  • all_fanout:返回指定源扇出中的一组引脚、端口或者单元
  • hdlin_preserve_sequential:在设计中控制复杂的和读取的命令是否保留了卸载的顺序单元
  • sh_continue_on_error:允许脚本出错时继续执行命令
  • sh_source_emits_line_number:指示发出信息的错误消息严重级别,列出该消息发生时的脚本名和行号:E代表只报error;W代表报error和warning
  • set_load:指定端口或者网络上设置的load属性
  • load_of:返回指定端口cell的pin电容
  • set_fix_multiple_port_nets:在当前的设计或设计列表设置固定多路网属性到指定的值
  • report_timing -slack_lesser_than 1 报告小于1ns的时序路径
  • max_path 指定每个路径组报告的路径数
  • nworst 指定每个端点报告的最大路径数,默认为1,只会报告给定端点结束的最坏路径。
  • delay max min 报告路径组中的建立时间和保持时间的关键路径,max为建立时间
  • 用group创建层次,ungroup解除层次关系:
  • 设置面积约束:set_max_area 100 单位面积在不同的工艺库下所指的的一样:以二输入与非门的面积为单位面积、以单个管子所占面积为单位面积、以实际面积1um2为单位面积。在不知道的情况下可以综合一个二输入与非门来看数值,来确定具体所指。
  • 定义时钟:create_clock -period 10 [get_ports clk]
  • set_dont_touch_network [get_clocks clk]
  • 设置输入输出约束:set_input_delay -max 4 -clock clk [get_ports A]
  • set_output_delay -max 4 -clock clk [get_ports B]
  • 检查约束:report_port -verbose 报告当前设计中定义的I/O端口属性和施加的约束
  • report_clock:报告当前设计中定义的时钟及其属性情况
  • reset_design:删除当前设计中所有的属性值和约束(该句命令一般位于脚本第一句)。
  • 移除设计remove_design -design
  • list_libs:列出内存中所有可用的库
  • check_timing:检查是否有路径没有加入约束
  • check_design:检查设计中是否具有悬空的管脚或者输出短接的情况
  • write_script:将施加的约束和属性写出到一个文件内
  • reset_design:
  • 列出命令的开关选项:help -v set_input_delay
  • 集合中删除元素:set all_except_clk [remove_from_collection [all_inputs] [get_ports clk] ]
  • 引入时钟偏差:set_clock_uncertainty 0.5 [get_clocks clk]
  • 时钟源延时:set_clock_latency -source
  • 网络时钟延时:set_clock_latency
  • 布局后综合:set_propagated_clock
  • 同步多时钟:虚拟时钟 creat_clock -period 20 -name CLKA 红色部分必须指定,没有端口或者管脚

2.4 完整脚本

######################################################################
# configurations
set_host_options -max_cores 6
set hdlin_auto_save_templates true   

######################################################################
# set search path for libraries
lappend search_path ../../asic/dc/libraries
lappend search_path ../../srcs/sources_1/rtl/bb
lappend search_path ../../srcs/sources_1/inc/asic
set target_library   "tcbn55lpbwp12ttc_ccs.db"
set link_library     "* tcbn55lpbwp12ttc_ccs.db"

######################################################################
# set source files
set bb_list { \
top.v \
interface.v \
reg_map.v \
}

######################################################################
# read in the design
analyze -format verilog $bb_list
elaborate top
current_design top
uniquify
link

set mydesign "myasic"
set_svf "${mydesign}.svf"

######################################################################
# set constraints
create_clock pclk -period 8.012 -waveform {0.000 4.006}
set_drive 0 pclk
set_dont_touch_network pclk
set_clock_transition 0.01 [get_clocks pclk]
set_clock_uncertainty 0.01 [get_clocks pclk]
set_clock_latency 0 [get_clocks pclk]

create_clock clk_125m -period 8.012 -waveform {0.000 4.006}
set_drive 0 clk_125m
set_dont_touch_network clk_125m
set_clock_transition 0.01 [get_clocks clk_125m]
set_clock_uncertainty 0.01 [get_clocks clk_125m]
set_clock_latency 0 [get_clocks clk_125m]

set_false_path -from [get_clocks pclk] -to [get_clocks clk_125m]
set_false_path -from [get_clocks clk_125m] -to [get_clocks pclk]

set_input_delay 0.01 -clock pclk -rise [get_ports presetn]
set_input_delay 0.01 -clock clk_125m -rise [get_ports rst_n]

set_critical_range 0.10 [current_design]
set_max_fanout 16 bb_top
set_max_transition 0.1 bb_top
set verilogout_no_tri true
set verilogout_equation false
set timing_enable_multiple_clocks_per_reg true

######################################################################
# compile
compile_ultra -incremental -timing_high_effort_script

######################################################################
# write results to files
write -format ddc -hier -o "${mydesign}.ddc"
write -format verilog -hier -o "${mydesign}.v"
write_sdf "${mydesign}.sdf"
write_sdc -version 1.9 -nosplit "${mydesign}.sdc"
report_clock > "clock.txt"
report_timing -transition_time -capacitance -max_path 1000 > "timing.txt"
report_disable_timing > "disable_timing.txt"
report_area > "area.txt"
report_qor > "qor.txt"
report_power > "power.txt"
exit

4. 可能遇到的问题和解决方案

4.1 Net ‘Q’ or a directly connected net is driven by more than one source,and not all drivers are three-state.(ELAB-366)

可能原因和解决方案:

  • 不能在两个always下对同一个变量进行操作,也不能在多个block下进行赋值,比如嵌套的for循环。

4.2 verilog ‘assign’ or ‘tran’ statements are written out(VO-4)

可能原因和解决方案:

  • block的port如果是inout信号,DC会产生tri wire语句和tran原语,因此需要进行下面的设置:
    set verilogout_no_tri=true
  • 当设计中出现同一模块的input port和output port直接相连,需要用如下命令配置:
    set_fix_multiple_port_nets -feedthrough
    set_fix_multiple_port_nets -all -buffer_constants
  • 设计中可能存在dont_touch属性的net,可用如下命令的net的dont_touch移除
    define_name_rules MY_RULES -equal_ports_nets
    change_name -hier -rules MY_RULES -verbose

5. 总结

本文给出DC的综合的实际操作过程,作为实战案例,可以帮助初学者快速入门。文章来源地址https://www.toymoban.com/news/detail-722102.html

6. 参考文献

  • SYNOPSYS逻辑综合及DESIGNCOMPILER的使用, https://www.freesion.com/article/9064495015/
  • DC命令总结, https://blog.csdn.net/y183128184/article/details/109563386
  • DC学习(时序分析和命令), https://blog.csdn.net/buzhiquxiang/article/details/104848401
  • DC学习(综合与优化), https://blog.csdn.net/buzhiquxiang/article/details/104873055

到了这里,关于ASIC设计学习笔记——使用Design Compiler进行综合的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 图像处理ASIC设计方法 笔记1 硬件加速

    这本书是图像处理方面ASIC与DSP比较,讲了为什么要用ASIC做图像处理,它的特点和适用场景。 适用ASIC的应用场景:体积是第一位考虑的要素 还有功耗。 P25 选择用硬件加速的三个问题 1 算法有高并行性吗? 2 算法实现的硬件开销能承受吗? 3 与软件编程相比,使用硬件能获得

    2024年02月21日
    浏览(49)
  • 图像处理ASIC设计方法 笔记2 图像边界镜像处理

    这本书是图像处理方面ASIC与DSP比较,讲了为什么要用ASIC做图像处理,它的特点和适用场景。读到第一章, (计算卷积的)工作窗口位于图像边界时镜像扩展后的情况 。 输入仍然是逐行逐列串行图像数据流,但是在工作窗口内部,根据窗口中心像素的坐标判断窗口位于图像

    2024年02月21日
    浏览(52)
  • 【IC设计】ICC1 workshop lab guide 学习笔记——Lab 2 Design Planning Task5-9

    In the task following this one you will use “Power Network Synthesis” (PNS) to automate the creation of power/ground core and individual macro rings, as well as vertical and horizontal straps. If you want to create rings around groups of macros, that is done prior to PNS, which is what this task will accomplish. 在接下来的任务中,你将使用电源

    2024年02月13日
    浏览(34)
  • 图像处理ASIC设计方法 笔记18 轮廓跟踪算法的硬件加速方案

    P129 轮廓跟踪算法的硬件加速方案 如果图像中某区域存在相邻像素之间仅有对角连接的部位,则对包围该区域的像素进行跟踪时,在对角连接部位,轮廓跟踪方向可能发生转移,跨越目标区域,最终生成断裂链表或者伪孤立点链表。伪孤立点是指与相邻像素仅存在对角连通的

    2024年04月28日
    浏览(59)
  • Python综合练习:期末大作业使用openpyxl进行模拟学生宿舍管理系统设计与开发

    1.1 问题背景 随着办公智能化的发展,为方便对大学生宿舍的动态管理,宿舍管理系统储存了每个宿舍学生的基本个人信息,同时需要针对一些特殊情况,如转专业、退学等,对宿舍的信息实现动态调整,支持显示、增加、删除、修改、查询成员信息,从而实现宿舍管理员对

    2024年02月07日
    浏览(61)
  • [足式机器人]Part2 Dr. CAN学习笔记-Advanced控制理论 Ch04-8 状态观测器设计 Linear Observer Design

    本文仅供学习使用 本文参考: B站:DR_CAN

    2024年02月02日
    浏览(58)
  • 【QtQuick3D学习】使用Qt Design Studio设计UI并导入Qt Creator项目中使用——基于C++和Cmake

    新版本中项目文件全部放在了一起,见 【QtQuick3D学习】使用Qt Creator创建Qt Design Studio项目测试运行——基于C++和Cmake 【QtQuick3D学习】使用Qt Design Studio创建项目并使用Qt Creator打开测试运行——基于C++和Cmake 这里测试前后端分离,即使用Qt Design Studio设计前端和交互逻辑,C++写后

    2024年02月01日
    浏览(38)
  • SCSS 学习笔记 和 vscode下载live sass compiler插件配置

    SCSS 是一个 CSS 的预处理器,是 CSS 的扩展语言,可以帮助我们减少重复的代码,生成更好的 CSS 格式化代码,并且兼容所有版本的 CSS SCSS 是 对于 CSS3 的 SASS ,所以我们学的时候,把文件后缀写为 “.scss” 由于我们的配置,当遇到兼容性代码,出口文件会自动配置,如下图

    2024年02月12日
    浏览(43)
  • IC学习笔记22——memory_compiler&memory_wrapper

    memory_compiler为一系列工具的统称,用于生成芯片开发所需要的memory。芯片开发中所需要的memory为sram、rom等。很多公司都有自己开发的memory_compiler工具。 sram写操作(写1) 将要写入的数据“1”通过写入电路变成“1”和“0”后分别加到选中单元的两条位线BL,BLB上,此时使WL=1,

    2024年02月09日
    浏览(53)
  • 小白Cadence学习笔记<2> (Allegro & Design entry CIS & Pad_design)

    上一节分享了学习Cadence的文件夹设置以及简单的元器件绘制,今天继续分享下常见元器件的绘制以及简单原理图的设计。 在分享干货之前关于原理图先说点别的 ,画原理图的本质就是连接器件,每个元器件或多或少都有若干个引脚,所以想要没有大错误就是要保证我们的每

    2024年02月09日
    浏览(48)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包