1、Backend Study Notes DC综合学习笔记 - 1 - 一、verilog 编写 - 1 - 二、DC综合注意地方 - 2 - 1.在同一种电路中不能同步具有触发器和锁存器两种电路单元。 - 2 - 2.在电路中不能出既有反馈组合逻辑。 - 2 - 3.不能浮现用一种触发器输出作为另一种触发器时钟。 - 2 - 4.异步逻辑和模仿电路要单独解决。 - 2 - 5.使用单元电路没有映射到工艺库中。 - 2 - 三、DC综合名词解释及脚本 - 2 - 1.名词解释 - 2 - 2.环境脚本阐明 - 2 - 3.约束脚本阐明 - 2 - 4.查看报告命令 -
2、3 - 某些综合经验 - 4 - 附录 - 4 - 1.DC启动脚本 - 4 - 2.组合电路优化脚本 - 5 - 3.时序电路优化脚本 - 5 - PT STA学习笔记 - 6 - 一、某些注意地方 - 6 - 二、惯用脚本 - 7 - 附录 - 8 - 时序分析范例 - 8 - 分析脚本(worst) - 8 - 分析脚本(best) - 9 - Formality学习笔记 - 9 - 脚本范例 - 9 - Encounter学习比较 - 10 - 一、理论 - 10 - 1、布图 - 10 - 1.1、I/O单元 - 10 - 1.2、层次化设计 -
3、 10 - 2、布局 - 10 - 2.1、电源规划 - 10 - 2.2、原则单元和模块放置 - 12 - 3、CTS - 12 - 4、布线 - 12 - 二、脚本运用 - 13 - 三、需要抽取和保存文献 - 14 - ICC学习笔记 - 15 - 一、ICC基本流程 - 15 - 二、文献准备 - 15 - 三、脚本运用 - 16 - 附录:脚本范例 - 16 - 启动脚本范例 - 16 - Floorplan脚本范例 - 17 - 无PAD脚本 - 17 - 有PAD脚本 - 17 - Placement脚本范例 - 18 - CTS脚本范例 -
4、18 - Route脚本范例 - 19 - 文献导出范例 - 19 - ECO脚本范例 - 19 - VCS学习笔记 - 21 - DFT学习笔记 - 21 - Tcl语言学习笔记 - 21 -4 Perl语言学习笔记 - 22 - 时序学习笔记 - 22 - 1、基本概念 - 22 - 2、ON-Chip Variations(OCV) - 29 - 3、时间借用(Time Borrowing or cycle stealing) - 30 - 4、Data to Data Check - 31 - 其她学习笔记 - 33 - 一、低功耗学习笔记 - 33 -
5、1.Clock Gate - 33 - 二、信号完整性分析 - 33 - 名词解释 - 34 - 后端工程师具备能力 - 35 - 附录 - 35 - DC综合学习笔记 一、verilog 编写 在使用if语句时候,一定得把条件写全,否则会综合出锁存器。一种if语句只能跟一种表达式。如果一种电路中浮现两种时序电路构造(锁存器和触发器),会增长电路测试难度。If语句相应是选取器。If语句隐含这优先级别,这和case语句不同。 Case和If语句同样,都是用于选取输出,但是case 语句隐含是平行电路构造。当case语句条件没有完全译码时,会引起具备优先级电路构造。
6、在使用always语句描述组合电路时,在该语句中读入所有变量都需要出当前事件列表中,否则也许会得不到盼望成果。(//synopsys full_case parallel_case,如果case语句不写全可以加这个key word) 在使用always语句描述时序电路时候,都会引用触发器,使用”<=”来对变量赋值,这种赋值叫做非阻塞赋值(相称是顺序语句,得前一句赋值完后才执行下一句,如果是触发器话,向后延时一种时钟周期)。 在verilog语言中,一种reg类型数据是被解释成无符号数,integer类型数据是被解释成二进制补码有符号数,并且最右边是有符号数最低位。 key word --
7、 //synopsys //synopsys async_set_reset "reset" e.g.:module SP2 ( reset,SP2IB1,IB12SP,SPen, SP2IB1en ) ; input SPen,SP2IB1en ,reset; input [2:0] IB12SP ; output [2:0] SP2IB1; reg [2:0] sp; //synopsys async_set_reset "reset" //加这句阐明和不加这句阐明综合成果是不同样,最佳是加上这样一句 always @(SPen or IB12SP or reset)
8、 begin if (reset) sp = 07; else if (SPen) sp = IB12SP; end assign SP2IB1 = (SP2IB1en ?sp :'bz); endmodule 二、DC综合注意地方 1.在同一种电路中不能同步具有触发器和锁存器两种电路单元。 2.在电路中不能出既有反馈组合逻辑。 3.不能浮现用一种触发器输出作为另一种触发器时钟。 4.异步逻辑和模仿电路要单独解决。 5.使用单元电路没有映射到工艺库中。 三、DC综合名词解释及脚本 1.名词解释 link_library设立单元或模块引用。前面必要包括’*’,表达
9、DC在引用实例化模块时一方面搜索已经调进DC memory模块。link_library {“*” slow.db} target_library为最后要映射库。 synthetic_library 库在初始化DC时候,不需要设立原则Design Ware库standard.sldb用于实现Verilog 描述运算符,对于扩展Design Ware,需要在synthetic_library中设立,同步需要在link_library 中设立相应库以使得在链接时候DC可以搜索到相应运算符实现。 途径划分:DC综合及优化都是基于途径,途径划分为:途径起点为输入端或者触发器时钟端;途径终点为输出
10、端或触发器数据端。 2.环境脚本阐明 set_operating_conditions [-min min_condition] [-max max-condition] [-min_library min_lib] [-max max_lib] 指定DC优化时使用工作坏境,其中工作坏境指定必要在库中指定,或者在link_library中其中一种库中指定,如果不指定工作坏境,DC会自动搜索link_library中第一种库工作坏境最为优化是所使用工作坏境。使用get_attribute libname default_operating_conditions来看工作坏境。 -max 选项
11、用于指定电路最大延迟分析(分析电路与否满足触发器建立时间setup time规定)工作环境 -min 选项用于指定电路最小延迟分析(分析电路与否满足触发器保持时间hold time规定)工作环境,该选项不能单独使用,必要与-max同步使用。 如果不指定用于分析最小延迟库,则只使用-max中指定库用于电路延迟分析。 -min_library 选项指定用于电路最大延迟分析工艺库。 -max_library 选项指定用于电路最小延迟分析工艺库。 e.g. set_operating_conditions –max typical_1v2c25 set_wire_load_model
12、 -name smic13_wl20 set_wire_load_mode top (这个是设立模块之间线负载,在编译后可用) set_drive 默认值为0表达驱动能力无限大(表达电阻值) set_drive 0 {clk,rest} set_driving_cell 用一种详细电路来模仿输入延时 set_driving_cell –lib_cell BUFX2 {a,b} 在电路优化阶段,输入端口驱动能力用于计算输入端口到门电路延迟,普通来说,输入端口驱动能力可以按照如下公式影响延迟: Time = arrive_time + drive*net_load +c
13、onnect_delay set_driving_cell -lib_cell BUFX2 -library typical_1v2c25 [all_inputs] 所有输入端口 (portload = 2.5 + 3 * load_of(tech_lib/IV/A) set_load port_load all_outputs())一起用命令 3.约束脚本阐明 set_max_capacitance 用于设立输出单元容许最大电容负载 set_max_capacitance 2.0 test –设立设计test最大电容负载是2.0 set_max_capac
14、itance 2.0 a --设立端口a最大电容负载是2.0 set_max_transition 是指电压从10%VDD上升到90%VDD所需要时间(或下降),这个值长表达电路速度慢。用法同上。 set_max_fanout 语法同上。 (create_clock –period 1 –name clk [get_ports clk] –wareform {0 0.5} 周期为1ns方波。set_clock_uncertainty 0.3 [get_clocks clk](时钟偏移)) set_dont_touch_network {rest,clk,clr} 不对其端口
15、综合。 set_dont_touch 不进行优化模块、端口。可以用set_dont_touch [] false 来取消前面设立。 set_input_delay 2.3 {a b} (组合电路) set_input_delay 2.3 –clock [get_clocks clk] [all_inputs] (时序电路) set_output_delay 语法同上。 set_max_area 0 (set_max_delay 5 -from a set_min_delay 2 –from a)用于完全组合电路。 set_dont_use {typical_1v2
16、c25/I*}表达不调用以I开头cell。 create_clock –name clk –period 2 这是设立虚拟时钟用于组合电路。 dcprocheck run.tcl 检查synopsys tcl 脚本命令。 set_load [expr [load_of my_lib/inv1a0/A] * 3] [get_ports out1] 输出端口out1并列驱动三个invA set_driving_cell -lib_cell BUFX2 –pin Y [get_ports out1] 如果没有说pin则默以为cell输出pin report_timing –del
17、ay max|min max看setup;min看hold 4.查看报告命令 report_cell 查看用了那些cell。 report_power –net 查看每个cell用功耗 report_net 查看cellfanout、fanin、capacitance、resistance. set verilogout_show_unconnected_pins true 设立在.synopsys_dc.setup里面,重要是为了输入编译后verilogcell没有用到pin。 report_port 返回所有加在输入输出端口约束条件。 re
18、set_design 删除当前所有属性和约束。 remove_input_delay 删除input_delay设定延时。 remove_design 删除当前设计. report_path_group 报告当前设计中个途径组信息。 group_path –name combo –from [all_inputs] –to [all_outputs] 设定一种核心途径。 set_critical_range 2 [current_design] 这样设立将会使相对于核心途径2ns 范畴内途径群都进行优化。 group_path –name clk1 –critical_ran
19、ge 0.3对于途径组核心范畴可以使用参数来指定。 set_dont_use {typical/*} 表达不用typical这个库。 某些综合经验 set_clock_uncertainy –setup 0.5 –hold 0.25 [get_clocks CLK] 在布图前和后阶段都指定一定余量,这样可使芯片少受制造工艺偏差影响。 set_max_delay 5 –from [all_inputs] –to [all_outputs] 重要用在组合电路上 set_generated_clock –name ckl1 –source CLK –divide_by 2 生成源
20、CLK时钟2分频 只有当通过编译达不到目的时,才使用compile –map_effort high。 时钟树综合除了使用set_dont_touch_networt外还可有先用report_net查看高扇出线网再使用balance_buffer命令点对点对其进行缓冲,或者用compile-in_place进行原地优化(IPO),并将compile_ok_to_buffer_during_inplace_ opt 开关设为false. report_transitive_fanout –clock_tree(-from reset) 检查无意识时钟门控(复位) read_sdf
21、 *.sdf 读入延迟文献 read_parasitics *.pef 读入RC文献(spf) 使用disconnect_net create_cell connect_net 迫使DC在恰当位置插入cell。 在布图后将不用设立set_wire_load_model和set_wire_load_mode 用实际延迟和电容电阻代替了;也不用设立set_clock_latancy和set_clock_transition用品体时钟树代替(使用set_propagated_clock [get_clocks CLK]) report_timing –from [all_input
22、] –to [all_registers –data_pins] 如果综合完发现不能使用write命令来写verilog而浮现assign报错提示则可以使用: set_fix_multiple_port_nets –all 来解决这个问题。 附录 1.DC启动脚本 ##################################################### ## dc setup file ## ##########################################
23、 set search_path [list ../core ./verlog ./script] set link_library { * typical_1v2c25.db } set target_library { typical_1v2c25.db } set symbol_library "your_library.sdb" set synthetic_library "" read_file -format verilog ./verilog/cnt10.v current_design cnt10 s
24、et verilogout_show_unconnected_pins true alias rp "report_power" alias rt "report_timing" alias ra "report_area" alias rc "report_constraint -all_violators" alias h "history" 2.组合电路优化脚本 link set_operating_conditions typical_1v2c25 set_wire_load_model -name smic13_wl10 set_wire_l
25、oad_mode top set_drive_cell -lib_cell BUFX2 [all_inputs] set_max_capacitance 2.0 test set_max_capacitance 18 test set_max_fanout 15 test set_input_delay 2.0 [all_inputs] set_output_delay 1.5 [all_outputs] set_max_area 0 set_max_delay 2.0 -from a set_max_delay 1.0 -from a set_load 1 {s,co} #s
26、et_drive 0 reset uniquify compile rp >> ./reports/power.rpt ra >> ./reports/area.rpt rt >> ./reports/timing.rpt rc >> ./reports/constraint.rpt write -format verilog -hierarchy -output ./outputs/adder.v write -format ddc -hierarchy -o ./outputs/adder.ddc write_sdf ./outputs/adder.sdf write_sdc ./o
27、utputs/adder.sdc 3.时序电路优化脚本 link create_clock clk -period 5 -waveform {0 2.5} set_dont_touch_network [get_clocks clk] set_fix_hold [get_clocks clk] set_clock_uncertainly 0.2 [get_clocks clk] set_clock_latency -source 0 [get_clocks clk] se
28、t_clock_latency 1 [get_clocks clk] set_input_transition 0.3 [all_inputs] #if you want dont a fix value,use set_driving_cell set_clock_transition 0.3 [all_clocks] set_operating_conditions -min_library fast_1v32c0 -min fast_1v32c0 -max_library slow_1v08c125
29、max slow_1v08c125 set_wire_load_model -name smic13_wl10 -library slow set_wire_load_mode top set_wire_load "reference_area_1000000"-library "smic13" set_drive [drive_of "slow_1v08c125/BUFX2/Y"] [get_ports clk] set_drive [drive_of "slow_1v08c125/DFFX1/Q"] [remove_from_collection [all_inputs]
30、 [get_ports clk]] set_load [load_of "slow_1v08c125/DFFX1/D"] [all_outputs] set_input_delay -max 1 -clock clk [all_inputs] set_input_delay -min 0.2 -clock clk [all_inputs] set_output_delay -max 1 -clock clk [all_outputs] set_output_delay -min 0.1 -clock clk [all_outpu
31、ts] #set_drive 0 { reset,clk } set_max_area 0 set_max_fanout 2 [all_inputs] set_max_transition 0.3 [all_inputs] uniquify compile -boundary_optimization rp >> ./report/power.rpt ra >> ./report/area.rpt rt >> ./report/timing.rpt rc >> ./report/constraint.rpt write -forma
32、t verilog -hierarchy -output ./outputs/.v write -format ddc -hierarchy -o ./outputs/.ddc write_sdf ./outputs/.sdf write_sdc ./outputs/.sdc PT STA学习笔记 一、某些注意地方 report_transitive_fanout –clock_tree 报告出”unknown”clock network也许计算出错误延迟,report_reference 查看cell属性也可看使用了多少register。当浮现这样问题咱们可以使用Stamp模型
33、来解决或者使用virtual clock旁通clkbuf (create_clock –name VCLK –p 2 –w {0 1} find(pin,U49/NQ) set_clock_latancy 0.2 –source VCLK set_ideal_net find(net,VCLK))。 在时序分析中,经常会检查setup/hold、removal/recovery和min pulse width。然而有些会是untested。这使用report_analysis_coverage –status_details {untested} –sort_by slack –che
34、ck_type {setup|hold}去查看。报告成果也许会浮现”no_clock”,找到因素。普通是时钟没有到达,或者case_analysis分析;上面修复后会有一某些hold也修复了这是由于registerclk没有clock。然后尚有一某些hold是untested也许会是对input/output没有min_delay约束。报告成果也许会浮现”no_paths”,这意味着endpoints没有约束。这也许是设立了set_false_path或者set_multicycle_path因素先使用report_timing查看。 二、惯用脚本 report_analysis
35、converage 查看设计所有setup.hold等状况比例
swap_cell
36、lock_latency 2.5 -source -early [get_clocks CLK] set_clock_latency 3.5 -source -late [get_clocks CLK] 这个指令只能是source clock set_min_pulse_width -high 1.5 [all_clocks] set_min_pulse_width -low 1.0 [all_clocks] report_min_pulse_width 这个重要是在有时钟门控时候 set_clock_gating_check -setup 0.5 -hold 0.4 [g
37、et_clocks CLK] report_clock_gating_check set_disable_clock_gating_check to disable specific clock gating checks in a design report_exceptions –ignored check_timing 当设立了时序例外后咱们检查是不是有用了用 set_case_analysis 0(or edge(rising)) [get_ports sel] 普通用于选取器 report_case_analysis remove_case_analys
38、is [get_ports sel] report_delay_calculation –from U1/A –to U1/Z 用于计算cell或net时序弧 当使用read_sdf 读入延迟文献时报没有某端口时序弧错时使用read_sdf –path 和 read_sdf –strip_path检查,以及report_annotated_delay –list_not_annotated查看。 drive_clocks 检查所有clock类型,像gated clock、internal generated clock和muxed clocks。然后用report_clock。
39、附录 时序分析范例 pt_shell> report_timing -path full_clock Point Incr Path ----------------------------------------------------- clock clk (rise edge) 0.00 0.00 clock source latency 0.00 0.00 clk(in) 0.00
40、 0.00 S_2/Z (BUF2) 0.40 * 0.40 f A_reg[1]/CP (FD1) 0.02 * 0.42 A_reg[1]/Q (FD1) 0.12 * 0.54 f result_reg[0]/D (FD1) 0.00 1.96 r data arrival time 1.96 clock clk (rise edge) 4.00
41、 4.00 clk (in) 0.00 0.00 r S_1/Z (BUF1) 1.06 * 5.06 r result_reg[0]/CP (FD1) 0.01 * 5.07 r library setup time -0.80 * 4.27 data required time 4.27 从红色标记看出clock skew(uncertainy) 是 1.07-0.42 分
42、析脚本(worst) read_verilog ./verilog/pr_cnt10.v current_design cnt10.v set_operating_conditions slow_1v08c125 read_timing ./input_file/cnt10.sdf read_parasitic ./input_file/cnt10_w.spef create_clock clk -period 2 -waveform {0 1} set_dont_touch_network [get_clocks clk] set_dont_touch_
43、network [get_ports reset] set_propagated_clock [get_clocks clk] #if you want dont a fix value,use set_driving_cell set_drive [drive_of "slow_1v08c125/INVX1/Y"] [get_ports clk] set_drive [drive_of "slow_1v08c125/INVX1/Y"] [remove_from_collection [all_inputs] [get_ports clk]] set_l
44、oad [load_of "slow_1v08c125/INVX2/Y"] [all_outputs] set_input_transition 0.2 [all_inputs] set_input_delay -max 1.0 -clock clk [all_inputs] set_input_delay -min 0.2 -clock clk [all_inputs] set_output_delay -max 1.0 -clock clk [all_outputs] set_output_delay -mi
45、n 0.1 -clock clk [all_outputs] set_drive 0 { reset,clk } set_max_area 0 set_max_fanout 5 [all_inputs] set_max_transition 2 [all_inputs] report_constraint -all_violators 分析脚本(best) read_verilog ./verilog/pr_cnt10.v current_design cnt10.v set_operating_conditions fast
46、1v32c0 read_timing ./input_file/cnt10.sdf read_parasitic ./input_file/cnt10_b.spef create_clock clk -period 2 -waveform {0 1} set_dont_touch_network [get_clocks clk] set_dont_touch_network [get_ports reset] set_propagated_clock [get_clocks clk] #if you want dont a fix value,use s
47、et_driving_cell set_drive [drive_of "slow_1v08c125/INVX1/Y"] [get_ports clk] set_drive [drive_of "slow_1v08c125/INVX1/Y"] [remove_from_collection [all_inputs] [get_ports clk]] set_load [load_of "slow_1v08c125/INVX2/Y"] [all_outputs] set_input_transition 0.2 [all_input
48、s] set_input_delay -max 1.0 -clock clk [all_inputs] set_input_delay -min 0.2 -clock clk [all_inputs] set_output_delay -max 1.0 -clock clk [all_outputs] set_output_delay -min 0.1 -clock clk [all_outputs] set_drive 0 { reset,clk } set_max_area 0 se
49、t_max_fanout 5 [all_inputs] set_max_transition 2 [all_inputs] report_constraint -all_violators Formality学习笔记 脚本范例 set search_path "./core ./rtl ./netlist" set_svf default.svf read_verilog -r "cnt10.v" set_top cnt10 read_db -i fast_1v32c0.db read_verilog -i pr_cnt10.v s
50、et_top cnt10 match verify Encounter学习比较 一、理论 1、布图 1.1、I/O单元 I/O单元重要是保证信号从芯片内部传递到外部时其途径最短,同步规定从I/O单元核心引线到封装点时,避免信号交叉,以便封装基板制作,减少基板上走线层数。当芯片输入输出单元较多而内部逻辑单元较少且普通为I/O单元限制型设计时,则普通选用狭窄I/O单元;当芯片输入输出单元较少而内部逻辑单元较大时,则普通选用宽I/O单元。但设计子模块时,I/O单元形式为接点(pin)而不是接口(pad)。I/O单元分为信号接口和电源两种类型,信号I/O单元核心是选取驱动大小,而电源
©2010-2025 宁波自信网络信息技术有限公司 版权所有
客服电话:4009-655-100 投诉/维权电话:18658249818