公司动态

Design Compiler:流水线重定时(Pipelined-Logic Retiming)

📅 2026/8/27 14:54:13
Design Compiler:流水线重定时(Pipelined-Logic Retiming)
相关阅读Design Compilerhttps://blog.csdn.net/weixin_45791458/category_12738116.html?spm1001.2014.3001.5482简介重定时是DC Ultra引入的一种时序优化技术可以将时序单元触发器和锁存器穿越组合逻辑前后移动以优化设计的时序和面积为提升电路时序性能提供了一个重要手段。根据使用场景的不同重定时可分为两类自适应重定时(Adaptive Retiming)和流水线重定时(Pipelined-Logic Retiming)本文关注的重点是流水线重定时以及重定时的实现细节。使用方法流水线重定时可以通过以下两种方式执行。optimize_registers该方法在已映射的网表上进行流水线重定时在此之前必须先使用compile或compile_ultra命令对设计进行综合流水线重定时分为两个步骤第一步移动时序单元尝试平衡各阶段延迟这也被称为minimum period step并尽可能减少时序单元的数量这也被称为minimum area step第二步进行增量综合以适应因时序单元移动导致的扇出结构变化。set_optimize_registers和compile_ultra该方法首先使用set_optimize_registers命令在指定的设计上设置optimize_registers属性随后使用compile_ultra命令进行综合时会自动进行流水线重定时自动调用optimize_registers命令。需要注意的是如果时序单元的dont_touch、size_only或dont_retime属性被设置了则该时序单元不会被重定时包括自适应重定时与流水线重定时其他时序单元也不能跨越它进行移动。在流水线重定时过程中被移动的时序单元将会被重新命名使用时钟名rREGnS#例如clk_r_REG1_S1其中表示原矢量信号的索引#表示流水线的阶段因此这些时序单元无法再与原始名使用信号名前缀和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和图2展示了一个向后重定时的示例。图1 流水线重定时前图2 流水线重定时后对于本例流水线重定时之前关键路径的逻辑深度为4并且仅在路径终点处有1个时序单元。重定时之后增加了3个时序单元并向后移动穿过了2级逻辑关键路径的逻辑深度为此时为2。重定时的基本概念基本定义与概念要理解重定时的工作原理首先必须熟悉一些基本术语和概念。特别是要了解通用时序单元(SEQGEN)、控制线网(control nets)以及通用时序单元分类(register classes)。这些概念之所以重要是因为在重定时时映射后的时序单元会根据其控制线网的分类被临时替换为通用时序单元。通用时序单元当读取RTL设计时HDL Compiler会使用通用时序单元SEQGEN或者称为Generic/Unmapped Sequential Cell表示时序逻辑包括触发器或锁存器并在综合阶段将其映射到具体的触发器或锁存器。由于在重定时过程中已映射的时序单元会被临时替换为通用时序单元因此你需要理解它的基本功能。图3展示了一个通用时序单元的框图。图3 通用时序单元及其引脚表示下面使用了一段伪代码对通用时序单元进行了建模。SEQGEN(AC, AS, EN, AD, SC, SS, ST, SL, D, CLK, Q, QN, AC_AS_Q, AC_AS_QN, SC_SS_Q); input AC, AS, EN, AD, SC, SS, ST, SL, D, CLK; input Q, QN; parameter AC_AS_Q, AC_AS_QN, SC_SS_Q; { variable temp; if (AC AS) { Q AC_AS_Q; QN AC_AS_QN; } else if (AC) { Q 0; QN 1; } else if (AS) { Q 1; QN 0; } else if (EN) { Q AD; QN !AD; } else if (posedge CLK) { if (SC SS) { Q SC_SS_Q; QN !SC_SS_Q; } else if (SC) { Q 0; QN 1; } else if (SS) { Q 1; QN 0; } else if (ST SL) { error; } else if (SL) { Q D; QN !D; } else if (ST) { temp Q; Q !temp; QN temp; } } }通用时序单元各引脚的功能如表1所示。表1 通用时序单元的引脚方向引脚功能输入EN(enable)异步使能用于锁存器以及少数情况下的触发器AD(data_in)异步数据输入用于锁存器以及少数情况下的触发器AC(clear)异步复位用于锁存器和触发器AS(preset)异步置位用于锁存器和触发器D(next_state)同步输入用于触发器SC(synch_clear)同步复位用于触发器SS(synch_preset)同步置位用于触发器SL(synch_enable)同步使能用于触发器ST(synch_toggle)同步翻转用于触发器CLK(clocked_on)同步时钟用于触发器输出Q输出用于锁存器和触发器QN反相输出用于锁存器和触发器其中EN(enable)和AD(data_in)引脚一般用于锁存器但在HDL Compiler没有成功识别触发器的异步复位时也会用于实现异步复位的功能。对于同步复位/置位触发器需要使用sync_set_reset综合指令帮助识别或是将hdlin_ff_always_sync_set_reset变量设置为true对于异步复位/置位触发器一般可以自动识别hdlin_ff_always_async_set_reset变量默认为true但如果将hdlin_ff_always_async_set_reset变量设置为false后又没有使用async_set_reset综合指令帮助识别则只能使用EN(enable)和AD(data_in)引脚进行等效实现。图4是一个正常识别的带异步复位的触发器图5是一个使用EN(enable)和AD(data_in)引脚实现的触发器。图4 正常识别的带异步复位的触发器图5 等效实现的带异步复位的触发器逻辑库中的时序单元的ff组会latch组中会将部分通用时序单元的引脚名作为属性并给出对应的库单元引脚例如下面的节选描述了一个带异步复位的触发器时钟引脚为CK数据输入引脚为D异步复位引脚低电平有效为RN。ff(IQ,IQN) { clocked_on :CK; next_state : D; clear :!RN; }实际上对于通用时序单元触发器和锁存器的差别几乎仅存在于其引脚连接方式除了极少属性也就是说用户甚至可以通过网表编辑将一个作为锁存器使用的通用时序单元改造为作为触发器使用的通用时序单元并最终综合为一个触发器。控制线网控制线网指的是连接到通用时序单元的以下引脚之一的线网SL(synch_enable)、SC(synch_clear)、SS(synch_preset)、AC(clear)和AS(preset)。在进行重定时时控制线网之间的等价性对时序单元的移动起着至关重要的作用。根据定义满足以下任一条件的一组控制线网被认为是等价的。1、控制线网都来自同一个信号源并且从该信号源到每个通用时序单元之间路径上的反相器数量均为奇数或均为偶数不考虑缓冲器。2、控制线网是常量信号并且这些常量值相同都为0或都为1。图6展示了等价和非等价控制线网的示例控制线网n1和控制线网n3来自同一个信号源并且信号源到通用时序单元之间路径上的反相器数量均为偶数0个和2个因此是等价的控制线网n2即使和控制线网n2、n3来自同一个信号源但信号源到通用时序单元之间路径上的反相器数量为奇数1个因此不等价。图6 等价与不等价控制线网的例子通用时序单元分类通用时序单元会根据其连接的控制线网进行分类这样的分组是必要的因为只有属于同一组的通用时序单元才能在不违反电路逻辑的前提下一起穿越组合逻辑进行移动。根据定义需满足以下所有条件的通用时序单元被认为属于一类。1、通用时序单元的SL(synch_enable)引脚连接的控制线网等价。2、通用时序单元的SC(synch_clear)引脚和SS(synch_preset)连接的控制线网等价允许交叉等价即某个SC(synch_clear)引脚和另一个SS(synch_preset)引脚连接的控制线网等价。3、通用时序单元的AC(clear)引脚和AS(preset)连接的控制线网等价允许交叉等价即某个AC(clear)引脚和另一个AS(preset)引脚连接的控制线网等价。图7展示了两个属于同一类的通用时序单元交叉等价其中未连接的引脚表示连接到各自的非激活常量值。图7 属于同一类别的通用时序单元对于图6如果未连接的引脚表示连接到各自的非激活常量值那么R1和R3属于同一类而R2属于不同类。当属于同一类的通用时序单元被移动进行重定时时可以根据需要互换它们的控制线网以完成重定时这种控制信号互换的能力适用于同步引脚也适用于异步引脚。向前重定时要将通用时序单元向前穿越一个组合逻辑单元进行向前重定时该组合逻辑单元的所有输入必须直接由属于同一类的通用时序单元驱动。完成向前重定时后该组合逻辑单元后的通用时序单元将属于之前直接前驱该组合逻辑单元的通用时序单元所属的类。图8展示了一个穿越组合逻辑单元g1的向前重定时注意在这个示例以及接下来的内容中通用时序单元的控制线网不会画出通用时序单元上的标注表示所属类。图8 向前重定时在进行向前重定时前组合逻辑单元g1的3个直接前驱通用时序单元都属于C1类因此可以进行向前重定时注意在向前重定时后这3个通用时序单元被替换为2个仍属于C1类的通用时序单元。接下来无法对组合逻辑单元g1的新直接前驱通用时序单元继续进行向前重定时因为它们并不属于同一个类。同样在第一次向前重定时后也无法继续对直接驱动组合逻辑单元g2的通用时序单元进行前向重定时其输入引脚中只有1个是由通用时序单元驱动的。但是直接驱动组合逻辑单元g3的通用时序单元可以继续进行前向重定时。如果在向前重定时过程中某个组合逻辑单元已进行了其能达到的最多的向前重定时次数那么该单元就达到了其向前重定时边界限制。向后重定时与向前重定时类似向后重定时也受到类似的规则约束决定是否可以穿越组合逻辑单元。要将通用时序单元向后穿越一个组合逻辑单元进行向后重定时该组合逻辑单元的所有输出必须直接驱动属于同一类的通用时序单元。完成向后重定时后该组合逻辑单元前的通用时序单元将属于之前直接被该组合逻辑单元驱动的通用时序单元所属的类。图9展示了一个穿越组合逻辑单元g2和g1的向后重定时注意进行了两次向后重定时。图9 向后重定时如果在向后重定时过程中某个组合逻辑单元已进行了其能达到的最多的向后重定时次数那么该单元就达到了其向后重定时边界限制。转换方法之前说过在重定时时映射后的时序单元会根据其控制线网的分类被临时替换为通用时序单元并且可以选择使用哪种转换方法。Design Compiler支持以下两种转换方法。通过组合逻辑分解转换同步输入引脚组合逻辑分解对同步输入引脚的转换方式为使用组合逻辑单元来实现原本的同步控制功能并将组合逻辑单元的输出连接到通用时序单元的数据输入引脚注意即使是有异步控制引脚的时序单元组合逻辑分解也可以应用于其中的同步控制引脚而异步控制引脚则只能使用直接映射的方式直接映射将在多类别重定时中详细介绍。图10展示了带同步使能/复位的触发器通过组合逻辑分解进行转换此时左侧是触发器而右侧是输入端有组合逻辑的通用时序单元。图10 组合逻辑分解的例子组合逻辑分解的优点是所有纯同步时序单元在转换后都是属于同一类的通用时序单元因此不会因通用时序单元不属于同一个类而限制重定时次数如使用多类别重定时的方法则可能被限制。图11展示了同步使能端来自不同端口的两个触发器在经过组合逻辑分解后可以向前重定时。图11 使用组合逻辑分解进行重定时由于组合逻辑分解后的通用时序单元扇出为2在之前遇到的例子中扇出均为1在进行向前重定时前需要先将其在每个分支上进行复制图11中用一对红蓝矩形框表示复制结果蓝框表示进行向前重定时的通用时序单元。尽管具有一些优点但有时组合逻辑分解也会限制重定时图12展示了一个这样的例子当一对串联的带同步复位的触发器经过组合逻辑分解后左侧的通用时序单元无法进行向前重定时因为引入的与门的输入引脚中只有1个是由通用时序单元驱动的。作为对比如果使用多类别重定时的方法则两个通用时序单元都可向前重定时。图12 使用组合逻辑分解后增加了限制多类别重定时与组合逻辑分解相比多类别重定时通常可以带来显著的面积节省。时序单元的同步/异步控制引脚都是可以直接映射到通用时序单元的引脚图13展示了一个带异步复位引脚低电平有效的触发器是如何直接转换为通用时序单元的图14展示了一个带同步复位引脚低电平有效和同步使能引脚高电平有效的触发器是如何直接转换为通用时序单元的。图13 时序单元直接转换图14 时序单元直接转换图15展示了一个多类别重定时的例子它与图11类似不同在于同步使能端来自同一个端口直接转换为通用时序单元后属于同一类因此可以直接进行向前重定时。图15 使用多类别重定时初始状态等效化在对电路中的时序单元进行重定时时仅遵循单个组合逻辑单元的重定时规则是不够的通常还必须保持与原始电路相同的初始状态。若一个电路与其重定时版本在相同的输入序列下能在输出端口产生相同的输出序列则认为这两个电路的状态是等价的。当电路上电时其初始状态是未知的。根据电路的设计类型需要通过外部的复位/置位信号将时序单元初始化为已知状态。这个过程可以确保电路在第一次响应输入信号时具有可重复的确定行为。如果电路设计中确实包含了复位/置位机制那么在默认情况下Design Compiler会确保重定时后的电路具有与原始电路相同的初始状态并在复位/置位激活后的几个时钟周期内保证输出一致。然而在某些情况下比如数据通路中时序单元可能没有任何复位/置位那么在初始几个周期中一个电路与其重定时版本的输出值可能不会完全一致。这种不匹配的最长持续时间为流水线级数乘以时钟周期即第一个有效输出的延迟。以图16为例假设最初的时序单元是一个带异步复位的触发器在图中用红色的0标注再发生了向后重定时后由于需要保证最后一个门的相关输入在复位时为0除了需要增加一个触发器还需要将带异步复位的触发器变更为带异步置位的触发器在图中用红色的1标注。图16 复位值限制等价初始状态的计算过程称为初始状态等效化。当进行向前重定时时状态等价推导总是可行的而且不需要大量的CPU时间。但当进行向前重定时时状态等价推导会更加复杂图17展示了一个等价初始状态的计算困难的例子。图17 困难的等价初始状态计算当这些触发器被移动到重定时之后的位置时可能无法为整个电路找到一个等价的初始状态。在这种情况下Design Compiler会尝试为触发器寻找一个新的位置在该位置上可以找到等价状态且尽可能接近最优位置。如果某个待重定时的电路具有复位逻辑但在重定时之后不需要保持相同的初始状态可以指定不进行状态推导。这种方法可以应用于数据通路但不适合控制器状态机。要设置等价初始状态的计算强度可以使用optimize_registers命令或set_optimize_registers命令的-justification_effort选项可以指定为low、medium和high三种值。真实案例如果需要使用流水线重定时最好遵循几条建议首先将需要进行流水线重定时的数据通路放置在一个单独的模块中然后在模块的输入或输出端集中放置寄存器如图18所示。图18 建议的RTL风格下面将以一个真实案例说明流水线重定时的使用方式。下面的RTL代码描述了一个数据通路其中触发器都放置在输出端。module pipeline_example ( input wire clk, input wire rst_n, input wire [7:0] a, b, c, d, e, f, output reg [15:0] R3 ); reg [15:0] data; reg [15:0] R1, R2; always (*) begin data a * b c * d e - f; end always (posedge clk or negedge rst_n) begin if (!rst_n) begin R1 16d0; R2 16d0; R3 16d0; end else begin R1 data; R2 R1; R3 R2; end end endmodule首先使用下面的SDC命令进行约束并使用compile_ultra命令进行综合结果如图19所示。create_clock -period 1.0 [get_ports clk] set_input_delay 1.6 -clock clk [remove_from_collection [all_inputs] clk]图19 直接综合结果可以看出此时触发器还是在输出端的位置因此出现了时序违例下面使用optimize_registers命令进行流水线重定时结果如图20所示。图20 流水线重定时后的综合结果