一个关于Diamond中的Reveal如何选用参考时钟的问题
1赞最近在调试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文档,发现如下一段话:
也就是说,当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
6、推荐阅读
http://www.cnblogs.com/xiaozhuge/p/5636384.html