热度 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时序图: