Design Compiler基础知识整理

来源:互联网 发布:子域名是否需要备案 编辑:程序博客网 时间:2024/05/21 04:25

DC的四种工作模式:

工具模式:wire load mode和 topographical mode
非工具模式:Multimode和UPF模式(Unified Power Format)

非工具模式只能用在topographical mode下,wire load mode是默认模式,启动dc时必须选择工具模式的一种。Multimode允许在多个操作条件和多种模式下操作工具(比如:测试模式和备用模式)。UPF模式允许指定先进的低功耗方法。

不同模式下的编译命令

Wire load mode下的编译命令为:compile和compile_ultra。compile命令运行DC Expert,DC Expert综合你的HDL描述到优化的、技术相关的门级设计中。它支持广泛的平面和分层设计风格,可以优化面积,时序和功耗的组合和时序设计。compile_ultra运行DC Ultra(无topo模式的特点),DC Ultra提供了同步优化时间,区域,功率,并测试高性能设计。它还提供了高级的延迟算术优化,高级的定时分析,自动漏电能力优化和寄存器重定时。

Topographical mode:使用物理约束时必须在该模式下。在综合时精确预测布线后的时序、面积、功耗,时序的估算无需基于线载模型。综合命令:compile_ultra和compile_ultra -spg

一些杂乱的知识点

  • 在dc_shell下也可以使用unix命令诸如: pwd、 cd 、ls、history、alias等。

  • 重复最后一条命令dc_shell> !!

  • 执行第七条命令dc_shell> !7

  • 执行最后一条report命令dc_shell> !rep

  • 执行任何shell命令dc_shell> sh < UNIX_command >

  • 得到unix变量值dc_shell> get_unix_variable

  • set_app_var与set的区别是前者检查语法错误,然后设置一个自定义变量,后者不检查语法错误,直接定义一个变量;

  • set_app_var link_library “* $target_libs”通过link_library解决引用问题:先在DC内存中匹配design name,再在变量中匹配library cell name。

  • set_app_var search_path “./mapped ./rtl ./libs”会从左往右依次寻找;

  • 行注释用 “#” ,行间注释用“ ;# ”;

  • 可以在没有原先设计文件下,迁移旧库综合的netlist到新库的netlist

  • 读文件read_verilog / read_vhdl / read_sverilog:多条命令分别读多个文件(module分在各个文件),最后一个读到的model是当前设计;一次性读多个文件(module分在各个文件),第一个module是当前设计,一次读一个文件(多个module在一个文件),第一个module是当前设计。

  • 好的习惯是link之前指定current_design,在link之后check_design,可以使用link和check_design的返回值来让脚本继续执行还是终止;

  • check_design -html chech_design.html & sh firefox check_design.html

  • elaborate是在读源文件时唯一修改module参数的方式:

    analyze 分析HDL源程序并将一些中间文件保存在WORK

    elaborate $my_top -parameters “A_WIDTH=8,B_WIDTH=16”
    将产生的中间文件生成verilog模块或VHDL的实体(缺省情况下elaborate读取WORK下的文件)

  • 在解决模块调用IP时,将IP/Macro-cell library 加入link_library即可。target_library一般只包含一个库文件。

  • ddc文件通过write -format ddc -output file_name.ddc生成,ddc文件可以通过read_ddc {decode.ddc encode.ddc}读取,对大小写敏感,在写ddc时,可以指定-hier来保存整个设计的hierarchy,没有该项,只写出部分(如果没有指定输出对应设计的ddc文件,那么默认输出当前设计的ddc)

  • ddc文件是translate 的到的:rtl -> unmapped ddc。在compile之前保存ddc文件,以备下次使用,而不需要重新translate,当然rtl修改后需要重新translate。注意:在约束前产生的ddc和约束后产生的ddc不一样

  • 在compile后,根据需要也可以输出map之后的ddc文件,该文件包含netlist、constraints和attributes,该ddc文件可以高效的被dc重新读取或者被icc读取。

  • link查找顺序:DC memory ->link_library -> CWD ->默认的search_path ->额外的search_path

  • “layout“ vs “abstract”:后者只包含P&R所需要的的最小数据

  • Technology File(.tf文件):描述金属和via层的参数

  • check_library:逻辑库和物理库的一致性检查

  • check_tlu_plus_file:检查TLUPlus和.tf的一致性

  • get_*命令返回current_design,DC memory,libraries中的对象,对象可以使用通配符,返回一个集合,或者返回空集合

  • all_*命令:all_inputs、all_outputs、all_clocks、all_registers、all_ideal_nets、all_fanin、all_fanout、all_connected、all_dont_touch、all_high_fanout返回对应集合。

  • add_to_collection # Add object(s) to a collection. Result is new collection

  • append_to_collection # Add object(s) to a collection. Modifies variable

  • compare_collections # Return 0 if two collections contain the same objects

  • copy_collection # Make a copy of a collection. Result is new collection

  • filter_collection # Filter a collection, resulting in new collection

  • foreach_in_collection # Iterate over a collection

  • index_collection # Extract object from collection. Result is new collection

  • remove_from_collection # Remove object(s) from a collection. Result is new collection

  • sizeof_collection # Get the number of objects in collection

  • sort_collection # Create a sorted copy of the collection

    =~ Matches pattern

    !~ Does not match pattern

  • list和collection是两个感念:

    list可以理解为字符串,用foreach来遍历,echo、llength

    collection可以理解为指针,用foreach_in_collection 来遍历,sizeof_collection、query_objects

  • 检查DC脚本命令:dcprocheck example.tcl

  • 启动dc_shell后运行脚本:dc_shell> source example.tcl

  • 在dc_shell>下查手册或者信息:man+command或者info+command

  • target_library:synthesis的map阶段需要的实际工艺库

  • link_library:链接库,用于连接模块,“*”表示内存中所有的库

  • link:读取完所要综合的模块之后,将读到的DCmemory中的模块连接起来(出现unresolved design reference的警告,需要重新读取模块)

  • logic optimization和mapping 均在compile时完成,可以使用特殊的优化方法:structural和flatten

  • set_dont_touch:在当前设计和库单元上设置单元格、网格、引用和设计的dont_touch属性,以防止在优化期间修改和替换这些对象

  • all_fanout:返回指定源扇出中的一组引脚、端口或者单元

  • set_wire_load_mode:连线负载模式,模块之间的。有三种情况:enclosed、top和segmented。设置线载模型用于计算电容

  • set_wire_load_model:模块内部连线模型

  • compile_seqmap_propagate_constants:默认值为true。控制编译命令是否尝试识别和删除常量寄存器,并且在整个过程中传播常量值。

  • 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为建立时间

  • uniquify :为设计中的每一个模块产生一个名字唯一的拷贝,可根据每个模块本身特有的环境做优化和映射。

  • 用group创建层次,ungroup解除层次关系:

    dc_shell>group -design_name NEW_DES -cell_name u23 {u2 u3}
    dc_shell>current_design NEW_DES
    dc_shell>ungroup {u2 u3}

  • 设置面积约束: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:将施加的约束和属性写出到一个文件内

  • 列出命令的开关选项: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 红色部分必须指定,没有端口或者管脚

  • 过滤器:

    filter_collection [get_cells *] “ref_name == AN2”
    filter_collection [get_cells *] “is_mapped == true”

    get_cells -filter “@dont_touch == true”

  • 中断编译:ctrl+D

  • file操作:

    • rootname:返回“.”之前的字符串,无点则直接返回整个字符串
    • extension:返回最后一个“.”之后(包括点)的字符串,没有点,那么返回空字串
    • isdirectory: 文件是目录则返回1,否则返回0
    • isfile:是文件本身,返回1,否则返回0
  • 为了保证结构的完整性,需要添加工作路劲:define_design_lib WORK -path ./work

原创粉丝点击