DDR3控制器 1;

测试点1:aximaster对controller的写地址FIFO写满、写数据FIFO写满;
DDR3控制器 1;_第1张图片
当awfifo写满后awready不会拉高,当wfifo写满后wready也不会拉高;

测试点2:axi 对arfifo写满,写满后无法写入;
这里可以ARFIFO的虚满信号对outstanding的个数进行配置
DDR3控制器 1;_第2张图片

测试点3:在axi的写地址队列,或者写数据队列中插入axi的读地址队列;在axi的读地址队列中插入写地址队列。
DDR3控制器 1;_第3张图片
测试点4:这里是采用轮询机制对AWFIFO和ARFIFO进行取数据到bank队列中。AWFIFO、WFIFO和ARFIFO中取数据写入到相应的bank队列中,同时WFIFO写入到相应的space空间中,space空间写满则不能够在将AWFIFO中的指令写到相应的bank队列中,但是可以将ARFIFO中的命令写到bank队列中去;
DDR3控制器 1;_第4张图片

测试点5:bank里面的队列排序,对于才进入队列的指令需要对其排序,使得DDR的效率更大,对于同bank新进入的队列指令,采用比较是否在相同行,如果在时相同行指令则可以直接将指令放在其相同行的后一行和不同行的前一行之间;如果新进的指令与队列的指令都不相同,则直接放在最后一行;同时为了防止饿死,即新进的指令永远能够插队,即在最后指令之前,那么最后的那条指令得不到执行。所以设置4个指令单位进行防饿死,在连续四个指令都和第一个指令有相同行时,第五个指令将插在队列最后;
讲一讲防饿死代码:从队列的最后开始进行判断,不能从最开始进行判断,这样可以防止间隔插入的情况发生(即连续四次都在第一和第二和排序队列中插入,第五次插入到末尾(第一和最后相同的情况),如果从最开始判断,假如是和第一相同行又得在第一和第二之间插入,显然这是不合理的,没有起到饿死机制;从最后遍历走,假如第一和最后相同那么直接在最后插入就可以,显然能够起到防止饿死的作用)。
DDR3控制器 1;_第5张图片
测试点6:测试队列的排序功能,只进行了简单的测试。测试CASE如下:
排序思路如下同测试点5讲解
DDR3控制器 1;_第6张图片
modelsim:仿真如图所示;
DDR3控制器 1;_第7张图片

***测试点7:***当awfifo或者arfifo预输出的地址在对应的bank为满时需要停止请求信号以及停止进行优先级的判定;
先看看测试代码:箭头对应的3’b000代表bank0。先对bank0写4个指令,然后在对bank0写一个指令看能否写入、能否有优先级判定。
DDR3控制器 1;_第8张图片
DDR3控制器 1;_第9张图片
这里axi输入的地址我给的格式是:高四位保留,你也可以用作他用。这个得根据你的sdram的配置文件来看。BA代表BANK;4’b1110代表ARID或者AWID,写就是AWID,读就是ARID;
在这里插入图片描述
看波形哈:将就看,太难得解释了
DDR3控制器 1;_第10张图片
DDR3控制器 1;_第11张图片
DDR3控制器 1;_第12张图片
测试点8:从awfifo读取数据时,需要我们也从相应的wfifo中读取未来要写到DDR的数据并将其写入到SPACE这个同步FIFO里面,同时需要对从WFIFO中取出的数据赋予相应的BUFFERID标志,以便于从BANK的写数据指令能找到对应的SPACE空间。

space[0]:
axi对wfifo写入的burst的第一个数据和最后一个数据:
DDR3控制器 1;_第13张图片
写入的最后一个数据:
DDR3控制器 1;_第14张图片

space空间0写入的数据:
写入的第一个数据:
DDR3控制器 1;_第15张图片

写入的最后一个数据:
DDR3控制器 1;_第16张图片
可以看出能够将wfifo的一个BURST数据完整的取出来放在某一个SPACE空间里面;
同时能够正确将buffer_id给到bank队列里面;
DDR3控制器 1;_第17张图片
DDR3控制器 1;_第18张图片
后面同理。

测试点8:当space0-space7 空间写满之后,也不能从awfifo中拿出数据到bank队列中进行存储,但是如果只要arfifo预存取的数据对应的bank队列没有满(此时不管space0-sapce7空间是否满没有)就可以存入bank队列里面。
DDR3控制器 1;_第19张图片
DDR3控制器 1;_第20张图片
DDR3控制器 1;_第21张图片

DDR3控制器 1;_第22张图片

DDR3控制器 1;_第23张图片

你可能感兴趣的:(DDR3,verilog)