参考文档:UG473,PG058
碰撞(冲突)行为
Block Memory Generator核支持双端口RAM实现。 每个端口都是等效且独立的,但它们访问的是同一块内存空间。 在这种安排中,是否可能发生数据的冲突呢。
1.异步时钟冲突
使用异步时钟读写时,当一个端口将数据写入一个内存位置时,另一个端口不可在某一指定的时间内读取或写入该位置。 该时钟到时钟(clock-to-clock)的建立时间在器件数据手册中定义。
2.同步时钟冲突
同步时钟会导致许多特殊情况下的碰撞情况,如下所述。
- 同步写Write-Write冲突:如果两个端口都试图去写存储器中的同一地址(准确说是同一位置)的存储单元,就会发生Write-Write Collision。这样的后果就是内存中该位置的内容是未知的。
请注意,与只影响数据输出,不影响存储器内容的Write - Read冲突相反,写 - 写冲突会影响存储器内容。
- 使用Byte-Write:当使用Byte-writes时,如果在同一数据字中写入单独的字节,则不会损坏存储器内容。 仅当两个端口尝试写入相同的字节时,RAM内容才会损坏。 图3-15说明了这种情况。 假设addra = addrb = 0。
- 同步Write-Read冲突:
这种同步写-读冲突的情况发生在两个端口(要留意!!!):一个端口试图写数据到某一个存储单元,而另一个端口要读这一个单元。 在写 - 读冲突中存储器内容未被破坏时,输出数据的有效性取决于写端口操作模式。
(1)若写端口工作在READ_FIRST模式,则另一端口可以正确读取原有的存储器中的内容。
(2)若写端口工作在WRITE_FIRST模式或NO_CHANGE模式下,则读端口输出的数据就是无效的。
(3)在使用Byte_Write的情况下,
图3-16描述了Write-Read以及byte-write的影响。图中分别展示了读端口分别在写端口在WRITE_FIRST模式和READ_FIRST模式下,DOUBT的输出情况。这里假设读写地址都为0,并且B端口的读使能一直有效(Always Enabled),所有存储位置都被初始化为0,RAM中的数据在写-读冲突中永不被破坏。
3.简单双端口RAM的冲突
对于简单双端口 RAM而言,无论时钟如何(即不管同步还是异步??)三种操作模式都可以使用。需要注意的是,AXI接口类型中的操作模式不可选。
简单双端口RAM一段只写不读,而另一端口只读不写。这就好像是真双端口RAM中,A端口只连接的写接口,而B端口中只连接了读接口。这时,操作模式定义了A端口(或B端口)中的Write-to-Read关系,并且只会在 地址冲突期间 影响A端口与B端口之间的关系。
同步时钟下发生的冲突期间,可以配置端口A的写模式,以便端口B上的读操作产生数据(像READ_FIRST一样),或产生未定义的数据(X)。因此,当配置为简单双端口RAM(SDP RAM)时,始终建议使用READ_FIRST。
对于异步时钟,Xilinx建议将端口A的写模式设置为WRITE_FIRST以确保冲突安全。
对于7系列器件,当RAM_MODE设置为TDP时,所选的工作模式将传递到Block RAM。对于RAM_MODE设置为SDP的原语,写模式为READ_FIRST用于同步时钟,WRITE_FIRST用于异步时钟。
对于基于UltraScale架构的器件,没有任何限制,所选的工作模式总是传递给Block RAM原语,而与时钟无关。
4.Additional Memory Collision Restritictions:Address Space Overlap(地址空间重叠)
7系列FPGA的Block RAM存储器在以下配置的情况下具有其他的冲突限制:
- 当配置为TDP模式下;
- 当CLKA(PORTA)核CLKB(PORTB)是异步的时候;
- 在同时执行读写操作时候;
- 当端口A,端口B或两个端口的Write Mode配置为READ_FIRST时。
当使用Write Mode= READ_FIRST(TDP-RF模式)的TDP存储器和异步时钟时,请参见7系列FPGA存储器资源用户指南(UG473)的“冲突避免”部分。
UG473
Conflict Avoidance
7系列FPGA中的Block RAM是True Dual Port RAM,即两个端口中在任何时间都可以访问任何位置。但是,从两个端口访问相同的内存位置时,必须遵守某些限制。
有两个完全不同的情况:两个端口要么具有公共时钟(同步时钟),要么两个端口的时钟频率和相位不同(异步时钟)。
(1)异步时钟
异步时钟是更为常见的情况,两个时钟的有效沿不是同时发生:
- 两个端口执行读操作时没有时序限制。
- 当一个端口执行写操作时,另一个端口不能读取或写入访问相同的内存位置。 因此,在真正的异步应用程序中应避免使用READ_FIRST模式,因为无法保证将读取旧数据(在TDP和SDP模式下)。 当异步时钟可能会导致对同一端口地址同时进行读/写操作时,WRITE_FIRST模式是推荐模式。 如果违反此条件,仿真模型会产生错误。 如果忽略此限制,则读取或写入操作会产生不可预测的结果。 但是,设备没有物理损坏的风险。 如果依旧执行读取和写入操作,则写入操作会将有效数据存储在写入位置。
(2)同步时钟
同步时钟是特殊情况,两个端口时钟的有效边沿同时发生:
- 同步时钟定义为两个时钟输入引脚由同一时钟驱动。
- 两个端口执行读操作时没有时序限制。
- 当一个端口执行写操作时,另一个端口不能写入相同的位置,除非两个端口都写入相同的数据。
- 当一个端口执行写操作时,写操作成功; 如果写端口处于READ_FIRST模式,则另一个端口可以可靠地从同一位置读取数据。 然后两个端口上的DATA_OUT反映先前存储的数据。
- 如果写端口处于WRITE_FIRST或NO_CHANGE模式,则读端口上的DATA_OUT将变为无效(不可靠)。 读取端口的模式设置不会影响此操作。