【发布时间】:2016-08-14 13:04:37
【问题描述】:
我的代码模拟有问题。我有一个由双端口内存组成的异步 FIFO。写入与写入时钟同步执行,读取执行提供我要读取的位置的地址。同步由读写指针执行。
基本上我有这样的东西:
architecture rtl of async_memory is
type RAM is array (MEM_DEPTH - 1 downto 0) of std_logic_vector(DATAWIDTH - 1 downto 0);
signal memory : RAM;
begin
MEM_WRITE:process(clk,rstn)
begin
.....
memory(to_integer(unsigned(addr_wr_i))) <= data_i;
.....
end process;
MEM_READ:data_o <= memory(to_integer(unsigned(addr_rd_i)));
当 MEM_DEPTH 是 2 的幂时,我没有遇到任何问题。当 MEM_DEPTH 不是 2 的幂时,我在为 addr_rd_i 的每条线(读取的地址信号)模拟随机延迟时会遇到一些问题。
需要说明的是,如果我将 MEM_DEPTH 设置为 10,则 addr_rd_i 的宽度为 4 位。 addr_rd_i 的允许值为:
- 0000
- 0001
- 0010
- 0011
- 0100
- 0101
- 0110
- 0111
- 1000
- 1001
其他值会导致课程模拟出错(违反索引约束)。问题是由于延迟,我的数字可能大于 1001。例如,如果 addr_rd_i 是 0111 并且我想读取 1000 ,那么我可能在短时间内有 1111 :
- 0111 -> 1111 -> 1000
现在的问题是:有没有办法避免模拟错误?我想是这样的:
MEM_READ:data_o <= memory(to_integer(unsigned(addr_rd_i)) mod MEM_DEPTH);
我唯一(大)担心的是我可能无法为综合保留相同版本的文件,所以我需要 2 个文件,一个用于综合,一个用于模拟。
【问题讨论】:
标签: vhdl simulation fifo digital-logic