mem_test.v
mem_test模块是一个通用的外部RAM测试模块,主要功能是先把整个存储器写入数据,再读出对比,为了能够充分测试外部存储器的数据正确性,每次写入相同地址数据是不能相同的,模块设局一个计数器计数写入次数,再把地址和写入次数相加,写入相应的存储单元,再读出对比,如果有一个数据错误error信号会变高,直到有复位才变低。heartbeat信号用于指示测试真该进行,如果测试在进行,heartbeat会不断的跳变。
其中rd_burst_req;wr_burst_req;rd_burst_len;wr_burst_len;rd_burst_addr;wr_burst_addr;
rd_burst_data_valid;wr_burst_data_req;rd_burst_data;wr_burst_data;rd_burst_finish;
wr_burst_finish;都是与sdram_core这个模块相连接的。
而error,heartbeat是直接输出到IO的。
IDLE→MEM_WRITE(每次写BURST_SIZE长度的数据,在sdram_core这个模块中模式寄存器中设置的sdram突发长度为1,写完之后将{wr_burst_addr+BURST_SIZE}作为sys_addr继续连续写BURST_SIZE长度的数据,其中sys_addr[SDR_COL_WIDTH+SDR_ROW-1:SDR_COL_WIDTH]作为新的行地址,{4’b0000,sys_addr[8:0]}作为新的列地址,直到[ADDR_BITS-1]wr_burst_addr的地址满)→MEM_READ(同写MEM_WRITE)→MEM_WRITE。
expect_read_data是设定的也是写入当前地址的数据。
read_burst_data 是在当前地址实际读出的数据。
当在测试读的时候,并且在数据有效时,将两个数据进行比较,如果不同则报错,error置1,只有当复位信号出现的时候,error才会置0。
heart_beat不断的跳变说明测试正在进行中,当写入的数据加上读出的数据累计的数量超过99999999,heart_beat跳变一次。
test_cnt,在后面的状态机设计中可以看出,每次将[ADDR_BITS-1:0]write_burst_addr/
read_burst_addr写满之后,test_cnt加1。
wr_data_pre_add/rd_data_pre_add:在当前burst_length长度的数据中此值是相同的。
在sdram_core这个模块中我们已经了解wr_burst_data_req是写数据请求信号,
而wr_burst_finish标记着写完一次长度为BURST_SIZE的数据。
同理rd_burst_data_valid和rd_burst_finish也是一样的功能,wr_cnt/rd_cnt是对这个数据长度的每一个数据计数(起到标记作用,区分相邻的数据)。
看这段verilog需要结合状态机的那一段描述。当wr_burst_finish/rd_burst_finish信号为1时,
next_wr_burst_addr/next_rd_burst_addr赋给wr_burst_addr/rd_burst_addr。
※wr_burst_addr并不仅仅是赋给在sdram_core模块中的读写操作中的列地址,也要给sdram_core模块中的ACTIVE(激活操作)赋给行地址。
系统默认进入IDLE状态,在下一个时钟进入MEM_WRITE状态,wr_burst_req置1,
wr_burst_len也被赋值为BURST_SIZE(一次连续要写的数据长度)。
这里最重要的就是判断next_wr_burst_addr==ZERO{ADDR_BITS-1:0],就是如果这个寄存器写满后,进入到MEM_READ状态,并将read_burst_req置1。