Lattice ddr3教程全攻略之时序约束篇
在看这篇教程之前,建议先看看我的《Lattice ddr3教程全攻略之仿真篇》,假定你自己的工程仿真好了,自己的代码综合编译通过,但是呢,在“place &route design”的时候过不了,或者出现了一大堆莫名其妙的错误,让你抓狂的时候,那,怎么办呢?
这就是这篇教程的作用,让你的DDR3设计完成时序约束。。。
Now,Let’s begin…
我的文件目录:
如果你刚刚仿真完,用的自己建立的工程的话,那么打开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勾选上
现在打开:xxx\core\ddr_p_eval\ddr3core\impl\看到
在这里synplify和precision 是lattice所支持的两种综合工具,我当时建立工程时选的是synplify,所以进入到synplify中打开ddr3core_eval.lpf,这个是IP CORE自己生成的约束文件,这个非常有用,要不然IP又不是我们自己写的,我怎么知道哪个路径,IO怎么约束,现在针对于这个约束文件,直接全部复制到ecp3_ddr3.lpf文件。本教程写约束命令都是在这个文件中操作,不在GUI界面,这个请注意。
现在打开spreadsheet view,查看约束信息,打开后会自动运行PIO DRC,在output中输出一些warning和error要注意分析,这里的信息非常重要。
打开后发现弹出了很多个error,我的个神,这么多错误那,是不是要抓狂了,别着急,一个个来看error info,要相信这种错误顺藤摸瓜总能够解决。
错误信息字面上很好理解,就是你约束了这个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名称以这里为准。
##########################################################################
# 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信号,去看看你自己的工程中,复位应该用的不是这个名称,so,fix 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
然后还发现了这么多错误,那么继续找原因了。
打开diamond软件下方的warning信息,可以得到很多提示,那一个个来
上面的提示意思又是没找到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" ;
又有:
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
然后在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…
看到了这,你就可以大松一口气了,DDR3 IP内部的的时序约束到此就完成。
接下来就是绑定管脚,设置IO电平等基础操作,网友自己搞定了。。。
Now.Let me have a tea…
….
….
总结:DDR3 IP约束参数是在实例化IP的时候自动生成的,我们只要把它COPY进来,首先找到需要约束的信号处在那个模块路径下,不断修改各个路径到自己的工程模块中,,然后place &route design看report信息,直到没有了高亮信息出现就算完成。
接下来约束自己的逻辑,一般的设计,都是约束时钟为主,然后看报告有没有违规的逻辑或者路径,然后再反复修改。。。
Look,so easy…
By: BACKKOM
QQ:784496547
Date:2014/9/19