RAM IP Core中 Write First Read First和No Change的区别

当我们调用RAMO的IP时,无论是单端口还是双端口模式,都会有个选项:

可能很多人都没注意过这个选项,记得毕业季去华为面试的时候,还问过我这个问题,当时也是没答上来。后来也发现很多面试官都喜欢问这个问题,今天我们就来讲一下。

在讲这三种模式具体的区别前,我们先把RAM的接口说一下,对于单端口RAM,有6个端口:

  • clka: 时钟输入端口
  • addra: 地址输入端口
  • dina: 数据输出端口
  • douta: 输出输出端口
  • ena: RAM使能,高有效
  • wea: 写使能,高有效
  • 这三个选项是用来解决读写冲突时使用的,什么是读写冲突?就是对同一地址进行了读写。首先来回顾一下RAM最常被使用的方式,当需要写入数据时,将wea拉高,并给出地址和数据;当需要读数据时,将wea拉低,在地址的下一个周期输出数据。我们都知道,douta端口受addra的控制,它会输出对应地址的数据。那么问题就来了,当写数据的时候,此时douta输出的,是当前地址刚刚写入的数据,还是写入前的数据,或者直接不输出?

    Write First Mode:

    写优先模式,在该模式下,写使能有效时,当前时钟下写入的数据,在下一个时钟就会出现在douta端口上。下图中,在时刻1时,将数据1111写入RAM中,默认douta的数据比地址晚一个周期,因此在时刻2时,1111便会出现在douta上。

    Read First Mode:

    读优先模式,在该模式下,写使能有效时,当前时钟下写入的数据,不会在下一个时钟就会出现在douta端口上。

    下图中,假如地址aa上的数据是0xaa,地址bb上的数据是0xbb,地址cc上的数据是0xcc,在时刻1将数据1111写入到RAM中,但在下一个时钟周期即时刻2时,RAM的输出douta输出的是RAM原来的数据0xbb,而不是上一个时刻写入的1111.

    No Change Mode:

    写优先模式,在该模式下,写使能有效时,输出数据端口douta一直保持不变,不会根据地址的变化而变化。