Lattice ddr3教程全攻略之时序约束篇

Lattice ddr3教程全攻略之时序约束篇

      在看这篇教程之前,建议先看看我的《Lattice ddr3教程全攻略之仿真篇》,假定你自己的工程仿真好了,自己的代码综合编译通过,但是呢,在“place &route design”的时候过不了,或者出现了一大堆莫名其妙的错误,让你抓狂的时候,那,怎么办呢?

      这就是这篇教程的作用,让你的DDR3设计完成时序约束。。。

       Now,Let’s begin…

      我的文件目录:

Lattice ddr3教程全攻略之时序约束篇_第1张图片

     如果你刚刚仿真完,用的自己建立的工程的话,那么打开xxx.lpf(我的名称是ecp3_ddr3.lpf)打开后会发现自带了下面三条语句:

COMMERCIAL;

BLOCK RESETPATHS ;

BLOCK ASYNCPATHS ;

       RESETPATHS是复位管脚走全局异步复位路径;

       ASYNCPATHS 避免timing analysis对所有输入IO做时钟周期,输入寄存器路径检查,一般都是定义input_setup参数来影响实际的板级timing。以上两个默认不要改动。

       那,现在这种情况,我们来做静态时序分析之前,记得把map trace ,place &route trace, I/O timing analysis勾选上

Lattice ddr3教程全攻略之时序约束篇_第2张图片

    现在打开:xxx\core\ddr_p_eval\ddr3core\impl\看到

    在这里synplifyprecision lattice所支持的两种综合工具,我当时建立工程时选的是synplify,所以进入到synplify中打开ddr3core_eval.lpf,这个是IP CORE自己生成的约束文件,这个非常有用,要不然IP又不是我们自己写的,我怎么知道哪个路径,IO怎么约束,现在针对于这个约束文件,直接全部复制到ecp3_ddr3.lpf文件。本教程写约束命令都是在这个文件中操作,不在GUI界面,这个请注意。

      现在打开spreadsheet view,查看约束信息,打开后会自动运行PIO DRC,在output中输出一些warningerror要注意分析,这里的信息非常重要。

     打开后发现弹出了很多个error,我的个神,这么多错误那,是不是要抓狂了,别着急,一个个来看error info,要相信这种错误顺藤摸瓜总能够解决。

Lattice ddr3教程全攻略之时序约束篇_第3张图片

 

      错误信息字面上很好理解,就是你约束了这个net,但是timing analaysis工具找不到这个net,说明什么呢?

      拜托,说明你约束的路径指定出错噻。。。

      那么好,找到正确的路径然后修改路径咯。

      这里的路径,指的是模块路径,而不是文件存放路径。

      比如我要解决下面这个错误警告:ERROR - sclk_c matches no clock nets in the design.

1、那么好,首先点击period/frequency按钮弹出如下界面,找到sclk,发现它是在我UUT模块里面的,不在顶层,难怪按照官方的约束好不到这个clock net,那么好,直接关掉,然后去修改ecp3_ddr3.lpf文件,上面所提示的错误挨个这样找到相应的路径,重复N次,然后写到lpf文件中。其中net名称以这里为准。

Lattice ddr3教程全攻略之时序约束篇_第4张图片

Lattice ddr3教程全攻略之时序约束篇_第5张图片

##########################################################################

# Frequency Declerations

##########################################################################

FREQUENCY NET "clk_in_c" 100.0 MHz ;

FREQUENCY NET "sclk_c" 200.0 MHz PAR_ADJ 40.0 ;

FREQUENCY NET "clkos" 400.0 MHz PAR_ADJ 80.0 ;

FREQUENCY NET "sclk2x" 400.0 MHz PAR_ADJ 80.0 ;

USE PRIMARY NET "clk_in_c";

USE PRIMARY NET "sclk_c";

USE PRIMARY NET "clkos";

USE PRIMARY NET "sclk2x";

##########################################################################

# CSM logic preferences

##########################################################################

BLOCK PATH FROM CLKNET "clk_in_c" TO CLKNET "sclk_c" ;

BLOCK PATH FROM CLKNET "clk_in_c" TO CLKNET "*clkos" ;

BLOCK PATH FROM CLKNET "sclk_c" TO CLKNET "clk_in_c" ;

BLOCK PATH FROM CLKNET "*sclk2x" TO CLKNET "clk_in_c" ;

BLOCK PATH FROM CLKNET "clk_in_c" TO CLKNET "*eclk" ;

BLOCK PATH FROM CLKNET "*clkos" TO CLKNET "*eclk" ;

BLOCK PATH FROM CLKNET "*clkos" TO CLKNET "sclk_c" ;

BLOCK PATH FROM CLKNET "*sclk2x" TO CLKNET "*clkos" ;

修改为:

#####################################################################

# Frequency Declerations

#####################################################################

FREQUENCY NET "UUT/sclk" 200.000000 MHz PAR_ADJ 40.000000 ;

FREQUENCY NET "*clkos" 400.000000 MHz PAR_ADJ 80.000000 ;

FREQUENCY NET "*sclk2x" 400.000000 MHz PAR_ADJ 80.000000 ;

FREQUENCY NET "vclk_c" 50.000000 MHz PAR_ADJ 10.000000;

FREQUENCY NET "clk_in_c" 100.000000 MHz PAR_ADJ 20.000000;

FREQUENCY NET "UUT/u_ddr3_sdram_mem_top/clkos" 400.000000 MHz PAR_ADJ 80.000000;

FREQUENCY NET "UUT/u_ddr3_sdram_mem_top/sclk2x" 400.000000 MHz PAR_ADJ 80.000000;

USE PRIMARY NET "clk_in_c" ;

USE PRIMARY NET "UUT/sclk" ;

USE PRIMARY NET "UUT/u_ddr3_sdram_mem_top/clkos" ;

USE PRIMARY NET "UUT/u_ddr3_sdram_mem_top/sclk2x" ;       

#####################################################################

# CSM logic preferences

#####################################################################BLOCK PATH FROM CLKNET "clk_in_c" TO CLKNET "UUT/sclk" ;

BLOCK PATH FROM CLKNET "clk_in_c" TO CLKNET "*clkos" ;

BLOCK PATH FROM CLKNET "UUT/sclk" TO CLKNET "clk_in_c" ;

BLOCK PATH FROM CLKNET "*sclk2x" TO CLKNET "clk_in_c" ;

BLOCK PATH FROM CLKNET "clk_in_c" TO CLKNET "*eclk" ;

BLOCK PATH FROM CLKNET "*clkos" TO CLKNET "*eclk" ;

BLOCK PATH FROM CLKNET "*clkos" TO CLKNET "UUT/sclk" ;

BLOCK PATH FROM CLKNET "*sclk2x" TO CLKNET "*clkos" ;

       以上是修改后的时钟约束命令,FREQUENCY表示约束时钟频率;PRIMARY表示约束成走全局时钟网络,注意哦,lattice ecp3只有八个全局时钟网络,而且有器件位置限制,最后以约束成功为标志。上面vclk_c我工程中的另一个时钟和DDR3无关。注意这里的各个信号的模块路径应该以自己工程模块路径为准,以上只是本人项目中的路径,网友要修改为自己的。下面的修改方式都是以我的工程模块为准的。

       2、修改好时钟后,再来一次place &route design…发现error少了好多,顿时舒服不少,那接着来。

      哦,找不到rst信号,去看看你自己的工程中,复位应该用的不是这个名称,sofix it…

BLOCK PATH FROM PORT "reset_*" ;

       修改后,保存ecp3_ddr3.lpf文件,CHECK PIO DRC后发现没有error

       Oh,yeah….到这里还没完哦,现在只是PIO DRC  OK了,只能说完成50%了。

      3、点击place &route design,再来一次时序分析,等待分析结果分析完成后打开timing analysis view

然后还发现了这么多错误,那么继续找原因了。

Lattice ddr3教程全攻略之时序约束篇_第6张图片

      打开diamond软件下方的warning信息,可以得到很多提示,那一个个来

Lattice ddr3教程全攻略之时序约束篇_第7张图片

上面的提示意思又是没找到COMP,那说明还是路径问题,那么还是继续修改路径:

LOCATE COMP "U1_ddr3_pll/PLLInst_0" SITE "PLL_R35C5" ;

LOCATE COMP "U1_clocking/sync"         SITE "LECLKSYNC2" ;

修改为:

LOCATE COMP "UUT/u_ddr3_sdram_mem_top/U1_ddr3_pll/PLLInst_0" SITE "PLL_R35C5" ;

LOCATE COMP "UUT/u_ddr3_sdram_mem_top/U1_clocking/sync" SITE "LECLKSYNC2" ;

又有:

Lattice ddr3教程全攻略之时序约束篇_第8张图片

 

LOCATE PGROUP "U1_clocking/clk_phase/phase_ff_0_inst/clk_phase0"   SITE "R24C5D" ;

LOCATE PGROUP "U1_clocking/clk_phase/dqclk1bar_ff_inst/clk_phase1a" SITE "R34C2D" ;

LOCATE PGROUP "U1_clocking/clk_phase/phase_ff_1_inst/clk_phase1b"  SITE "R34C2D" ;

LOCATE PGROUP "U1_clocking/clk_stop/clk_stop"                      SITE "R34C2D" ;

修改为:

LOCATE PGROUP "UUT/u_ddr3_sdram_mem_top/U1_clocking/clk_phase/phase_ff_0_inst/clk_phase0" SITE "R24C5D" ;

LOCATE PGROUP "UUT/u_ddr3_sdram_mem_top/U1_clocking/clk_phase/dqclk1bar_ff_inst/clk_phase1a" SITE "R34C2D" ;

LOCATE PGROUP "UUT/u_ddr3_sdram_mem_top/U1_clocking/clk_phase/phase_ff_1_inst/clk_phase1b" SITE "R34C2D" ;

LOCATE PGROUP "UUT/u_ddr3_sdram_mem_top/U1_clocking/clk_stop/clk_stop" SITE "R34C2D" ;

      4、修改好了之后,再来一次place &route design,然后打开timing analysis view

Lattice ddr3教程全攻略之时序约束篇_第9张图片

 

       然后在daamond下面还发现了这个warning

     那还是找不到这个节点,还是路径问题,接着改:

LOCATE PGROUP "U1_ddr3core/U1_ddr3_sdram_phy/read_pulse_delay_0/read_pulse_delay_0" SITE "R13C2D" ;

LOCATE PGROUP "U1_ddr3core/U1_ddr3_sdram_phy/read_pulse_delay_1/read_pulse_delay_1" SITE "R22C2D" ;

修改为:

LOCATE PGROUP "UUT/u_ddr3_sdram_mem_top/U1_ddr3core/U1_ddr3_sdram_phy/read_pulse_delay_0/read_pulse_delay_0" SITE "R13C2D" ;

LOCATE PGROUP "UUT/u_ddr3_sdram_mem_top/U1_ddr3core/U1_ddr3_sdram_phy/read_pulse_delay_1/read_pulse_delay_1" SITE "R22C2D" ;

    5、修改好了之后,再来一次place &route design,然后打开timing analysis view .发现没有了红色高亮信息,perfect…

Lattice ddr3教程全攻略之时序约束篇_第10张图片

    Lattice ddr3教程全攻略之时序约束篇_第11张图片  

     看到了这,你就可以大松一口气了,DDR3 IP内部的的时序约束到此就完成。

       接下来就是绑定管脚,设置IO电平等基础操作,网友自己搞定了。。。

 

       Now.Let me have a tea…

       ….

       ….

       总结:DDR3 IP约束参数是在实例化IP的时候自动生成的,我们只要把它COPY进来,首先找到需要约束的信号处在那个模块路径下,不断修改各个路径到自己的工程模块中,,然后place &route designreport信息,直到没有了高亮信息出现就算完成。

       接下来约束自己的逻辑,一般的设计,都是约束时钟为主,然后看报告有没有违规的逻辑或者路径,然后再反复修改。。。

       Look,so easy…

 

By: BACKKOM

                                                                                                  QQ:784496547

                                                                                                  Date:2014/9/19

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

你可能感兴趣的:(ddr3,时序约束,fpga,lattice)