SDC语法学习

SDC语法学习

前言

参考
《综合与时序分析的设计约束》进行学习,主要针对一些经典语法的使用,适合与新手入门,如有错误请及时指正,本人白天上班晚上更新,可能更新的比较慢,也针对工作中遇到的问题进行重点学习

一、通过Tcl扩展SDC

1.Tcl基础知识

1.1 Tcl具有多种语言结构:

  • 变量
  • 列表
  • 表达式与运算符
  • 控制流语句
  • 过程

1.2 Tcl变量:

Tcl变量是ASCII字符串,变量使用set命令来分配

set abc "1234" 	;#set是命令,abc是变量,1234是分配给变量的值`

如果对变量求值,则需使用$符号

puts $abc	;#将会打印1234

如果索引与变量名一起使用,则可将变成视为数组,索引可以为字符串

set def(1) 4567	;#这里def是数组变量,索引被设为1
set def(test) 5678	;#这里索引是test
puts $def(1)
puts $def(test)

打印特殊符号

puts "I have a \$bill"
puts {I have a $bill}

如果尝试利用另一个命令设置变量

set x [set y 100]	;#将x的值设置为100
set x {[set y 100]}	;#将x的值设置为[set y 100]

1.3 Tcl列表:

Tcl中的列表是对象的集合

#以下创建列表
set gates [list AND OR NOT NAND NOR]
set gates [{AND} {OR} {NOT} {NAND} {NOR}]
set gates [split "AND.OR.NOT.NAND.NOR" "."]

#要将另一个项目添加到列表中,使用lappend
set gates [lappend gates XOR]

#要在列表中搜索,使用lsearch
#返回2,他是列表中的索引
puts [lesarch $gates NOT];

#返回-1,疑问没找到
puts [lesarch $gates XNOT];

1.4 Tcl表达式与运算符:

Tcl中使用expr命令来对表达式求值

set x 10;
#两条返回语句均为30
expr $x + 20
expr {$x + 20}

在这里插入图片描述

1.5 Tcl的控制流语句:

Tcl控制流语句由以下种类的结构组成:

  • 列表遍历
  • 决策
  • 循环
  • 子程序

1.5.1 列表遍历

为了遍历列表,Tcl提供了foreach结构

set gates [list AND OR NOT NAND NOR XOR]
set index 1
foreach element $gates{
	puts "Gate $index in the list is $element"
	incr index	;#index 自动加1
}
#产生输出如下:
Gate 1 in the list is AND
Gate 2 in the list is OR
Gate 3 in the list is NOT
Gate 4 in the list is NAND
Gate 5 in the list is NOR
Gate 6 in the list is XOR

Tcl的foreach为用户提供了同时遍历多个列表的独特功能

set allgates{}
foreach gatelist1{AND OR XOR} gatelist2{AND OR XOR}{
lappend allgates $gatelist2 $gatelist1
}
put $allgates
#将在变量allgates中存储以下值“NAND AND NOR OR XNOR XOR”

1.5.2 决策

Tcl提供if-elseif-else结构来提供决策能力:

if{$frequency<300}{
puts "Chip will function well,but slower than expected"
}elseif{$frequency>300}{
puts "Chip will not function"
}else{puts "Chip will function optimally"}

1.5.3 Tcl循环

for<初值><条件><下一步>{
<语句体>
}
while<条件>{
<语句体>
}

1.5.4 Tcl过程

Tcl过程使用proc来编写,使用return语句从过程中返回值:

proc sum{addend1 addend2}{
ser value[expr {$addend1 + $addend2}]
return $value
}
#调用过程
set x[sum 5 10]
puts $x ;#打印15

1.5.5 其他命令

在这里插入图片描述

总结:
本章主要介绍了Tcl一些基础知识,用于构建工程的框架,在大规模芯片设计中,通常是以模块为单位进行时序约束, 但最终全芯片综合时需要剔除一些约束,或者变更pins和ports的路径,这时就需要通过传递参数实现, 后面将进行约束语法进行说明

2. SDC综合

SDC格式的约束可以大致分为以下几种

  • 时序约束
  • 面积与功率约束
  • 设计规则约束
  • 接口约束
  • 特定模式和配置约束
  • 设计要求的异常
  • 其他命令

2.1 时序约束:

在这里插入图片描述

2.2 面积与功率约束:

在这里插入图片描述

2.3 设计规则约束:

在这里插入图片描述

2.4 接口约束:

在这里插入图片描述

2.5 特定模式和配置约束:

在这里插入图片描述

2.6 设计要求的异常:

在这里插入图片描述

2.7 其他命令:

在这里插入图片描述

2.8 查询:

在这里插入图片描述
在这里插入图片描述
查询指令是在静态时序分析过程中查询的重要指令,学会在pt里寻找相应的pin脚和起始路径,有助提升问题分析速度和精确度。
本人在曾在项目遇到sdf返标时序时出现问题,经大佬指点,利用pt工具很快就完成了错误定位。

总结
本章主要介绍了SDC所有约束,因为本人做过得项目只需要进行时序约束,后面将会主要针对时序约束进行学习,如果有其他时间也会对其他约束进行学习。

3. 常用SDC时序约束

本章将会开始学习时序约束语法,基础的知识这里不做为学习内容,只针对如何编写时序约束和其效果进行学习

3.1 creat_clock:

含义:在设计中具体说明时钟信号

creat_clock	-period	period_value
			[source_objects]
			[-name	clock_name]
			[-waveform edge_list]
			[-add]
			[-comment comment_srting]

-period :定义时钟周期,默认时间ns,时钟周期必须大于0;
-name:给时钟信号命名;
-waveform :占空比;
-add:在时钟源指定多个时钟;
-comment:添加注释,不影响综合和时序。

示例:
(1)标识时钟源

creat_clock	-period	10 [get_ports A]
creat_clock	-period	10 [get_nets N]
creat_clock	-period	10 [get_pins FF/P]

在这里插入图片描述
(2)指定占空比

creat_clock	-period	 10 -name CKL -waveform {5 10} [get_ports A] ;#如果不指定,默认50%

在这里插入图片描述
(3)同源多时钟

creat_clock	-name C1 -period	10 [get_ports CLK]
creat_clock	-name C2 -period	10 [get_ports CLK] -add

通常设计都会按照最快的时钟频率去约,约束最严格
在这里插入图片描述

3.2 creat_generated_clock:

含义:设定生成时钟

creat_generated_clock	[source_objects]
						-source clock_source_pin
						[-master_clock master_clock_name]
						[-name generated_clock_name]
						[-edges edge_list]
						[-divide_by factor]
						[-multiply_by factor]
						[-invert]
						[-edge_shift shift_list]
						[-duty_cycle percent]
						[-combinational]
						[-add]
						[-comment comment_string]

-source :设定生成时钟的源;
-master_clock
-name:时钟命名;
-edges:对应源时钟边沿的整数列表;
-divide_by:生成时钟通过某个因子分频
-multiply_by:生成时钟通过某个因子倍频
-invert:反向
-edge_shift:在时间单元内每一个时钟沿的位移
-duty_cycle:占空比
-combinational:是能组合电路路径
-add:在某一点可定义多个时钟

案例:
(1)生成倍频和分频时钟

create_clock -priod 10 -name CLK [get_ports CLK]
creat_generated_clock	-name LSB -source [get_ports CLK]
-divide_by 2 [gen_pins FF1/Q]
creat_generated_clock	-name MSB-source [get_pins FF1/Q]
-divide_by 2 [gen_pins FF2/Q]

在这里插入图片描述
(2)反向时钟

create_clock -priod 10 -name CLK [get_ports CLK]
creat_generated_clock	-name GCLK -source [get_ports CLK]
-divide_by 2 [gen_pins FF1/Q]
creat_generated_clock	-name GCLK2	-source [get_ports CLK]
-divide_by 2 [gen_pins FF1/QBAR]

在这里插入图片描述
(3)多个时钟源:

create_clock -priod 10 -name C1 [get_ports CLK]
create_clock -priod 10 -name C2 [get_ports CLK] -add
#基于C1特性的生成时钟
creat_generated_clock	-name CG1 -divide_by 3-source [get_port CLK]
-master_clock C1 [gen_pins FF2/Q]
#基于C2特性的生成时钟
creat_generated_clock	-name CG2 -divide_by 3-source [get_port CLK]
-master_clock C2 [gen_pins FF2/Q] -add

在这里插入图片描述
(4)使能组合电路路径:

creat_generated_clock	-name CLKOUT	-combinational -source [get_pins FF1/Q[get_ports CLKOUT]

在这里插入图片描述

3.3 set_clock_group:

含义:忽略任何异步或者互斥时钟之间的时序路径或串扰分析

set_clock_groups	[-name group_name]
					[-group	clock_list]
					[-logically_exclusive]
					[-physically_exclusive]
					[-asynchronous]
					[-allow_paths]
					[-comment comment_string]

-name:提供时钟组唯一的名称
-group:将这些时钟分入各组
-logically_exclusive:对互斥耦合关系时钟使用
-physically_exclusive:时钟并不共存
-asynchronous:时钟彼此不能共享相位关系
allow_paths:希望执行串扰分析而不禁用时钟之间的时序电路路径

(1)设置时钟组

create_clock -priod 10 -name C1 -wavefrom {0 5}[get_ports C1]
create_clock -priod 20 -name C2 -wavefrom {0 12}[get_ports C2]

creat_generated_clock	-name	GC1 -source [get_ports C1]	[get_pins mux1/A] -combinational
creat_generated_clock	-name	GC2 -source [get_ports C2]	[get_pins mux1/B] -combinational

set_clock_groups -logically_exclusive -group GC1 -group GC2

在这里插入图片描述
(2)异步时钟

set_clock_groups -asynchronous	-group	[get_clocks {clk1 clk2 clk3}] -group [get_clocks {clk4 clk5 clk6}]

1.clk1 异步于clk4、clk5、clk6
2.clk2 异步于clk4、clk5、clk6
3.clk3 异步于clk4、clk5、clk6
4.clk1、clk2、clk3之间没有假设关系
5.clk4、clk5、clk6之间没有假设关系

小结:本人在项目中只用过group指令,详细介绍请看书

3.4 其他时钟特性

3.4.1 set_clock_transition

含义:时钟的过渡

set_clock_transition	[-rise]
						[-fall]
						[-max]
						[-min]
						clock_list
						transition_time

-rise:提供时钟上升沿的过渡时间;
-fall:提供下降沿的过渡时间;
-max/-min:设定过渡时间的最大和最小操作条件

set_clock_transition	-fall -rise 0.2	[get_clocks C1]
set_clock_transition	-fall -min 0.2 	[get_clocks C2]
set_clock_transition	-fall -max 0.4 	[get_clocks C2]
set_clock_transition	0.3 [all_clocks]

在这里插入图片描述

3.4.2 set_clock_uncertainty

含义:将时钟偏斜和抖动模型化

set_clock_uncertainty	[-form	|	-rise_from	|	-fall_from 	from_clock]
						[-to	|	-rise_to	|	-fall_to	to_clock]
						[-setup]
						[-hold]
						[-rise]
						[-fall]
						[object_list]
						Uncertaunty_value

3.4.3 set_clock_latency

含义:时钟延迟

set_clock_latency	[-rise]
					[-fall]
					[-min]
					[-max]
					[-source]
					[-late]
					[-early]
					[-clock clock_list]
					delay
					object_list

3.4.4 set_clock_sense

含义:制定路径传递的敏感性

set_clock_sense		[-positive	|	-negative	|	-stop_propagation]
					[-pulse	pulse]
					[-min]
					[-clock	clock_list]
					pin_list

3.4.5 set_ideal_network

含义:定义理想器件

set_ideal_network	[-no_propagate]
					object_list

小结:
本章仅仅介绍了一写语法,因为项目中暂时没遇到过,需要的同学请自行查阅资料,后续如果在项目中遇到将进行补充

4 端口延迟

4.1 set_input_delay

含义:输入端口延迟

set_input_delay	[-clock clock_name]
				[-clock_fall]
				[-level_sensitive]
				[-rise]
				[-fall]
				[-max]
				[-min]
				[-add_delay]
				[-network_latency_included]
				[-source_latency_included]
				delay_value 
				port_pin_list

-clock:指定参考时钟
-clock_fall:默认上升沿,如果使用下降沿用此指令
-level_sensitive:如果器件是个锁存器,不是寄存器用此函数
-rise:限定输入延迟与输入端口信号的上升沿对应
-fall:限定输入延迟与输入端口信号的下降沿对应
-max:用于限定指定的延迟值与输入端口信号的最迟到达时间对应
-min:用于限定指定的延迟值与输入端口信号的最早到达时间对应
-add_delay:表示额外的约束,不会覆盖前一个约束
-network_latency_included:网络延迟开关
-source_latency_included:时钟源延迟开关
delay_value:延迟值
port_pin_list:延迟端口

4.2 set_output_delay

含义:输出端口延迟

set_output_delay	[-clock clock_name]
					[-clock_fall]
					[-level_sensitive]
					[-rise]
					[-fall]
					[-max]
					[-min]
					[-add_delay]
					[-network_latency_included]
					[-source_latency_included]
					delay_value 
					port_pin_list

-clock:指定参考时钟
-clock_fall:默认上升沿,如果使用下降沿用此指令
-level_sensitive:如果器件是个锁存器,不是寄存器用此函数
-rise:限定输出延迟与输出端口信号的上升沿对应
-fall:限定输出延迟与输出端口信号的下降沿对应
-max:用于限定指定的延迟值与输出端口信号的最迟到达时间对应
-min:用于限定指定的延迟值与输出端口信号的最早到达时间对应
-add_delay:表示额外的约束,不会覆盖前一个约束
-network_latency_included:网络延迟开关
-source_latency_included:时钟源延迟开关
delay_value:延迟值
port_pin_list:延迟端口

本节语法较少,但涉及扩展内容较多,建议直接看书第九章。

5 完整的端口约束

本章简单介绍一些驱动和负载语法,作者暂时没有在工作中遇到过

set_drive;#指定驱动器等效电阻
set_driving_cell;#指定驱动单元
set_input_transition;#直接指定过渡时间
set_fanout_load;#扇出负载
set_load;#负载
set_port_fanout_number;#扇出数

6 虚假路径

  • 6
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值