2.1 约束一个设计分为几个方面? 总的分为,面积约束和时序约束。 2.2 面积约束的命令是什么? set_max_area 2.3 如何对时钟进行约束? 对时钟进行约束是对时钟的周期,波形进行描述。 使用create_clock 建立时钟约束 2.4 如何对pll进行约束? 如果存在PLL,那么首先对输入的初始时钟用create_clock进行约束。 再用create_propagated_clock 对PLL输出时钟在基于输入时钟进行约束。 2.5 什么叫虚拟时钟约束? 虚拟时钟是指在当前要综合的模块中不存在的物理时钟。比如,设计外的DFF的时钟。 建立这样的时钟有益于描述异步电路间的约束关系。 2.6 DC可以对时钟的哪些特性进行约束? DC支持对时钟的周期,波形,jitter,skew,latency 描述 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 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_false_path可以躲过path check。 2.19 当出现环路电路时,如何约束电路? 对某一路径使用set_false_path 2.20 如何加强设计规则的约束? DRC是电路必须满足的设计规则,使用 set_max_capcitance set_max_fanout set_max_tansition 2.21 在添加了4种路径约束后,如何为某些路径移除约束呢? 使用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 设置对某些网络比如时钟或者复位不进行添加buffer等操作,应该怎么约束? 使用set_dont_touch_network 2.27 如何修正hold 时间冲突? 加入set_fix_hold约束 /************ Part 3 Compile stategy ******************/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确保维持以前的电路结构,只作改善时序和性能,不添加不必要的逻辑。 3.8 ... /******* Part 4 Analyze the report ******************/
4.1 如何看面积报告? report_area 4.2 如何看时序报告? report_timing 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 /****************** Part 5 Output the result ***********/ Design Compiler基础概念 太基础的概念我就不介绍了,大家可以参考相关文档或是资料。这里我就说一些我觉得比较好的命令和概念。可能有点乱,我尽量说的条理些。 好习惯: 1、current_design确保当前设计是自己需要的,不要让DC根据一些潜在规则去判断,显式地声明,保证你的约束都加到自己希望的设计上; 2、link确保link_library和search_path没有问题,同上,DC执行的时候也会隐式地检查链接,但是只会报出警告,不会中断下面的操作,这样可能造成做无用功; 3、check_design检查设计的端口连接,例化情况,保证下一步操作是在一个完整的设计上进行的,同样可以依靠命令返回值做到脚本自动化,有问题就停下来,少做无用功; 4、write -f db -hier -out unmapd/TOP.db在读入设计并检查链接库后保存,这对于大型设计有好处,可以节约读入时间,下次操作不必重新读入,浪费时间; 5、约束单独写到一个文件中,这样方便管理,调用时可以直接使用source命令(TCL模式),约束是加到当前设计中,后面写的同属性的约束会覆盖前面写的; 6、加完约束后check_timing,确认约束是否加的合适、完全。
在设计代码中,引导语句“// synopsys translate_off”后直到“// synopsys translate_on”之间的语句被DC忽略
module( ) /*synthesis syn_black_box*/;
module( ); //synthesis black_box
|