1.1 什么是DC?
      DC(Design Compiler)是Synopsys公司的logical synthesis工具,它根据design  description和design  constraints自动综合出一个优化了的门级电路。它可以接受多种输入格式,如HDL、Schematics、Netlist等,并能生成多种性能 report,在reducing design time的同时提高了设计的性能。
1.2 DC能接受多少种输入格式?
     支持 .db、.v、.vhd、.edif、.vgh、.lib等,.db一般是厂商的单元库;.v是veilog的后缀;.vhd是VHDL的后缀;.edif 和 .vhd是两种形式的netlist。
1.3 DC提供多少种输出格式?
     提供 .db、.v、.vhd、edif、.vgh等,并可以输出sdc、sdf等相关格式文件。
1.4 DC的主要功能或者主要作用是什么?
     DC是把HDL描述的电路综合为跟工艺相关的门级电路。并且根据用户的设计要求,在timing、area、power上取得最佳的效果。在floorplanning和placement和插入时钟树后返回DC进行时序验证。
1.5 如何寻找帮助?
     帮助可以用3种求助方式:
     1. 使用SOLD,到文档中寻求答案
     2. 在命令行中用man+ DC命令(我最喜欢这种)
     3. 在命令行中用info+ DC命令
1.6 如何找到SOLD文档?
      SOLD文档可以在teminal中输入sold&执行。
      $> sold&
       或者用命令 which dc_shell找到dc的安装目录。找到online目录。
1.7 如何配置DC?
      综合设置提供必要的参数给DC,使工具能够知道进行综合时所需要的必要的信息,如:工艺库,目标库,标志库等等。要 在.synopsys_dc.setup上设置好这些参数。而.synopsys_dc.setup要在三个目录下有说明,一个是synopsys的安装 目录,一个是用户文件夹,最后一个是工程目录。由后一个设置覆盖前一个文件。
      具体参数包括:search_path, target_library, link_library, symbol_library
1.8 target_library 是指什么?
      target_library是在synthesis的map阶段时需要的实际的工艺库。
1.9 link_library如何指定?
      链接时需要的库,通常与library相同,设置时,需要加“*”,表示内存中的所有库。
1.10 search_path 的设置?
      该参数指定库的存储位置
1.11 DA 和DC有什么区别?
      DA是 Design Analyzer的简称,它调用DC来进行综合,但是它是图形化的,可以看逻辑电路图,当然需要你的库有symbol库.
1.12 为什么要使用DA而不用shell接口?
       这个问题似乎很幼稚,shell接口当然可以用,但我们大部分人已经习惯使用windows这种友好的图形化界面,恰好DA是图形化的,非常适合初学者! 不过本人强烈建议使用shell接口的。synopsys的synthesis包括dc_shell(这是synopsys自带的)和dc_shell  -tcl_mode(script命令遵循tcl语法格式)。
1.13 SOLD是什么?
     SOLD是 Synopsys OnLine Document的简称,基本包括了synopsys公司的所有工具的文档集合.
1.14. translation这一步是用什么DC命令来实现的?
      我们知道,DC综合过程包括3个步骤:translation + logic optimization + mapping
      transition 对应命令为 read_verilog(read_vhdl等)
      logic optimization 和 mapping 对应于 compile
1.15. 逻辑优化和映射(logic optimization + mapping)又是用什么DC命令来实现的?
       logic optimization 和 mapping 均在compile命令完成,但是可以指定使用特殊的优化方法:structural  和flatten,建议大家在synthesis时同时生成structural  和flatten格式的netlist,然后打开看看到底有什么不同之处。
1.16. 什么是DC script?
      DC script 是一组dc 命令的集合,使得综合可以流程化也易于管理。
1.17. 基于路径的综合的意思是什么?
      路径(path),是DC中的一个重要概念。它包括4种路径方式:
      1 input到FF的D端。
      2 FF的clk到另一个FF的D端。
      3 FF的clk到输出Q。
      4 input到output。
      基于路径的综合就是对这四种路径进行加约束,综合电路以满足这些约束条件。
1.18 DC中的各类参数的单位是如何确定的呢?
      参数的单位由所使用的库决定,在读入库之后,可以用report_lib去看库的信息,里边有详细的单位说明
1.19 DC中的对象有哪些?
       设计变量:一共有八种:Design, cell, reference, port, pin, net, clock,  library。其中cell是子设计的例化,reference是多个子设计例化的通称,port是design的输入输出,pin是cell的输入输 出。
1.20 什么叫start point 和end point?
      这两个概念是DC中path概念的起始点和终点:
      1 起始点可以是input和FF的clk
      2 终点可以是FF的data和output
      这些是timing analyzing基本概念,希望大家结合DC和STA的实际牢牢掌握!
1.21 如何寻找想约束的对象?
      一个是全部查找包括:all_inputs , all_outputs, all_clocks, all_registers。
      比如:set_input_delay 1.0 all_inputs()   :这种写法针对dc_shell,
若是在dc_shell -tcl_mode下,则为 set_input_delay 1.0 [all_inputs]
      一个是根据关键词进行查找:[get_ports()] 或表示成 find(port,’ ‘),前者是tcl mode下的写法!
      作为一个IC设计者,在此强烈建议初学者多看SOLD文档,多多实践,多多学习TCL、Perl等常用的脚本语言。
1.22 什么叫一个设计(design) ?
      设计是DC中的重要对象,你所要综合的东西就叫design,确切的说是你所要综合模块的top文件。
1.23 什么叫cell 和leaf cell?
      在design中,instance的子设计,称为cell。
      没有子模块的cell 统称为leaf cell,我们在定义clock constraint的时候,一般需要把path指到leaf cell。
1.24 reference 是指什么? 和cell 有什么区别?
      当存在一个模块被多次例化,那么该模块就称为reference
1.25 如何读入一个design?
      使用analyze + elaborate 或者 read_verilog、read -f verilog、read_vhdl、read_file 命令。
1.26 analyze+ elaborate 和 read 命令有什么区别?
      read_file 是可以读取任何synopsys支持格式的;analyze和eloborate只支持verilog和VHDL两个格式,但是他们支持在中间过程中加入参数而且以便以后可以加快读取过程。
1.27 如何处理多个引用的问题?
       方法一:使用 uniquify,就是把引用几次那么就在内存中换名引入多个子设计,适用于不同时序约束要求。
      方法二:可以用dont_touch命令,先对多个引用的设计进行编译之后,设置为dont_touch,适用于基本相同的环境要求。
       方法三:把两个引用进行 flatten(没有层级结构),然后进行综合。
1.28 link的作用是什么?
      确定所有文件是否均存在并把它们链接到当前设计。
1.29 环境设置是指什么?
      是指芯片物理上的参数,比如电压,温度等。
1.30 如何设置线载模型?
      使用set_wire_load_model 命令,
      如:set_wire_load_model -name KME -library libr
1.31 如何得知线载模型的种类?
      读取库文件到DC中,使用report_lib看有多少可用的线载模型
1.32 如何设置工作环境变量?
      使用set_operating_conditions
      如:set_operating_conditions "WCCOM"
1.33 工作环境变量的类别可以分为哪几类?
      一般可以分为最坏(worst case)、典型(typical)、最佳(best case)。
1.34 为什么要设置工作环境变量?
      由于我们要做的是一颗要在实际环境中正常工作的芯片,而温度和环境对电路的性能有很大影响,因此为了尽可能地模拟芯片工作,设置合适的工作环境信息是非常必要的。
1.35 read 和 analyze + ealborate做了哪些工作?
      语法检查,建立GETECH库(大家可以自己去搜索什么叫GETECH库)值得注意的是,read命令不自动执行link操作。
1.36 getech库是做何用途的?
      GETCH库是由软宏(soft macros)组成的,是加法器,乘法器之类的东西,这些组件都是在DW里引用的。
1.37 如何检查script文件中有何错误呢?
      dc_shell -tcl -f
1.38 如果在dc_shell启动后, 想修改库,怎么办?
      摁一下ctrl+c暂停,改完之后继续运行!
1.39 如何在dc_shell环境下执行UNIX命令?
      这个问题很简单,也很幼稚!在此不作回答!
1.40 优化分为几个层次?
      一个是基于HDL的结构优化转化为GETCH结构;基于GTECH的逻辑优化,包括架构(strcuture),打平(flatten),转化为优化过的GETCH;基于GETCH的门级优化,主要作用是映射到实际的工艺库中。
1.41 什么是约束?
      约束分为design constraint和optimization constraint。design  constraint不由用户确定,已经由所采用的库确定了,用户只能添加进一步的约束。optimization  constraint分为两个方面,timing constraint和area constraint。timing  constraint又可分为组合电路的约束,时序电路的约束以及输入输出的约束。
1.42 DC Script支持TCL么?
      支持,synopsys支持dc_shell 和dc_shell -tcl_mode。前者是SYNOPSYS的内部语言,后者遵循tcl语法。
1.43 综合时不想使用某些库单元进行mapping,怎么办?
      使用set_dont_use 命令
  2.1 约束一个设计分为几个方面?
     总的分为:area constraint 和 timing constraint。
2.2 面积约束的命令是什么?
     set_max_area
2.3 如何对时钟进行约束?
     描述一个clock包含两个因素:频率和相位。
     使用create_clock 建立时钟constraint。
     如:create_clock -name clk200   -period 5   -waveform {0 ,2.5} find(pin, "armpll_wrapper_x/g_reg/Q")
2.4 如何对pll进行约束?
     如果存在PLL,那么首先对输入的初始时钟用create_clock进行约束。
     再用create_propagated_clock 对PLL输出时钟在基于输入时钟进行约束,或者直接用create_clock,
     两者的clock path 都得来自leaf cell
2.5 什么叫虚拟时钟约束?
     虚拟时钟是指在当前要综合的模块中不存在的物理时钟。比如,设计外的DFF的时钟。
     建立这样的时钟有益于描述异步电路间的约束关系,不过本人在实际工作中基本不设置!
2.6 DC可以对时钟的哪些特性进行约束?
     DC支持对时钟的T,waveform,jitter,skew,latency 描述,请大家务必搞清楚jitter和skew得区别,latency有多种,如果你正在做timing 分析工作,那么问一下自己:latency、jitter、skew等这些因素已经搞明白了吗?
2.7 如何约束时钟的jitter?
     使用set_clock_uncertainty -setup(-hold) 约束时钟的jitter
2.8 如何约束时钟的skew?
     使用set_clock_uncertainty 约束时钟网络的skew
2.9 如何约束时钟的latency?
     使用 set_clock_latency -option ,option is source or network,the default is network。
2.10 如何对当前设计的端口外部条件进行约束?
     端口的外部条件包括:输入驱动大小,输出负载的大小,扇出大小。
2.11 输入端口被多大的驱动所驱动?
     可以使用set_dirive 和set_driving_cell,或者用set_input_transition,注意这三者区别!
2.12 输出端口要驱动多大的负载?
     使用set_load 对输出电容值进行约束,单位根据工艺库的define所定。
2.13 DC是基于path的综合,那么在约束时如何体现?
    我们知道,基于path会有四种路径形式,DC中提供
    create_clock 定义寄存器和寄存器之间的路径;
    set_input_delay 定义输入与寄存器之间的路径;
    set_output_delay 定义寄存器与输出之间的路径;
    set_max_delay 和 set_min_delay定义输入和输出的组合路径;
2.14 set_input_delay 的目的是什么?
    定义输入延时,来约束设计中输入逻辑的时序
2.15 set_output_delay 的目的是什么?
    定义输出延时,来约束设计中的输出逻辑的时序
2.16 如何对组合电路进行约束?
    组合电路有set_max_delay 和set_min_delay进行约束
2.17 如何对电路的速度进行约束?
    使用create_clock
2.18 当一个组合电路超过了时钟周期约束,那么该如何处理?
    加上set_max_delay重新约束,这样综合工具就会按照set_max_delay 的值尽量满足要求,不过这样会增加design的area,如果timing还是不能满足,那只能修改设计。
2.19 当出现环路电路时,如何约束电路?
    对某一路径使用set_false_path
2.20 如何加强设计规则的约束?
    DRC是电路必须满足的设计规则,使用
    set_max_capcitance
    set_max_fanout
    set_max_tansition
2.21 在添加了4种路径约束后,那么在synthesis时如何为某些path移除约束,不作timing分析?
    使用set_flase_path使得某些路径不进行timing check
2.22 对于某些路径需要在固定的几个周期内完成,如何对这些路径进行约束?
    使用set_multicycle_path 对路径进行约束
2.23 在添加这些特殊的路径约束,如何恢复原来通用的时序约束?
    使用reset_path
2.24 如何对三态门进行约束?
    由于综合时,默认三态门是enable的,所以对某些路径要设置set_false_path
2.25 如何对门控时钟进行约束,以保证功能正常?
    对门控时钟电路进行setup和hold检查,使用set_gating_clock_check
2.26 设置对某些网络比如clock或者reset不进行添加buffer等操作,应该怎么约束?
    使用set_dont_touch_network,请注意和set_dont_touch用法的区别
2.27 如何修正hold 时间冲突?
    加入set_fix_hold约束,这步约束在front-end遇到时一般不考虑,留给back-end公司处理!
3.1 综合时,有多少选择综合策略呢?
    可以使用top-down 和bottom-top。
3.2 top-down 方式有何优点?
    仅需提供单一TOP的script
    将设计作为一个整体,可得到较好的结果
3.3 bottom-up方式有什么优点?
    对多时钟的综合更为适合
    每个子模块都有自己的script,便于管理
    当一个模块改变时,不用重新综合所有设计
3.4 如何进行time-budge?
使用characteristic
3.5 top-down 方式有何缺点?
    编译时间长
    子模块改变则整个设计都要重新综合
    对多时钟设计综合效果不好
3.6 bottom-up方式有什么缺点?
    需要维护多个script
3.7 编译时的 -incremental 是什么意思?
    设计映射为门之后,时序和面积约束可以再定义,incremental确保维持以前的电路结构,只作改善时序和性能,不添加不必要的逻辑。
4.1 如何看面积报告?
     report_area
4.2 如何看时序报告?
     report_timing,详细请man report_timing 这个命令,看看它的多种option用法
4.3 想对单独的单元看面积报告, 用什么命令?
     report_cell 但是缺省的report_cell只能看current_design下面的一级的cell的面积,因此就有两种方法解决这个问题:
     1. 用report_cell [get_cells -hier *]可以看所有的cells面积
     2. 用list_design列出所有的design, 然后改变current_design到你所想要看的那一级的cell, 然后直接用report_cell.
4.4 如何看设计环境和线载模型?
      report_design
4.5 若设计规则和时序违反约束,如何查看?
      使用report_constraint -all_violators
4.6 如何查看连线的扇入,扇出,负载,电容和跳变时间?
      使用report_net
4.6 如何看整个综合后的网表中使用多少种类型的电路门?
      使用report_hierarchy
4.7 如何查看timing exception的时序约束?
      使用report_timing_requirements,请大家思考一下有哪些timing exceptions