tag 标签: multicycle_path

相关博文
  • 热度 19
    2013-8-31 18:06
    1184 次阅读|
    0 个评论
    版权声明 :转载时请以超链接形式标明文章原始出处和作者信息及 本声明 http://www.blogbus.com/bb2hh-logs/38665424.html    注明:如需转载,请注明作者出处,谢谢~,Author:pythonlong  以下根据资料和个人体会整理,如果错误,疑问欢迎请指正,讨论!! 在设置multicycle_path的过程中,一定要注意到底start clock 是多周期,还是end clock 是多周期。这关系到时序分析。默认情况下,set_multicycle_path对建立时间的分析是设置end clock为多周期,对保持时间分析师设置start clock为多周期。 即: set_multicycle_path -setup 2 -from a -to b  等价于 set_multicycle_path -setup 2 -end -from a -to b  set_multicycle_path -hold 1 -from a -to b 等价于 set_multicycle_path -hold 1 -start -from a -to b 了解multicycle的,应该都知道设置setup的周期是X,那么设置hold的周期为X-1。 下面的设置我们也会按照这样默认的规矩来设置。 下面再分析一次快时钟采集慢时钟: 假设我们已经知道3*clk1delay2*clk1 那么,如果我们不仔细思索,大概会写成如下: set_multicycle_path -setup 3 -from clk1 -to clk2 set_multicycle_path -hold 2 -from clk1 -to clk2 下面我们扩展成默认写法: set_multicycle_path -setup 3 -end -from clk1 -to clk2 set_multicycle_path -hold 2 -start -from clk1 -to clk2 那么我们看下时序分析:粉色setup检查,红色hold检查 这里我们会发现,和我们预计的不太一样,问题就出在工具的默认设置上。 这里我们不看setup的check,这个和我们想要检查的一样。 我们看下hold的设置: set_multicycle_path -hold 2 -start -from clk1 -to clk2 我们来了解下start,这个start说明start clock是多周期的。 dc默认a点作为hold的check点。这里又有默认的start,所以就产生上图的hold check。 如何才能让dc做我们想要的check 呢?改成下面形式: set_multicycle_path -setup 3 -end -from clk1 -to clk2 set_multicycle_path -hold 2 -end -from clk1 -to clk2 分析结果:B点setup检查,A点hold检查 我们再看一下慢采快。   同样,假设我们已经知道3*clk1delay2*clk1 那么,同样,如果我们不仔细思索,大概会写成如下: set_multicycle_path -setup 3 -from clk1 -to clk2 set_multicycle_path -hold 2 -from clk1 -to clk2 扩展成默认写法: set_multicycle_path -setup 3 -end -from clk1 -to clk2 set_multicycle_path -hold 2 -start -from clk1 -to clk2 那么我们看下时序分析:B点setup检查,A点hold检查  分析和快采慢一样。 修改成: set_multicycle_path -setup 3 -start -from clk1 -to clk2 set_multicycle_path -hold 2 -start -from clk1 -to clk2 分析如下:B点setup检查,A点hold检查 建议: 快采慢: 慢采快:  
  • 热度 13
    2013-8-31 18:05
    1708 次阅读|
    0 个评论
    版权声明 :转载时请以超链接形式标明文章原始出处和作者信息及 本声明 http://www.blogbus.com/bb2hh-logs/21015786.html     注明:如需转载,请注明作者出处,谢谢~,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说明多周期路径是用在建立时间检查还是用在保持时间检查。 Stard和end说明多周期路径依赖于start clock还是依赖于end clock 例子:   Set_multicycle_path –setup 60 –to /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 /D 下面进入多频率的多周期: 这个例子和上面例子差不多,只是频率不同。  例子:以下仅为例子,实际设计中不会存在 module m(clka, clkb, ain, bin ,cout, dout); input clka,clkb; input ain,bin; output cout,dout; reg cout, dout; reg ain_reg ,bin_reg; wire 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 create_clock  -period 30 set_multicycle_path 2 -to cout_reg /D set_multicycle_path 3 -to dout_reg /D set_min_delay 0 -to dout_reg /D set_min_delay 0 -to cout_reg /D compile 结构图 Path1: Setup: report_timing -from ain_reg_reg /CK -to cout_reg /D  因为设置了多周期路径为2倍,从report可以看出建立时间的检查类似下面:  Hold: report_timing -from ain_reg_reg /CK -to cout_reg /D -delay min 因为使用了默认的hold检查,可以看出hold check不是希望的0,而是10,如下   看下特例: (set_min_delay 0 -to cout_reg /D) report_timing -from ain_reg_reg /CK -to cout_reg /D -delay min   Path3: setup:    因为set_multicycle_path 2 -to cout_reg /D。 所以时序关系如下;  Hold: report_timing -from bin_reg_reg /CK -to cout_reg /D -delay min 因为使用了,默认的hold chek,所以时序图: 特例: (set_min_delay 0 -to cout_reg /D) report_timing -from bin_reg_reg /CK -to cout_reg /D -delay min  Hold check时序图: