1.1 FPGA项目问题 之 RAM的collision
最近项目碰到个问题,维特比译码仿真的时候,出现了如下情况:
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了。