DC 概论六之multicycle_path

 注明:如需转载,请注明作者出处,谢谢~,Author:pythonlong

 以下根据资料和个人体会整理,如果错误,疑问欢迎请指正,讨论!!

在讲多周期路径之前,先看下单频率路径的建立关系和保持关系

『Design Compiler calculates the default setup and hold relations and derives single-cycle timing, based on active edges.』


1.对于startpoint,active edge是寄存器的open edge。
2.对于endpoint,active edge是寄存器的close edge。
3.对于上升沿触发的寄存器,上升沿既是open edge也是close edge。
4.对于高电平出发的锁存器,上升沿是open edge,下降沿是close edge。

看一个例子:

 下面进入多频率路径建立和保持

建立关系检查:
对于多频率设计,在两个时钟之间可能存在多个建立关系,对于目的时钟的的每一个锁存边沿,找到捕获边沿最近的发送边沿。发送边沿和捕获边沿的最小关系决定了这个路径上的最大延迟。

保持关系检查:
简单说就是,数据从startpoint发出之后,在被endpoint的active edge 锁存之前,不能被捕获。这个时序的最大值决定了,这个路径的最小延迟。

如下图所示:

Setup要求:5-0=5
Hold要求:30-30=0

Exp2:

Setup要求=10-0=10
Hold要求=0-0=0

Exp3

Setup要求:4-3=1
Hold要求:7-7=0

 

下面进入单频率的多周期:
先介绍命令set_multicycle_path
常用格式:
set_multicycle_path
              path_multiplier
              [-rise | -fall]
              [-setup | -hold]
              [-start | -end]
              [-from from_list]
              [-to to_list]
              [-through through_list]
Rise和fall用来说明多周期路径是用在上升沿还是下降沿
Setup和hold说明多周期路径是用在建立时间检查还是用在保持时间检查。
Stard和end说明多周期路径依赖于start clock还是依赖于end clock
例子:

 

Set_multicycle_path –setup 60 –to [get_pins “C_reg[*]/D”]
用来说明多周期路径的建立时间检查。
换句话说就是数据从launch到capture的时间是6个周期的时间。
那么缺省的保持时间检查时什么呢?看下面

 根据dc综合原理:
对hold的检查之一就是:在capture active edge之前不能被捕获。所以缺省的hold检查实在第6个周期。而我们希望的是在0时刻进行hold check。
所以要如下设置

 

但是这种写法很晦涩。我们可以通过set_min_dealy来设置hold check:
set_min_dealy –to C_reg[0]/D

下面进入多频率的多周期:

这个例子和上面例子差不多,只是频率不同。

 例子:以下仅为例子,实际设计中不会存在
module m(clka, clkb, ain, bin ,cout, dout);
input clka,clkb;
input [3:0] ain,bin;

output [7:0] cout,dout;
reg [7:0] cout, dout;

reg [3:0] ain_reg ,bin_reg;
wire [7:0] mul;

assign mul = ain_reg * bin_reg;

always@(posedge clka)
begin
 ain_reg <= ain;
 cout <=  mul;
end

always@(posedge clkb)
begin
 bin_reg <= bin;
 dout <= mul;
end
endmodule
dc脚本
set lib $env(DC_LIB)
set target_library "slow.db fast.db"
set link_library "* $target_library"
set search_path ". ../src ../scripts $lib"
analyze -format verilog m.v
elaborate m
compile
create_clock  -period 10 [get_ports clka]
create_clock  -period 30 [get_ports clkb]

set_multicycle_path 2 -to cout_reg[*]/D
set_multicycle_path 3 -to dout_reg[*]/D
set_min_delay 0 -to dout_reg[3]/D
set_min_delay 0 -to cout_reg[3]/D
compile
结构图

Path1:
Setup:
report_timing -from ain_reg_reg[*]/CK -to cout_reg[4]/D

 因为设置了多周期路径为2倍,从report可以看出建立时间的检查类似下面:

 Hold:
report_timing -from ain_reg_reg[*]/CK -to cout_reg[4]/D -delay min

因为使用了默认的hold检查,可以看出hold check不是希望的0,而是10,如下
 

看下特例:
(set_min_delay 0 -to cout_reg[3]/D)
report_timing -from ain_reg_reg[*]/CK -to cout_reg[3]/D -delay min

 

Path3:
setup:

 

 因为set_multicycle_path 2 -to cout_reg[*]/D。
所以时序关系如下;

 Hold:
report_timing -from bin_reg_reg[*]/CK -to cout_reg[4]/D -delay min

因为使用了,默认的hold chek,所以时序图:

特例:
(set_min_delay 0 -to cout_reg[3]/D)
report_timing -from bin_reg_reg[*]/CK -to cout_reg[3]/D -delay min

 Hold check时序图:

转载于:https://www.cnblogs.com/liuokay/archive/2011/04/05/2005686.html

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
set_multicycle_path命令用于设置时序约束中的多周期路径。在多周期设计中,某些信号不仅可以在一个时钟周期内到达目的地,而且可能需要多个时钟周期。在这种情况下,就需要使用set_multicycle_path命令来设置多周期路径的时序约束。 set_multicycle_path命令的语法格式如下: ``` set_multicycle_path -setup|-hold|-recrem <value> [-from <start_point>] [-to <end_point>] [-rise|-fall] [-through <through_point>] [-end [<max_paths>]] [-start [<max_paths>]] [-name <path_name>] [-setup_rising|-setup_falling|-hold_rising|-hold_falling] ``` 其中,选项说明如下: - -setup: 设置多周期路径的setup时序约束。 - -hold: 设置多周期路径的hold时序约束。 - -recrem: 设置多周期路径的recovery/removal时序约束。 - <value>: 多周期路径的时序约束值。 - -from <start_point>: 指定多周期路径的起始点。 - -to <end_point>: 指定多周期路径的结束点。 - -rise|-fall: 指定多周期路径的信号变化类型。 - -through <through_point>: 指定多周期路径的中间点。 - -end [<max_paths>]: 限制最大终止点数。 - -start [<max_paths>]: 限制最大起始点数。 - -name <path_name>: 设置多周期路径的名称。 - -setup_rising|-setup_falling|-hold_rising|-hold_falling: 指定时序约束的时钟边沿类型。 需要注意的是,set_multicycle_path命令设置的多周期路径时序约束会在后续的时序分析中起作用,因此在设计中合理使用set_multicycle_path命令非常重要,能够有效提高设计的时序性能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值