1.1 FPGA项目问题 之 RAM的collision

来源:互联网 发布:ubuntu ss 全局翻墙 编辑:程序博客网 时间:2024/06/05 14:23

最近项目碰到个问题,维特比译码仿真的时候,出现了如下情况:

blk_mem_gen_v7_3 collision detected at time: 216430000, A write address: 1, B read address: 5

楼主环境,ISE14.7+自带isim,vivado2016.4


意思是,这个核发生了冲突,冲突原因是,读写的时机冲突。这个代码有一定地可靠性,因为实际项目都跑过。经过查阅书籍,发现一丝端倪。

一:Block Mem介绍

主要介绍RAM,因为ROM就是读没啥问题。模式方面,主要有如下几个模式

SP模式:单端口,要么读要么写,不会发生冲突。

SDP:简单的双端口RAM,A Port只写,B Port只读,支持同时地读写操作。但是,当读操作和写操作同时对同一个地址单元时,SDP的输出或者是不确定值。

TDP:真正的双端口,上边的AB都支持读写,两个同时读,两个同时写,都可以。当两个端口同时向同一个地址写,写冲突会发生,存储是未知的。WEA、WEB为高,则是写,低是读

另外两个ROM先不介绍。

本项目是采用SDP模式,然后会有同时读写的情况。因此会出现仿真中的警告(modelsim,vivado也会有这个警告)有点模糊,这是书上说的冲突部分。(一点疑惑,他说的是地址重合,而这个warning并不一定地址重合,而是同时读写,或喜欢这个冲突直接是error吧)

意思就是,当clk不同源的时候,且读写地址为同一个时,会发生冲突。

另外书上推荐,对于同一个时钟驱动的RDCLK和WRCLK,SDP模式,使用Read_first。假如是不同时钟,请使用Write_first模式。

在 WRITE_FIRST 模式下,输入数据同时写入存储器并存入数据输出(透明写)

在 READ_FIRST 模式下,原存储在写地址的数据出现在输出锁存器上,而输入数据则存入存储器(先读后写)。

在 NO_CHANGE 模式下,输出锁存器在写操作过程中保持不变。


二。查阅官方手册

看到了针对IP核某一个选项的解释。


我的理解是:默认不勾选,意思就是,你可能同步,也可能不同步,我就都给你warning。但要是你是肯定同步的,通过勾选那个disable,是可以不显示warning。

而我们的项目是synchronous clk,同源的,因此,可以通过勾选这个,来消除warning。

还有一个可以解决的办法,应该就是TDP了。


2017.9.1更新

去研究所调试了,vivado下,有的处理方式和上文一致

有的,在配置界面会存在一个叫“common  clk”,鼠标放在上面会提示你,假如你的CLKA,CLKB是同一个是中,请勾选上,在勾选这个之后,仿真就不会出现warning了。