fpga timing analysis
各位大侠!
小弟现在遇到一个问题,请各位大侠不吝赐教~
小弟想复用一个memory,但复用的2路信号时不同时钟域的(15M和30M),用一个mux选,但是timing的时候,memory端口上的信号老是会出现问题。小弟想请教:
1、这样复用有实现的可能么?
2、如果可以复用的话,我应该做些什么约束才能让timing analyze通过呢?
谢谢分享!
你应该对15M的电路单独做一个接口,让其和30M的同源,然后再去复用Memory
Memory本身不能解决多时钟域的问题。
谢谢你的建议,可是怎么做接口呢?没太明白。
我觉得是不是应该把15M和30M的电路都用FIFO同步到同一个时钟域下,然后再复用memory
直接用fifo核
直接用fifo内核
可以考虑用类似two port SRAM的memory,读写可以分别采用2个不同的clock,从而解决asyncchronous处理的问题?!
如果你说的复用,是一个口读,一个口写,那么直接用双口异步memory就好了,具体的接口和多时钟域处理,IP已经处理好了。
如果是两个口都是读或者都是写,那么就要把15M的信号通过一个异步接口,换成30M的信号,然后和另外那个30M的口复用memory
这里的异步接口实际上就是30M时钟域接收15M时钟域的信息。怎么做,取决于15M和30M是否同源。
谢谢大家的建议,不过大家讲的都是逻辑上的修改。
我想知道这类问题能否通过在SDC文件里面做一些constraint,从而达到目的呢,因为2个时钟域的信号是不会同时有效的。我用的memory是一个单口的memory。
不能说肯定没有,不过你要是非要往这个方向想的话
恩,万一你成功了,麻烦告诉我你怎么做的。谢谢
单口也要有空满标志,空满标志是读写指针比较(或运算)出来的,既然你读写是两个时钟域,比较就跨时钟域了,窃以为还是要同步的。这只是初步想法,你要能解决请详细点说出来大家学习下
读写操作不是2个时钟同时作用的,ram工作的时候,肯定只有一个稳定时钟作用。
假如我芯片有2个功能都要用ram,且2个功能不会同时工作,但他们跑的时钟是不一样的,为节省ram,我才想复用。
但由于我只是用一个mux去选了一下2个时钟,导致quartus做时序分析的时候出现了时序不满足的情况。
1. 只用一个MUX去gate clock,时序很有可能有问题。即使report timing没报出来。如果非要这么做的话,结合你的读写时序,最好在输出时钟的下降沿切换。
2. 对clock switch处设置set_false_path.
3. 对mux前的两个clock设置 set_clock_groups -exclusive -group {clk_a} -group {clk_b}
我是来学习的
学习了 谢谢
有些日子没上来了, 谢谢大家的意见!
我已经对mux前的2个clock都set_false_path了,而且set_clock_groups这个命令好像功能和set_false_path差不多(个人理解,有错误的话请指出)。
这几天,我分别对2种clock的路径进行了分析,发现有一条路径是15M的clock走,而30M的clock不走,但他确不能满足30M的clock的timing,所以我索性把那条路径整个都set_false_path了。我以为这样的话如果执行15Mclock的function,那条路径完全能满足timing要求,而如果执行30Mclock的function,那么那条路径根本就不用分析了,因为他不会有机会走到。不知道各位觉得这么做会不会有其他问题。
我有个同事建议我用set_case_analysis来做,但好像不行,是不是quartus的那个STA工具不支持这个功能呢?
set_clock_groups与互设set_false_path一样。
把路径设为set_false_path估计是有问题的,因为这样的话,这条路径的时序将不被分析,那又如何保证能满足15M呢?
quartus不支持set_case_analysis语法。
按你前面说法,两个clock和对应的信号都是在最后的memory interface处进行MUX的,那你所说的那条路径又是如何存在?
谢谢~
没有做约束之前,timing不满足是因为有这样一条data path:memory的output信号,经过一些组合时序逻辑之后又回到了memory的input。而这条路径在15M的时候会用到,在30M的时候不会用到,而且STA report文档上写了他的FMAX是28M,不满足30M。所以我想set_false_path之后,满足15M应该是没问题的,至于30M,因为他不会有机会用到这条路径,所以即便不满足也应该不成问题了。
我目前能想到的只有这个方法了。FPGA上不能更改instance的位置来缩短走线,ASIC应该能通过布局来满足这个时序吧?虽然这不是我的工作内容了,但我还是比较担心的,因为可能ASIC上30M会变60M,相差的太大了,会不会怎么布局都满足不了呢。
(1) ASIC做到30M应该没有问题。
(2) FPGA也可以使用logiclock来更改instance的位置。
(3) 若ASIC只是使用到30M的话,可以如下试试:
(a) 更改QuartusII的综合适配的effort。
(b) logiclock锁定适配区域。
(c) 优化那条data path上的组合逻辑。
(4) 若ASIC使用到60M的话,个人觉得实现比较困难,可以尝试更改设计,将这条data path切割为pipeline,其它地方的时序估计也要相应的改一改。
我找不到logiclock。
还有第(3)点的(a)小点的effort做何解释呢?
老实说这是我第一次用quartus建project。
谢谢!
你可以用ALTER QUARTUS 工具中DSE工具对你的工程进行自动的时序优化,最后你根据提示最后选一个适合的策略就可以了。
