Felix

技术源于积累,成功始于执着!

一个关于Diamond中的Reveal如何选用参考时钟的问题

1
阅读(83) 评论(0)

最近在调试DDR3的时候遇到一个奇怪的问题,经过一段时间的排查定位,最后发现是Reveal引起的,下面来简单地总结一下。

1、问题描述:

在使用Lattice DDR Controller相关IP的时候,一般建议把Clarity或者IPexpress生成的评估工程下面的lpf文件中的约束拷贝过来,稍加修改,添加至自己的工程的lpf文件中。

在相关约束中有这样两句:

FREQUENCY NET "sclk*" 150.000000 MHz PAR_ADJ 30.000000 ;
BLOCK PATH FROM CLKNET "*/clkos*" TO CLKNET "sclk*" ;

都是关于sclk的约束。但是在MAP的时候却报错说找不到sclk*,所以把以上两条约束给Disable掉了。也就是说这两条约束不会对PAR和TRACE产生任何影响。警告如下:

WARNING - map: 
     D:/My_Project/EVDK_Proj/ECP5_ISP/implementation/ECP5_ISP.lpf(10):
     Semantic error in "BLOCK PATH FROM CLKNET "*/clkos*" TO CLKNET "sclk*" ;":
     sclk* matches no nets in the design.  This preference has been disabled.
WARNING - map:
     D:/My_Project/EVDK_Proj/ECP5_ISP/implementation/ECP5_ISP.lpf(347): Semantic
     error in "FREQUENCY NET "sclk*" 150.000000 MHz PAR_ADJ 30.000000 ;": sclk*
     matches no nets in the design.  This preference has been disabled.

百思不得其解,突然想起来工程中好像有Reveal(选用了sclk作为采样时钟),于是乎尝试把Reveal禁止掉,并删除Reveal相关的约束,发现居然好了……

2、问题分析

于是乎,在Strategy中设置Check Unconstrained Connections & Paths,居然也没有找到sclk……消失了……

检查刚才删除的Reveal相关的约束:

rvl_alias "reveal_ist_583" "ddr3_test_top_inst/sclk";

发现Reveal给sclk起了个别名,也就是说sclk消失的原因是其被重命名为reveal_ist_583了……

检查另一个工程,则为:

rvl_alias "sclk" "u_ddr_ulogic/sclk";

因此,另一个工程并不会出现这样的情况。但是问题是这句约束是Reveal自动产生的,什么时候会出现第一种情况(有问题的),什么时候又会是正常的呢?

检查Reveal Troubleshooting Guide.pdf文档,发现如下一段话:

image.png

也就是说,当Reveal选用的采样时钟是内部信号(且不存在于顶层),同时该时钟信号有相关的时序约束时,就可能会发生这样的情况。

3、解决问题

找到了问题了,如何解决呢?

最简单的方法显然是换一个采样时钟,但是对于很多情况下来说,这是不太现实的。

有人可能觉得只需要把

rvl_alias "reveal_ist_583" "ddr3_test_top_inst/sclk";

修改成

rvl_alias "sclk" "ddr3_test_top_inst/sclk";

就可以了,就像另一个工程中的那样。但是实践证明,这样是不行的,因为这句约束是在综合的时候由Reveal自动产生的,强制的修改并没有意义(即使是在综合结束后再去修改,然后再进行MAP,依旧是然并卵)。

在Reveal Troubleshooting Guide.pdf文档中,推荐的解决方法是:

修改

FREQUENCY NET "sclk*" 150.000000 MHz PAR_ADJ 30.000000 ;
BLOCK PATH FROM CLKNET "*/clkos*" TO CLKNET "sclk*" ;

为:

FREQUENCY NET "reveal_ist_583" 150.000000 MHz PAR_ADJ 30.000000 ; // With Reveal
BLOCK PATH FROM CLKNET "*/clkos*" TO CLKNET "reveal_ist_583" ;   // With Reveal

4、Reveal采样时钟选择注意事项

4.1、采样时钟的频率不能太低,至少要大于JTAG的时钟频率;

4.2、采样时钟的频率也不能太高,一般要低于200MHz;

4.3、尽量使用顶层的时钟信号(避免出现本文讨论的问题);

4.4、尽量不要使用门控的时钟信号,保持采样时钟的持续稳定;

4.5、如需不需要持续采样,可以使用Sample Enable,或者合理地设置触发条件(多次触发)。

5、主要参考文档

Reveal39TroubleshootingGuide.pdf

RevealUG_39.pdf