ARTICLE DETAIL

资讯详情

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

Design Compiler:自适应重定时(Adaptive Retiming)

Design Compiler:自适应重定时(Adaptive Retiming) 相关阅读Design Compilerhttps://blog.csdn.net/weixin_45791458/category_12738116.html?spm1001.2014.3001.5482简介重定时是DC Ultra引入的一种时序优化技术可以将时序单元触发器和锁存器穿越组合逻辑前后移动以优化设计的时序和面积为提升电路时序性能提供了一个重要手段。根据使用场景的不同重定时可分为两类自适应重定时(Adaptive Retiming)和流水线重定时(Pipelined-Logic Retiming)本文关注的重点是简单介绍自适应重定时更多关于重定时的实现细节将在流水线重定时一文中涉及因为流水线重定时在2000版本就已推出而自适应重定时直到2007版本才推出它们的底层原理是类似的。使用方法不管是线负载模式还是拓扑模式只需要在使用compile_ultra命令综合时添加-retime选项不能同时指定-top或-only_design_rule选项否则-retime选项被忽略即可自动在优化过程中执行自适应重定时如下所示。dc_shell compile_ultra -retime需要注意的是如果时序单元的dont_touch、size_only或dont_retime属性被设置了则该时序单元不会被重定时包括自适应重定时与流水线重定时其他时序单元也不能跨越它进行移动。在自适应重定时过程中被移动的时序单元将会被重新命名使用前缀R和编号后缀例如R_123因此这些时序单元无法再与原始名使用信号名前缀和reg后缀对应。这通常不会给等价性检查带来问题因为这些重命名都会被记录在SVF文件中有关SVF文件的更详细介绍参考下面的博客。Design Compilerset_svf命令以及SVF文件简介https://blog.csdn.net/weixin_45791458/article/details/144069207?ops_request_misc%257B%2522request%255Fid%2522%253A%2522836664eccdd944f4e1a9cd4d2f2c8123%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257Drequest_id836664eccdd944f4e1a9cd4d2f2c8123biz_id0utm_mediumdistribute.pc_search_result.none-task-blog-2~blog~first_rank_ecpm_v1~rank_v31_ecpm-2-144069207-null-null.nonecaseutm_termsvfspm1018.2226.3001.4450自适应重定时与流水线重定时的区别自适应重定时一般用于整体通用设计而不是那些显式使用流水线的逻辑通过移动时序单元以优化时序组(Path Group)中的关键路径(Worst Negative Slack, WNS)的延迟对于那些显式使用流水线的数据通路仍建议使用流水线重定时。可以同时使用自适应重定时和流水线重定时它们并不冲突。自适应重定时示例在综合前手动确定最佳的时序单元位置并进行RTL编码通常是一项耗时且困难的工作。自适应重定时可以自动调整设计中时序单元的位置以尽可能平衡时序单元间的延迟。当设计中的某些时序路径超过时序目标而其他时序路径又未充分利用时序裕量时这项技术尤为有用。如果设计中所有时序路径都已满足时序目标自适应重定时也可用于减少时序单元数量如可能以优化面积或功耗。在自适应重定时过程中时序单元会穿越组合逻辑向前或向后移动如图1所示。图1 自适应重定时图1的上半部分展示了向后移动时序单元为了保证端到端功能正确增加了一个时序单元看起来就像是时序单元复制但需要注意的是这与为了分摊负载而进行的复制(Register Replication)是不一样的图1的下半部分展示了向前移动时序单元为了保证功能正确减少了一个时序单元看起来就像是时序单元合并但需要注意的是这与为了减少面积而进行的合并(Register Merging)是不一样的但具有类似的功能。复位/置位的重要性上一小节说明了为了保证功能正确性自适应重定时会增加或减少时序单元的数量但是如果时序单元拥有异步复位/置位端还需要更多操作才能保证功能正确性这被称为初始状态等效化(Reset State Justification)。图2 复位值限制以图2为例假设最初的时序单元是一个带异步复位的触发器在图中用红色的0标注再发生了向后重定时后由于需要保证最后一个门的相关输入在复位时为0除了需要增加一个触发器还需要将带异步复位的触发器变更为带异步置位的触发器在图中用红色的1标注。除了图2所示的简单情况自适应重定时还可以处理可能出现的复位/置位冲突情况如图3所示。图3 出现冲突的自适应重定时假设网表1是最初的设计其中有些触发器使用异步复位也有些触发器使用异步置位在图中用0或1标注它们的复位/置位信号是共用的。假设发生了向后重定时就和图2类似触发器R4依旧保持原来的异步复位而触发器R7则从异步复位变成异步置位。为了保证异或门C5的输出在复位/置位时为1触发器R5和R6则存在两种情况一种如网表2所示一种如网表3所示。区别在于网表3可以合并触发器R4和R5并允许进一步向后自适应重定时而网表2则无法合并自然也无法进一步向后重定时。时序例外下的限制如果存在时序例外Design Compiler仅在所有被移动的时序单元具有相同的时序例外设置时才允许它们一起进行重定时移动还需要将compile_retime_exception_registers变量设置为true默认值为false支持的例外类型包括set_max_delay set_min_delay set_multicycle_path set_false_path group_path例如以下命令中的两个触发器具有相同的时序例外。set_max_delay 10 -to [get_pins r0/D r1/D]写成两条命令也可以但需要保证值的设置一致。set_max_delay 10 -to [get_pins r0/D] set_max_delay 10 -to [get_pins r1/D]真实案例下面将以一个真实案例说明自适应重定时的使用方式。下面的RTL代码描述了一个输入端有反相器的带异步复位的D触发器。module inv_push (input a, clk,rst_n, output z); reg result; assign z result; always (posedge clk, negedge rst_n) begin if(!rst_n) result 0; else result !a; end endmodule如果直接使用compile命令进行综合结果如图4所示。图4 不使用自适应重定时的综合结果如果使用下面的SDC命令进行约束则in2reg路径会出现时序违例此时使用compile_ultra -retime命令进行综合的结果如图5所示。create_clock -period 5 [get_ports clk] set_input_delay 4.99999 [get_ports a] -clock [get_clocks clk]图5 使用自适应重定时的综合结果注意到发生了向后自适应重定时触发器被重命名为R_0且变成了异步置位。综合时会提示Information: Retiming is enabled. SVF file must be used for formal verification. (OPT-1210)SVF文件中存在guide_retiming命令用于指导等价性检查。实际上即使不使用-retime选项直接使用compile_ultra命令综合的结果也是类似的如图6所示。图6 不使用自适应重定时的综合结果这是另一种被称为相位反转(Phase Inversion)的优化方式Design Compiler可以将反相器移动并穿过寄存器边界触发器此时没有重命名但也变成了异步置位。综合时会提示Information: Sequential output inversion is enabled. SVF file must be used for formal verification. (OPT-1208)SVF文件中存在guide_inv_push命令用于指导等价性检查。可以使用compile_seqmap_enable_output_inversion变量对于compile命令或者-no_seq_output_inversion选项对于compile_ultra命令禁止相位反转。
返回列表