资源描述
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.查看报告命令 - 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、层次化设计 - 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脚本范例 - 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 -
1.Clock Gate - 33 -
二、信号完整性分析 - 33 -
名词解释 - 34 -
后端工程师具备能力 - 35 -
附录 - 35 -
DC综合学习笔记
一、verilog 编写
在使用if语句时候,一定得把条件写全,否则会综合出锁存器。一种if语句只能跟一种表达式。如果一种电路中浮现两种时序电路构造(锁存器和触发器),会增长电路测试难度。If语句相应是选取器。If语句隐含这优先级别,这和case语句不同。
Case和If语句同样,都是用于选取输出,但是case 语句隐含是平行电路构造。当case语句条件没有完全译码时,会引起具备优先级电路构造。
在使用always语句描述组合电路时,在该语句中读入所有变量都需要出当前事件列表中,否则也许会得不到盼望成果。(//synopsys full_case parallel_case,如果case语句不写全可以加这个key word)
在使用always语句描述时序电路时候,都会引用触发器,使用”<=”来对变量赋值,这种赋值叫做非阻塞赋值(相称是顺序语句,得前一句赋值完后才执行下一句,如果是触发器话,向后延时一种时钟周期)。
在verilog语言中,一种reg类型数据是被解释成无符号数,integer类型数据是被解释成二进制补码有符号数,并且最右边是有符号数最低位。
key word --- //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)
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设立单元或模块引用。前面必要包括’*’,表达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综合及优化都是基于途径,途径划分为:途径起点为输入端或者触发器时钟端;途径终点为输出端或触发器数据端。
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 选项用于指定电路最大延迟分析(分析电路与否满足触发器建立时间setup time规定)工作环境
-min 选项用于指定电路最小延迟分析(分析电路与否满足触发器保持时间hold time规定)工作环境,该选项不能单独使用,必要与-max同步使用。
如果不指定用于分析最小延迟库,则只使用-max中指定库用于电路延迟分析。
-min_library 选项指定用于电路最大延迟分析工艺库。
-max_library 选项指定用于电路最小延迟分析工艺库。
e.g. set_operating_conditions –max typical_1v2c25
set_wire_load_model -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 +connect_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_capacitance 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} 不对其端口综合。
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_1v2c25/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 –delay 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 返回所有加在输入输出端口约束条件。
reset_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_range 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 生成源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 *.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] –to [all_registers –data_pins]
如果综合完发现不能使用write命令来写verilog而浮现assign报错提示则可以使用:
set_fix_multiple_port_nets –all 来解决这个问题。
附录
1.DC启动脚本
#####################################################
## dc setup file ##
#####################################################
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
set 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_load_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}
#set_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 ./outputs/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]
set_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 -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] [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_outputs]
#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 -format 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模型来解决或者使用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 –check_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_converage 查看设计所有setup.hold等状况比例
swap_cell <cell list to be replaced> <new design> 用这个命令去用相似cell去代替,这个代替只是虚拟代替。如果设计符合规定了,还得手动去修改netlists。
set_disable_timing 禁止个别单元时序弧有用。
有些违例途径共享共同叶单元能力。这称为瓶颈分析且通过使用命令report_bottleneck来进行查看。
如果一种时钟延迟是3±0.5则指令为
create_clock -period 10 [get_ports CLK]
set_clock_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 [get_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_analysis [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。
附录
时序分析范例
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 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 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
分析脚本(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_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_load [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 -min 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_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 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_load [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 -min 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
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
set_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单元核心是选取驱动大小,而电源
展开阅读全文