老怪甲 发表于 2010-7-1 11:10:23

时序约束的问题

我的系统中,输入时钟为ddr_ck/ddr_ckn,经过dcm产生270度的相移,输出为clk1X。
clk1X作为整个系统的工作时钟。要求ddr_ck/ddr_ckn在400~667MHz之间。

在不做时序约束的条件下,系统的最高工作频率为365.658MHz,不满足要求。下面是综合报告的相关结果:
=========================================================================
Timing constraint: Default period analysis for Clock 'ddr_ck'
Clock period: 2.735ns (frequency: 365.658MHz)
Total number of paths / destination ports: 8426 / 1193
-------------------------------------------------------------------------
Delay:               2.735ns (Levels of Logic = 3)
Source:            ddr_ana/phy_addr_19 (FF)
Destination:       ddr_ana/dout_31 (FF)
Source Clock:      ddr_ck rising +270
Destination Clock: ddr_ck rising +270

Data Path: ddr_ana/phy_addr_19 to ddr_ana/dout_31
                              Gate   Net
    Cell:in->out      fanout   Delay   DelayLogical Name (Net Name)
    ----------------------------------------------------
   FDC:C->Q            2   0.317   0.701ddr_ana/phy_addr_19 (ddr_ana/phy_addr_19)
   LUT6:I0->O            1   0.061   0.512ddr_ana/_n0091_inv4 (ddr_ana/_n0091_inv4)
   LUT4:I1->O            1   0.061   0.357ddr_ana/_n0091_inv5 (ddr_ana/_n0091_inv5)
   LUT5:I4->O         29   0.061   0.468ddr_ana/_n0091_inv7 (ddr_ana/_n0091_inv)
   FDE:CE                  0.196          ddr_ana/dout_0
    ----------------------------------------
    Total                      2.735ns (0.696ns logic, 2.039ns route)
                                       (25.4% logic, 74.6% route)

=========================================================================
可以看到74.6%都是由于布线造成的

因此我就希望通过时序约束,来提高系统工作频率。

但是不知道该怎么加时序约束?我想约束的是clk1X,可是工具默认的时钟是ddr_ck。

请高手指教^_^

老怪甲 发表于 2010-7-1 11:13:10

1# cuizehan


加入如下约束后:

NET "ddr_ck" TNM_NET = ddr_ck;
TIMESPEC TS_ddr_ck = PERIOD "ddr_ck" 1.5 ns HIGH 50%;
NET "ddr_ckn" TNM_NET = ddr_ckn;
TIMESPEC TS_ddr_ckn = PERIOD "ddr_ckn" 1.5 ns LOW 50%;

静态时序分析给出的报告显示,最高频率为424.809MHz,关键路径的延时为2.354ns,比综合报告给出的延时稍小,但布线延时仍然占70%以上。

关键路径实现的逻辑如下,

         always@(posedge clk1X or posedge reset ) begin
            if(reset) begin
                  phy_addr    <= 0;
                  rw          <= 0;
            end
            else begin
                     phy_addr <= (phy_addr_cs0 | phy_addr_cs1);
                     rw       <= rw_cs0 | rw_cs1;
                     if(phy_addr != 0 )
                            dout <= { 1'b0, cs_d8, cmd_d8, rw, phy_addr};
            end
          end

不知道该怎么优化?

老怪甲 发表于 2010-7-1 11:13:26

把数据再打一拍看看,
如果扇出大,手动或自动复制逻辑减小扇出

Sunlife 发表于 2015-5-14 10:02:47

                     高手高手
页: [1]
查看完整版本: 时序约束的问题