lattice_ddr3调试经验分享(二)官方testbench分析

  在 lattice_ddr3调试经验分享(一)建立工程与仿真 博客中已经实现工程的建立以及仿真。后来公司还真的需要用lattice的FPGA。所以需要对这个example进行分析了。

         打开 test_mem_ctrl.v 这个就是tb的顶层了。当然,lattice的很多东西和xilinx的没法比,代码质量也是一样的。lattice除了便宜其他都不好。然而.......... 好了,言归正传,不吐槽了。lattice中例化的ddr是没有设置得像xilinx(xilinx用的是官方仿真模型)的模型一样可以在log中看出你的读写时间,读写地址,读写数据,以及命令。lattice的仿真模型像刚毕业的学生写的一样 —— log里啥都没有,一切自己看波形。

         折腾了好久,想自己把镁光官方module放进去,失败!有知道怎么放进去的攻城狮还请赐教了。

        万般无奈之下,还是好好分析lattice自己的example


     平台:

       lattice Diamond3.5 + modelsim10.2c +ecp3 -8 + MT41K64M16TW-107



        1,test_mem_ctrl 这个modelsim中屏蔽掉自己不想要的  monitor,odt_watchdog。

            还有两个

对于325,326两行,是task以及调用task的case。这个写法有些像IC设计的时候做验证的方式。但是我也是做过IC的人,团队中没有人写得这么稀烂过。屏蔽屏蔽!!

        然后自己写个这个东西

好了,初始化成功了。

        这么写肯定会提示reset时间不够,reset到cke的时间不够。先不用管

  init_start为1,IP核还是初始化ddr。然后重点就是这个init_done拉高一个脉冲。init_start一定要在init_done拉高的一周周期后立刻拉低,不然这个IP又来初始化一次。

 还有几个参数需要注意:ofly_burst_len=1,选择BL8模式     

                                      cmd_burst_cnt 这个是命令重复次数。 次数设定在0~32次之间可选。当cmd_burst_cnt =0 你写一次命令,这个IP 就可以重复32次

         

  2,      先写,不过这个不可综合的语句我写的有些复杂

 

 我是随便往里面写了两个数。是不是觉得有些奇怪,为何代码是这样子的。那是因为这个IP里面有一个设定,就是写有效到吃写的数据之间是有latency的,方便大家用fifo。手册上的波形图如下:

然后坑爹的要看波形图了

第一个箭头的地方ddr的cmd为0011 是ACTIVE 。后面就是cmd=0100 WRITE  —— ddr的datasheet上

看到我写入的地方是bank1,row3 ,col=0 。col在波形图上是 0x1000,要知道col只有10bit。 

  写的时候需要注意。这个控制器比较坑爹,因为我这个DDR的data位宽是16bit,也就是每个地址只能存16bit数据,然后这个控制器的data接口就成了64bit。要知道每次写地址会自动益增8,也就是每次你应该放进去的数据为16bit*8=128bit,可是控制器的数据位宽只有64bit —— 少了一半,也就是说你每次写应该写两个数据进去,这无疑是降低了控制器的效率啊。

图中黄线部分后是读取的第一个数,再后面的1122334455667788是第二个数。

 3,读。读的话就比写简单一些

 好了。现在想想怎么把这个模型转换成自己想要的可综合模块吧。

欢迎加入: FPGA广东交流群:162664354

      FPGA开发者联盟: 485678884

原文地址:https://www.cnblogs.com/sepeng/p/6972212.html