相关阅读
静态时序分析https://blog.csdn.net/weixin_45791458/category_12567571.html?spm=1001.2014.3001.5482
目录
set_case_analysis命令用于对电路进行特定模式的设定,例如对于一个工作在正常模式下的芯片,其扫描触发器的测试引脚应该设定为0;对于一个时钟选择器的选择引脚,在特定模式工作时应该为确定值。这个命令很有用,因为它可以帮助减少很多不必要的时序路径分析。
set_case_analysis指令的BNF范式(有关BNF范式,可以参考以往文章)为:
set_case_analysis
value port_or_pin_list
//注:该命令的port_or_pin_list参数一定要放在value参数后
该命令可以指定端口或引脚处是恒定的1或0,或者端口或引脚处仅允许上升沿或下降沿。
指定值
参数value指定了端口或引脚处的确定值或转换方向。对于确定值,它可以是1、0、one或zero。对于转换方向,它可以是rising、falling、rise或fall。
指定端口/引脚列表
指定一个端口/引脚列表,包含端口对象或引脚对象,如果有多于一个对象,需要使用引号或大括号包围。
简单使用
首先我们可以解决静态时序分析:SDC约束命令create_clock详解一文中出现的时序路径混乱问题,原文的图7如本文图1所示,首先在输入端口clk_1和clk_2定义两个时钟。
create_clock -period 10 [get_port clk_1]
create_clock -period 15 [get_port clk_2]
图1 有两个时钟驱动的电路单元
对于上面的电路,本意是b_reg触发器和c_reg触发器同时受时钟clk_1或时钟clk_2之一触发,但如果不使用set_case_analysis命令,在使用report_timing命令后会出现时钟clk_2和时钟clk_1之间的时序分析报告,如图2、图3所示,我们真正需要的是图4的时序报告。
图2 发射时钟是clk_2,捕获时钟时clk_1
图3 发射时钟是clk_2,捕获时钟时clk_1
图4 发射时钟是clk_2,捕获时钟是clk_2
下面我们使用set_case_analysis命令,固定选择端sel的信号为0,时序分析结果如图5和图6所示。
set_case_analysis 0 [get_port sel]
图5 发射时钟和捕获时钟都是clk_2
图6 发射时钟和捕获时钟都是clk_2
下面我们使用set_case_analysis命令,固定选择端sel的信号为1,时序分析结果如图7和图8所示。
set_case_analysis 1 [get_port sel]
图7 发射时钟和捕获时钟都是clk_1
图8 发射时钟和捕获时钟都是clk_1
set_case_analysis命令还会导致设定的值沿着时序路径向后传播,从而打断某些时序路径(使这些路径不能出现信号翻转),例如对于图9所示的电路图。
图9 一个简单的例子
首先在输入端口clk定义一个时钟。
create_clock -period 10 [get_port clk]
此时如果直接使用report_timing命令,则t_reg和data_out_reg之间的时序路径会正常报告,如图10所示。
图9 两个触发器间的时序报告
现在我们使用set_case_analysis命令固定使能信号enable为0,这就使得与门U4的输出固定为0,无法翻转,因此t_reg和data_out_reg之间的时序路径被打断了,如图10所示。
图10 两个触发器间的时序路径被打断了
这就相当于编写Verilog代码时,直接将与门的一个输出引脚固定为0,这也会打断时序路径(假设电路没有被逻辑优化),如图11所示的电路图。
图11 编写代码时指定引脚值为0
在图11中,我们设法使得某些器件不被优化掉,并构造了一个奇怪的电路图。此时在逻辑上讲,与门的输出是一个固定值0,此时使用report_timing命令无法看到t_reg和data_out_reg之间的时序路径,如图12所示。
图12 两个触发器间的时序路径被打断了
但是我们再来看一下图13所示的电路图(假设电路没有被逻辑优化),可以看出与门U2的输出是一个固定值0,但是此时使用report_timing命令可以看到t_reg和data_out_reg之间的时序路径,如图14所示。这代表了,即使DC会考虑某些情况下电路的逻辑情况,但不是所有。
图13 与门U2的输出引脚值为0
图14 两个触发器间的时序报告
如果此时在编写Verilog代码时又将enable信号固定为1(假设电路没有被逻辑优化),则时序路径又会被打断,如图15所示。
图15 编写代码时指定引脚值为0
这代表着,如果在写Verilog时固定了某个电路中某个引脚或端口的信号值,则这个确定值也会沿着时序路径传播,并可能打断路径,但推荐使用set_case_analysis命令来完成这一目标。
最后要注意的是,确定值的传播会在到达时序路径终点而停止,并不会继续传播下去,比如图15中的data_out_reg到输出端口的时序路径并不会因为与门U2的输出为确定值0而被打断。