Address collision 指的是RAM的两个port同时访问相同的地址可能导致数据发生错误的情况。在Xilinx中,不同的RAM,不同的RAM配置会导致address collision时不同的数据结果。
Distributed RAM
对于DRAM,写数据是 synchronous write,需要一个时钟周期, 读数据是 asynchronous read,当前时钟周期就能读出数据。因此当在某一个cycle读写同时访问同一地址时,读数据是 old data,即该地址原存放的数据而不是新要写入的数据。
Block RAM
BRAM的读写都是 synchronous。BRAM的两个Port分别为 PortA 和 PortB。
我们可以将 BRAM address collision 分为以下三类。
PortA 和 PortB 同时读数据
两个Port都会正确读出该地址中的数据。
PortA 和 PortB 同时写入数据
该地址最终被写入的数据是 non-deterministic。因此设计中要避免两个port同时写数据的address collision。
PortA 写数据同时 PortB 读数据,或者是 PortA 读数据同时 PortB 写数据
在这种情况下,数据总是会被正确写入到RAM中,但是读出的数据内容则依赖于BRAM的配置。BRAM的write mode可以配置为三种模式,write first,read first 和 no change。
下图为不同配置下的数据读写结果。可以看到当 write port 配置为 READ_FIRST时,不管 read port 如何配置,都会读出 old data。而当 write port 配置为 WRITE_FIRST 或 NO_CHANGE时,不管 read port 如何配置,读数据都是 X,即 undeterministic。因此在可能发生address collision 的BRAM,一般将两个 port都配置为 READ_FIRST,以确保数据读出的正确。
Ultra RAM
URAM的读写也都是 synchronous。URAM比较有意思的一点是,PortA 总是先于 PortB 执行操作,因此在 address collision 我们会看到不同于BRAM的结果。
PortA写,PortB读。PortB 会读出new data。(因为PortA先执行,所以在PortB读执行时,new data已经写入RAM中了)
PortA读,PortB写。PortA 会读出old data。(同样的,这也是因为PortA先执行)
PortA写,PortB写。最终该地址写入的值是PortB的值。(PortB因为后执行会覆盖PortA写的值)
Reference
《UltraScale Architecture Configurable Logic Block》
《UltraScale Architecture Memory Resources》
审核编辑 :李倩
全部0条评论
快来发表一下你的评论吧 !