微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > FPGA,CPLD和ASIC > 求教:XILINX:DDR3 IPCORE--MIG

求教:XILINX:DDR3 IPCORE--MIG

时间:10-02 整理:3721RD 点击:
最近刚开始使用V6的开发板---ML605,想用一下DDR3,调用了IPCORE--MIG后,发现生成很多端口变量以及参数,但不知道这些端口变量都代表什么意思,也不知道怎么用,请高手帮忙告诉我怎样先用modelsim做做仿真,不胜感激!

XILINX生成的IPCORE是自带仿真平台的,生成的目录里面有一个\example_design\sim目录,里面包含着可用于仿真的代码,你只需按照该目录下readme.txt文件的指示,在medelsim里面运行sim.do文件就可以了。

又见ML605板。 小编,你先看看XILINX的UG吧。去xilinx的网站搜UG406,下下来先看看。另外,ML605应该有附带的光盘的,上面有参考设计,还有相关文档,把DDR3相关的先看看吧。还有就是跟楼上说的一样sim.do,先把仿真跑起来,有个波形看着比什么都方便。
你这样直接上来问端口参数是什么意思,我们回答你的问题都很纠结。



    好的,多谢指导!我试试看。



    因为刚开始用,问题问的不专业,还请见谅,你的指导很有用,下来我会再看看这些东西,希望以后能和你多交流。



    还有一个问题需要请教,仿真所用的tb文件---sim_top_tb.v,在其中有例化ddr3_model.v模块,而在该ddr3_model.v模块中,有`include"xx.vh"这样一行代码,其中xx.vh文件定义了各种parameter为ddr3_model.v所用,可是每次modelsim运行时都会报错:“cann't open ......xx.vh”,将该文件复制到modelsim路径下,虽然不再显示“cann't open ......xx.vh”,但依然报错:dr3_model.v中的变量没有定义,这个就难住我了,请求指教一番。



    小编在Modelsim中导入xilinx库了吗?



    最近也在学习ML605的开发板,很多地方也在摸索中,慢慢来~

把ddr3_model.v 还有那个什么....vh 文件放到你的仿真sim目录下面,跟你的work库一级的那个目录。



    lucien_1986大侠,启动modelsim后,运行sim.do之后,现在仿真貌似是做起来了,有几个小问题还需要请教一番:
    1.init_mem_pattern_ctr.v模块,依照datasheet的意思是:“为traffic generator 产生 flow control logic”,这里的 flow control logic,我直译为---流控逻辑,但不知是怎么理解,是什么意思?
    2.在init_mem_pattern_ctr.v模块中,变量“vio_data_mode_value”被设定为2,看解释说“当vio_data_mode_value=2时,The address is used as the data pattern”,我直译为“该地址被用作数据模式”,想问的就是这地址被用作数据模式是什么意思呀?
   3.在mem_ui_ip_top.v模块中,用户可以控制的端口变量,是以app_xx的变量,而输出的关于ddr的变量则是ddr3_xx,我笨想应该是先有app_xx这些变量的输入,然后才有ddr3_xx这些变量的输出,但是根据仿真结果ddr3_dq,ddr3_dqs,ddr3_cas_n,ddr3_ras_n等等,输出端口变量,竟然在app_addr,app_ba等变量出现之前,就已经有数据变化了,这种情况,请问遇到过没有,怎么解释呢?或者说我理解错了。
   希望您早点看到这些问题,并不吝赐教,谢谢了。



     为了尽早解决问题,同样的问题也问问 catcat_2大侠,就是启动modelsim后,运行sim.do之后,现在仿真貌似是做起来了,有几个小问题还需要请教一番:
    1.init_mem_pattern_ctr.v模块,依照datasheet的意思是:“为traffic generator 产生 flow control logic”,这里的 flow control logic,我直译为---流控逻辑,但不知是怎么理解,是什么意思?
    2.在init_mem_pattern_ctr.v模块中,变量“vio_data_mode_value”被设定为2,看解释说“当vio_data_mode_value=2时,The address is used as the data pattern”,我直译为“该地址被用作数据模式”,想问的就是这地址被用作数据模式是什么意思呀?
   3.在mem_ui_ip_top.v模块中,用户可以控制的端口变量,是以app_xx的变量,而输出的关于ddr的变量则是ddr3_xx,我笨想应该是先有app_xx这些变量的输入,然后才有ddr3_xx这些变量的输出,但是根据仿真结果ddr3_dq,ddr3_dqs,ddr3_cas_n,ddr3_ras_n等等,输出端口变量,竟然在app_addr,app_ba等变量出现之前,就已经有数据变化了,这种情况,请问遇到过没有,怎么解释呢?或者说我理解错了。
   同时也希望您早点看到这些问题,并不吝赐教小弟,多谢了。



    问题一,flow control logic你可以理解为数据流控制逻辑,其实就是控制traffic generator 产生数据的时序和内容。要更准确的翻译,我也说不好;
    问题二,The address is used as the data pattern的意思往DDR3的一个地址内,写入一个数据,这个数据就是地址本身,这样每个地址内的内容就是地址本身,可以很方便的用来检验设计的正确性。
    问题三,在app_xx变化之前ddr3_xx就变化的原因是,DDR3 控制器CORE在初始化阶段会访问DDR3,testbench里面有些逻辑也有可能会访问DDR3,因此ddr3_xx未变化之前,ddr3_xx就跳变了。

    欢迎相互交流,如果给我的帖子我没有及时回复,可以给我发消息哦,我经常会看短消息的!

都有一个EXAMPLE的,包括实现,仿真等。


     前面两个问题就是13楼说的那个意思。第3个问题,补充一下:
      3.在mem_ui_ip_top.v模块中,用户可以控制的端口变量,是以app_xx的变量,而输出的关于ddr的变量则是ddr3_xx,我笨想应该是先有app_xx这些变量的输入,然后才有ddr3_xx这些变量的输出,但是根据仿真结果ddr3_dq,ddr3_dqs,ddr3_cas_n,ddr3_ras_n等等,输出端口变量,竟然在app_addr,app_ba等变量出现之前,就已经有数据变化了,这种情况,请问遇到过没有,怎么解释呢?或者说我理解错了。
     ddr3_xx这些信号是phy层输出到ddr3 sdram 的。确实是根据用户层的ui接口,就是app_xx这些变化而变化的。但是,你要注意UI接口有一个信号叫xxx_init_done。ddr3 在启动过程中有一个initial & calibration的过程,这个过程要配置片外ddr3 sdram 的一些寄存器,还要校准其与IP之间的一些参数,过程比较复杂,你可以参考jedec的jesd79-3d.pdf,论坛上有下。仿真也是需要的,IP CORE本身的顶层有两个参数也是与之相关的。在这个过程中,phy 层会自动输出相关的信号组合去 initial & calibration ddr3 sdram,所以ddr3_xx就在app_xx之前变化了。initial & calibration 成功完成之后,xxx_init_done就会变成高电平,app_xx在xxx_init_done变高之后才可以动作。在这之后,就是你说的“应该是先有app_xx这些变量的输入,然后才有ddr3_xx这些变量的输出”。



    真心感谢您的及时回复,真的受益颇深。谢谢。以后可能还会经常向您求教的,希望您一如既往的分享您的经验,多谢!



    lucien_1986大侠,发自真心的感谢您的帮助,我短消息给您了,不知道能否收到,您的答复每次帮助都很大,再次谢谢了。还有一个小问题需要麻烦您:就是我看到26位的地址变量app_addr每次的递增变化时64,即0-64-128-192...,数据变量app_wdf_data,app_rd_data为256位,仿真出来时有一个控制各个命令的使能信号app_en,总是不规律的时不时拉高拉低,这就导致有的64个地址空间内,app_en信号拉高一个时钟,貌似写入一个256位数据,有的64个地址空间内,app_en信号持续拉高好多时钟,貌似写入很多个256位数据,这就很难理解到底一个地址内写入多少数据呢?请求指教!



    app_en信号在同一个地址的访问中拉高多次的原因是:app_en不是一次就能写成功的,如果没写成功就要写第二次。判断第一次app_en有没有写成功的方法是,看app_en为1时(有效),app_rdy是否同时为1。若同时为1则写成功,否则就是写失败,要重写一次。


你好,看了你和catcat_2最近的帖子收获颇丰,我有点设计问题也想咨询下你们
请问你们在将DDR3-IP用在板子上时,IP的ODT功能都是如何设置的?ODT对于高速DDR3器件的信号完整性影响大不?
还望不吝赐教!谢谢



回复 18# lucien_1986

    好的,明白,我今天看了一下午UG406,确实如您所说,app_rdy信号也是很重要的。关于地址值直接作为数据写入,我还有一点疑惑得麻烦您,我都不好意思了, .当app_cmd=3'b000时,进行写操作,app_rdy,app_en,app_wren,三个信号同时高电平时,数据将写入,按照 “地址值直接作为数据值”“app_addr” 应该 = “ app_wrf_data”,但是我看到的仿真结果并不是这样的,很奇怪;而且当app_cmd=3'b001时,进行读操作,我理解的是应该有地址输入,否则不知从哪个地址读出数据,但仿真结果显示app_addr依然如同写数据时一样,在之前写操作的地址基础上一如既往的进行递增 ,与此同时app_rd_valid信号拉高, app_rd_data有数据输出。但是我认为连地址都没正确给入,这个数据到底是哪来的呢?谢谢您。



    真不好意思,我帮不上你。这个波形图比较小,很难看清楚细节。自带的仿真实例应该是不会有问题的,你可以仔细阅读一下UG406关于DDR3用户接口侧信号的描述,不知道对你有没有帮助。



    一般ODT的设置只要用XILINX IP给出默认值就行了,或者查询DDR3芯片关于ODT值的要求。正确的设置ODT对于信号完整性还是非常重要的,阻抗匹配没有做好很容易出现误码的情形。
    PS,我对硬件知识的了解很有限,对于ODT的具体工作原理不熟,热切希望各位懂硬件的大侠给个点评!



    行,我再看看,多谢您的帮助。



    catcat_2大侠,我还得再问您几个问题:
      1.app_wdf_end的作用:“This signal indicates the last cycle of data on app_wdf_data for the current write”。字面意思好像是说:“这个信号表明app_wdf_data的最后一个周期的数据,为当前的写数据”,不能正确理解这句话,不可能只把一个数据写进去吧?
      2.由问题1 引发了,到底64个地址空间内(app_addr),写入了几个256位数据app_wdf_data?
      3.今天看datasheet讲write commands这块,
          出现“A non back-to-back write command...”,针对这种non back-to-back,几个信号变量出现了三种情况:i.  app_wren,app_wdf_end,对应app_en,app_rdy同时拉高。   ii.app_wren,app_wdf_end,提前app_en,app_rdy拉高(提前几个时钟还是一个小问题)。  iii.app_wren,app_wdf_end,落后app_en,app_rdy最多两个时钟拉高。
       "back-to-back write command..."针对这种情况,我看到app_wren,app_wdf_end,app_en,app_rdy等信号都是比较整齐对应的。
     所以现在就不理解,这“non back-to-back ”与“back-to-back ”的区别,也不知道,自己应对应哪种情况。
     问题有些杂,也有些零碎,多见谅,谢谢了。



    恩,谢谢!因为我这边的控制器是自己写的,只是用了IP的DDR PHY,控制器暂时没有ODT输出的逻辑(简单看了下协议感觉ODT的处理比较麻烦,并且仿真也没法仿)。我现在的设计是把ODT拉零,经过了随机业务的仿真,也在ML605上做过简单的读写校验测试,就是怕将来做板子后速率上来信号质量不行。


你好,我没用过这个IP的接口,不过DDR控制器接口设计应该都是差不多的
问题1,2: 这个信号的作用是告诉接口该拍是这次写操作的最后一次写数据,接口一次写操作地址可以有多拍写数据(具体的容量需要看接口的地址映射和缓存容量等),等到进入控制器后再将该请求分成DRAM多次写命令
问题3:没看过接口波形不大好说,不过感觉BACK-TO-BACK应该指的是写数据的连续,当写接口满时READY会拉低,造成无法连续写数据即NON BACK-TO-BACK WRITE 。其实这两种情况都是正常的,你在适配时根据READY信号状态来发你的写操作就行了。
希望对你有帮助



       ODT 我用的是IP的默认设置,基本没有太调整这个东西的设置。我记得jedec的standard里面有具体讲这个信号该怎么用的, align到协议上比较有说服力。用ODT的话,板子上貌似可以少几个电阻。不过如果是设计IP的话,我觉得如果开发时间紧迫的话,你就可以,直接关掉,跟你说的一样,让硬件的自己去做这个消反射电阻,跟他们说,不好意思时间太紧,偶没做这个。如果不紧迫,那你可以做一个带使能的odt,需要的时候打开,不需要的时候关掉就可以了。
      ODT 是消信号反射的,好像是从ddr2开始有的。因为sdram的连线比较多,每条线上貌似都要有。你知道DQS, DQ 线在布PCB的时候有什么走线等长的要求,保证信号延时一致,所以就需要蛇形走线。这对于布PCB的人来说就是折磨,如果再让放电阻,他们要疯的。尤其是如果放到电脑主板上,就占了很多空间,主板本来就是要求很高的。所有后面就把这个电阻放到了DDR2里面,通过DDR2 的MR寄存器去配置ODT的阻值。
      对于信号完整性的影响,我个人觉得满重要的,但是说实话我没跟硬件的人一起调过这个。如果sdram要跑到400MHz,ddr3要到800,1600,我觉得这个就很重要了,毕竟这么高的频率下,反射是一定要处理好的。你可以找你们那边硬件做过这个人的人讨论下,看看他们什么想法。



     1.app_wdf_end的作用:“This signal indicates the last cycle of data on app_wdf_data for the current write”。字面意思好像是说:“这个信号表明app_wdf_data的最后一个周期的数据,为当前的写数据”,不能正确理解这句话,不可能只把一个数据写进去吧?
------------------------------------------------------------
       这个信号是对齐到最后一个有效数据的那个周期的。不是说只写一个周期的数据。一般写数据至少是两个clock cycle吧(没有反压的情况下),app_wdf_wren指示有效数据,跟有效数据对齐。app_wdf_end 这个信号在后面第2个cycle有效,没有反压就只持续一个cycle。xilinx的UG 上应该有它的时序,你查下。
    2.由问题1 引发了,到底64个地址空间内(app_addr),写入了几个256位数据app_wdf_data?
        如果是BC4,burst chop 4,UI DATA WIDTH = 256,那只写一个256。如果是BL8,burst length=8,那写两个。
    3.今天看datasheet讲write commands这块,
       出现“A non back-to-back write command...”,针对这种non back-to-back,几个信号变量出现了三种情况:i.  app_wren,app_wdf_end,对应app_en,app_rdy同时拉高。   ii.app_wren,app_wdf_end,提前app_en,app_rdy拉高(提前几个时钟还是一个小问题)。  iii.app_wren,app_wdf_end,落后app_en,app_rdy最多两个时钟拉高。
       "back-to-back write command..."针对这种情况,我看到app_wren,app_wdf_end,app_en,app_rdy等信号都是比较整齐对应的。
     所以现在就不理解,这“non back-to-back ”与“back-to-back ”的区别,也不知道,自己应对应哪种情况。
-------------------------------------------
      app_en, app_cmd, app_rdy, app_addr 这4个,你可以理解为地址总线,app_wdf_wren, app_wdf_data, app_wdf_end, app_wdf_rdy你可以理解为写数据总线。两条总线是相对独立的,两个反压信号app_rdy和app_wdf_rdy也是独立的。你就想像ip里面有两个fifo,一个放地址,一个放数据,fifo 快满了,ip 就会反压你,让你不要写了。当然实际肯定不一样,还有自刷新周期什么的。
        先说back-to-back,这种写法就是地址写地址的,数据写数据的。但是每一个地址对应了两个数据,对应关系不能乱,先写进去的addr a,对应数据a0, a1。总数也不能乱,写了N个地址,就要写2N个数据进去。然后,处理两个反压信号也是独立处理的。这个应该很好理解。就是说你在数据量比较大的时候,你可以这么写,但是对应关系要明确。figure 1-63,1-64画的比较理想,没有反压。有反压的时候,地址和数据的反压是独立处理的。
        scattered,这个是分散的。一个burst写完,再写下一个burst。figure 1-65的意思是,在你写入了一个地址的时候,对应于这个地址的数据,你可以采用的3中写法。一种是,数据提前地址一个clock cycle写;第二种是,数据对齐地址同一个cycle写;第三种是,数据滞后地址一个cycle写。也就是图上的意思,要保证数据与地址的对应关系,对于时刻clock cycle n 的一个地址,和其对应的数据写入的时刻允许范围是(clock cycle n-1, clock cycle n, clock cycle n+1),你可以在这3个时钟周期中的任意一个把数据0写进去。图上只画了bc4的情况,BL8的情况就是数据1紧跟在数据0后面一个cycle。当然,反压有效的时候,数据或者地址必须hold住直至反压无效,写入被ip接受。有反压的时候,写入地址的时刻n,以反压变为无效后的第一个cycle为准。一个burst写完才可以写下一个burst。


是啊,我也主要是对DDR3板子布线不了解才很头疼。
不过,我用的设计不是用在主板上那种高速带DIMM的,是直接用的DDR颗粒,用FPGA验证时DDR3跑到300--400MHZ就可以满足项目要的带宽了。以前做DDR2时,就把ODT拉死的,测试时也没出什么问题


        你可以先拉死试一下嘛,和设计验证并行走,不耽误活儿

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top