十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

SDC命令详解:使用set_case_analysis命令进行约束

SDC命令详解:使用set_case_analysis命令进行约束 相关阅读SDC命令详解https://blog.csdn.net/weixin_45791458/category_12931432.html?spm1001.2014.3001.5482目录指定值指定端口、引脚列表/集合Multicorner-Multimode支持简单使用set_case_analysis命令用于对电路进行特定模式的设定例如对于一个工作在正常模式下的芯片其扫描触发器的测试引脚应该设定为0对于一个时钟选择器的选择引脚在特定模式工作时应该为确定值。这个命令很有用因为它可以帮助减少很多不必要的时序路径分析。本文针对Design Compiler但该命令同样存在于PrimeTime、IC Compiler等工具中它们大致相同略有差别。set_case_analysis命令的BNF范式有关BNF范式可以参考以往文章为set_case_analysis value port_or_pin_list //注该命令的port_or_pin_list参数一定要放在value参数后该命令可以指定端口或引脚处是恒定的1或0或者端口或引脚处仅允许上升沿或下降沿设置了端口或引脚对象的user_case_value属性如果想要移除模式分析使用remove_case_analysis命令。指定值参数value指定了端口或引脚处的固定值或转换方向。对于固定值它可以是1、0、one或zero。对于转换方向它可以是rising、falling、rise或fall。指定端口、引脚列表/集合指定一个端口、引脚列表/集合包含端口对象或引脚对象。对于列表而言如果有多于一个对象需要使用引号或大括号包围对使用集合无效关于列表和集合的区别可以参考下面的博客。SDC命令详解使用集合(Collection)而不是字符串(String)/列表(List)作为命令参数https://chenzhang.blog.csdn.net/article/details/147144571如果指定的对象是一个叶单元的引脚则该引脚所属的叶单元会被设置size only属性确保其不会在综合过程中被优化掉需要注意的是此时的size_only属性是隐式设置的这与使用set_size_only命令显式设置不同无法使用report_attribute命令或get_attribute命令直接查看也无法使用查询命令的-filter选项过滤而只能使用report_cell命令或report_size_only命令间接查看隐式size_only属性的优先级高于显式size_only属性使用list_size_only_types命令可以列出叶单元被设置size_only属性的原因显式或隐式。Multicorner-Multimode支持该命令仅对当前场景生效换句话说只能在当前场景进行特定模式的设定。关于场景的更多介绍可以参考下面的博客。Design Compiler多工艺角和多工作模式(Multicorner-Multimode, MCMM)https://blog.csdn.net/weixin_45791458/article/details/149578771?ops_request_misc%257B%2522request%255Fid%2522%253A%2522e3267dcc7cc26380435f53994dc8b9b8%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257Drequest_ide3267dcc7cc26380435f53994dc8b9b8biz_id0utm_mediumdistribute.pc_search_result.none-task-blog-2~blog~first_rank_ecpm_v1~rank_v31_ecpm-1-149578771-null-null.nonecaseutm_termMCMMspm1018.2226.3001.4450简单使用本文仅讨论固定值的模式分析这是多数情况下该命令的使用方式。首先我们可以解决SDC命令详解使用create_clock命令进行约束一文中出现的时序路径混乱问题原文的图7如本文图1所示首先在输入端口clk1和clk2定义两个时钟。create_clock -period 10 [get_ports clk1] create_clock -period 15 [get_ports clk2]图1 有两个时钟驱动的电路对于上面的电路本意是b_reg触发器和c_reg触发器同时受时钟clk1或时钟clk2之一触发但如果不使用set_case_analysis命令在使用report_timing命令后会出现时钟clk2和时钟clk1之间的时序分析报告如图2、图3所示我们真正需要的是图4的时序报告本文如不加说明默认时序报告为建立时间报告。图2 发射时钟是clk2捕获时钟时clk1图3 发射时钟是clk1捕获时钟时clk2图4 发射时钟是clk2捕获时钟是clk2下面我们使用set_case_analysis命令固定选择端sel的信号为0可以使用report_case_analysis命令查看指定的模式分析值如图5所示。还可以使用report_disable_timing命令查看此时失效的时序弧如图6所示可以看到此时选择引脚S0到输出引脚Y的时序弧和输出引脚B到输出引脚Y的时序弧都失效了。此时的时序分析结果如图7和图8所示。dcnxt_shell set_case_analysis 0 [get_ports sel]图5 模式分析报告图6 失效时序弧报告图7 发射时钟和捕获时钟都是clk2图8 发射时钟和捕获时钟都是clk2下面我们使用set_case_analysis命令固定选择端sel的信号为1可以使用report_case_analysis命令查看指定的模式分析值如图9所示可以看到之前设置的0被更改为了1。还可以使用report_disable_timing命令查看此时失效的时序弧如图10所示可以看到此时选择引脚S0到输出引脚Y的时序弧和输出引脚A到输出引脚Y的时序弧都失效了。此时的时序分析结果如图11和图12所示。dcnxt_shell set_case_analysis 1 [get_ports sel]图9 模式分析报告图10 失效时序弧报告图11 发射时钟和捕获时钟都是clk1图12 发射时钟和捕获时钟都是clk1set_case_analysis命令还会导致设定的值沿着时序路径向后传播从而打断某些时序路径使这些路径不能出现信号翻转例如对于图13所示的电路图。图13 一个简单的例子首先在输入端口clk定义一个时钟。create_clock -period 10 [get_ports clk]此时如果直接使用report_timing命令则t_reg和data_out_reg之间的时序路径会正常报告如图14所示。图14 两个触发器间的时序报告下面使用set_case_analysis命令固定使能信号enable为0可以使用report_disable_timing命令查看此时失效的时序弧如图15所示我们发现这和图10报告有所差异按照之前的分析此时应显示单元U4从输入引脚A和输入引脚B到输出引脚Y的时序弧失效但图15却显示触发器data_out_reg从时钟引脚CK到输入引脚D的建立时间和保持时间时序弧失效了这是因为Design Compiler检测到此时D引脚的值为固定值0因此无需检查建立时间和保持时间其他检查依旧可能检查如恢复时间和移除时间检查。触发器t_reg和触发器data_out_reg之间的时序路径消失了实际上某点的固定值会使通过该点时序路径直接消失如图16所示。set_case_analysis 0 [get_ports enable]图15 失效时序弧报告图16 两个触发器间的时序路径消失了假设对于图13的情况不使用set_case_analysis 0命令而是使用set_logic_zero命令将使能信号enable设置为常量0综合结果会大不一样读者可以自行尝试并思考为什么会这样这两个命令的差别是什么图17所示的例子在与门U1后添加了一个或门这样的话即使与门U1的输出固定为0也不会传播到触发器data_out_reg的D引脚此时使用set_case_analysis 0 [get_ports enable]命令后的失效时序弧报告如图18所示可以看到固定值0传播至或门U2输入并使或门U2的输入到输出的时序弧失效了这里没有明确给出U1的的输入到输出的时序弧失效它们被包含在U2时序弧的失效中报告只会列出传播终点的时序弧失效情况。如果此时使用set_case_analysis 0 [get_ports enable1]命令则固定值0会继续传播至触发器data_out_reg的D引脚此时的失效时序弧报告就和图15一样了。图17 定值0不会传播至触发器输入图18 失效时序弧报告在编写Verilog代码时直接将与门的一个输出引脚固定为0或者使用set_logic_zero命令这也会打断时序路径假设电路没有被逻辑优化如图19所示的电路图。图19 编写代码时指定引脚值为0在图19中我们设法使得某些器件不被优化掉并构造了一个奇怪的电路图。此时在逻辑上讲与门U1的输出是一个常量0使用report_disable_timing命令查看此时失效的时序弧如图20所示可以看到此时居然和图15的报告一模一样这代表着Design Compiler正确识别了这种情况但是将其视为模式分析PrimeTime则会将这种情况视为常量传播如图21所示。此时使用report_timing命令无法看到t_reg和data_out_reg之间的时序路径如图22所示。图20 失效时序弧报告图21 失效时序弧报告PrimeTime图22 两个触发器间的时序路径消失了但是我们再来看一下图23所示的电路图假设电路没有被逻辑优化可以看出按照逻辑关系与门U2的输出是一个固定值0但是此时使用report_timing命令可以看到t_reg和data_out_reg之间的时序路径如图24所示。此时使用report_disable_timing命令查看此时失效的时序弧图25显示此时没有失效的时序弧。这代表了即使Design Compiler不会考虑更复杂的传播情况。图23 与门U2的输出引脚值为0图24 两个触发器间的时序报告图25 失效时序弧报告如果此时在编写Verilog代码时又将enable信号固定为1或者使用set_logic_one命令假设电路没有被逻辑优化如图26所示则时序路径又会被打断。使用report_disable_timing命令查看此时失效的时序如图27所示其中固定值0传播至触发器data_out_reg的输入引脚D导致触发器data_out_reg从时钟引脚CK到输入引脚D的建立时间和保持时间时序弧失效了并且固定值1还传播到了U1的1输入端A这导致了与门U1输入端A到输出端Y的时序弧失效了但这不会继续传播下去了因为一个与门输入固定为1并不会使输出也为固定值但其实这条是多余的因为触发器data_out_reg从时钟引脚CK到输入引脚D的建立时间和保持时间时序弧都已经失效了。图26 编写代码时指定引脚值为1图27 失效时序弧报告最后要注意的是固定值的传播会在到达时序路径终点而停止并不会继续传播下去比如图25中的data_out_reg到输出端口的时序路径并不会因为触发器时钟引脚CK到输入引脚D的时序弧失效而被打断。最后做个总结不管是直接明确使用固定值还是使用模式分析命令set_case_analysis命令指定固定值固定值都会沿着逻辑传播与门的某个输入为固定0或门的某个输入为固定1与门的所有输入固定为1或门的所有输入固定为0等情况直到传播终点为止固定值不能继续传播下去时序弧失效报告中只显示传播终点的失效时序弧因为这也能间接说明传播路径中的时序弧也失效了如果传播终点是触发器的输入端则触发器从时钟引脚CK到输入引脚D的时序弧会失效此时不会进行建立时间和保持时间的检查其他检查依旧可能检查如恢复时间和移除时间检查。除了本文谈到的常量传播和set_case_analysis命令外失效时序弧还可能因为set_disable_timing命令、工具自动断开组合逻辑环(Timing Loop)和状态相关的时序弧(Conditional Timing Arc)缺少对应状态等方式产生。
返回列表