可以使用 Synopsys® Design Constraint (SDC) set_multicycle_path 和 get_fanouts 命令创建基于使能寄存器的多周期异常。
图 1 显示了一个简单电路,其中使用寄存器 enable_reg 为寄存器 din_a_reg[7..0]、din_b_reg[7..0]、din_x_reg[7..0]、din_y_reg[7..0]、a_times_b 和 x_times_y 创建寄存使能信号。
使能寄存器 enable_reg 生成一个使能脉冲,此脉冲是寄存器时钟周期的两倍,因此必须应用多周期异常才能进行正确的分析。必须对由寄存器 enable_reg 馈入数据的使能驱动寄存器应用多周期建立时间 2 和多周期保持时间 1。多周期异常仅应用于寄存器到寄存器路径,其中的目标寄存器由 enable_reg 控制。
要实现这一点,可以将 set_multicycle_path 异常应用于所有使能驱动寄存器。此方法通常很繁琐,因为必须指定所有使能驱动寄存器。或者可以按以下方式将 set_multicycle_path 与 get_fanouts 组合使用:
# 使能驱动目标寄存器的多周期建立时间 2
set_multicycle_path 2 -to [get_fanouts [get_pins enable_reg|q*] \
-through [get_pins -hierarchical *|*ena*]] -end -setup
# 使能驱动目标寄存器的多周期保持时间 1
set_multicycle_path 1 -to [get_fanouts [get_pins enable_reg|q*] \
-through [get_pins -hierarchical *|*ena*]] -end –hold
set_multicycle_path 异常的目标仅限于馈入寄存器使能端口的寄存器 reg_en 的所有扇出,通过以下选项完成:
[get_fanouts [get_pins enable_reg|q*] -through [get_pins -hierarchical *|*ena*]]
表 1 显示了应用多周期异常之后设计中所有使能驱动寄存器到寄存器路径的新建立时间和保持时间关系。
表 1.使能驱动寄存器的建立时间和保持时间关系
源寄存器 |
目标寄存器 |
建立时间关系 |
保持时间关系 |
---|---|---|---|
din_a[*] |
din_a_reg[*] |
2x(锁存沿时间) |
1x(锁存沿时间) |
din_x[*] |
din_x_reg[*] |
2x(锁存沿时间) |
1x(锁存沿时间) |
din_b[*] |
din_b_reg[*] |
2x(锁存沿时间) |
1x(锁存沿时间) |
din_y[*] |
din_y_reg[*] |
2x(锁存沿时间) |
1x(锁存沿时间) |
fast_mult:mult|* |
a_times_b[*] |
2x(锁存沿时间) |
1x(锁存沿时间) |
fast_mult:mult|* |
x_times_y[*] |
2x(锁存沿时间) |
1x(锁存沿时间) |
enable_reg |
din_a_reg[*],din_b_reg[*], a_times_b[*],x_times_y[*] |
2x(锁存沿时间) |
1x(锁存沿时间) |
请注意,表 1 中从寄存器 enable_reg 起始、到任何使能驱动寄存器终止的建立时间和保持时间关系分别为 2 和 1。如果这些路径不需要修改建立时间和保持时间关系,可以通过应用以下多周期异常来应用原始关系:
set_multicycle_path 1 -from [get_pins enable_reg|q*] –end -setup
set_multicycle_path 0 -from [get_pins enable_reg|q*] –end –hold
下载示例电路 clock_enable_multicycle.qar。