EETOP 创芯网论坛 (原名:电子顶级开发网)

标题: DDR2 controller求助 [打印本页]

作者: l2002924700    时间: 2012-2-29 14:12
标题: DDR2 controller求助
小弟在使用altera DDR2 controller的时候遇到一个问题,就是讲在进行burst传输的时候,local_be必须是全部有效,不能使部分有效,否则,在进行burst传输时就会出现地址紊乱的情况,我现在不知道这是IP固有的问题呢?还是我IP用错了呢?但是,按我想Altera再设计这个IP的时候不可能这么傻,估计是我哪块设得不对,望大虾指教!
作者: asyou    时间: 2012-2-29 17:06
你为什么要屏蔽掉一些,你可以把它读出来,然后不要嘛!
作者: zhh880419    时间: 2012-2-29 21:26
本帖最后由 sdwsh 于 2012-3-1 14:07 编辑

回复 1# l2002924700


请问我自己写的DDR2控制器读出的数据是高阻太,或者说没有读出数据,是怎么回事啊,能不能看看你的源代码啊,谢谢,不甚感激!
作者: l2002924700    时间: 2012-3-1 09:01
回复 3# zhh880419

不好意思,我用的是IP核,自己写controller难度太大!
作者: catcat_2    时间: 2012-3-1 14:04
altera 的ddr2 ip吗?local_be ? 我的仿真过啊了,altera 自带的testbench有仿真带local_be 的情况,是可以的,不是Ip 固有的问题。我用的是altera ddr2 high performance controller II. 不过就算是一代,也应该没有这个问题的。

不过,其实我个人觉得这个local byte enable,几乎起不了多大作用。举个例子,先假设你的local wdata 宽度是16bit,窄一点,少打些字:
比如:
       local_wdata = 16'h64AB;
       local_be       = 2'b01;
       local_address = 0;
       这个时候其实你希望只写进去AB,64就会被ddr2的dm信号mask住,写到地址0去。然后,读地址0, 你会读出来00AB。似乎好像是没有问题。但如果是这样:
       local_wdata = 16'h00AB
       local_be       = 2'b01;
       local_address = 0;
       这样,你写进去00AB,读出来也是00AB,你都不知道前面的00到底是不是有效数据。换句话说,就是你在altera提供的ddr2 ip,读ddr2数据输出这一边,你找不到相应的byte valid指示位。
       所以,你单纯用local_be去依靠altera的ddr2 ip去实现读写一个byte是要悲剧的。你只能在自己的设计里面想想办法,怎么在读出的时候也能知道哪个byte是真正有效的,可以动动脑筋
       综上所诉,altera ddr2 ip的这个local_be比较山寨的,建议就全部有效吧。
作者: l2002924700    时间: 2012-3-2 13:47
回复 6# catcat_2


    看了你的回复,有点明白了,不过还有几个问题需要请教一下:
    1、你所说的仿真没问题是指的BURST传输还是single传输?
    2、在执行向DDR2写操作的时候,我们该如何发送地址?我在看altera的文档emi_ddr_ug中的figure8-4的时候,发现本地接口(local_interface)的地址local_address每次递增4,而memory接口的地址mem_addr每次加8,这我可以理解,因为mem_dq是8bit的数据线,而本地接口的数据总线是16bit宽的数据线,所以mem_addr的地增量是local_addr地增量的两倍。但是还是有个问题我不太理解就是local_address为啥每次要递增4呢?因为本地接口的数据线的位宽是存储器接口数据线位宽的两倍,那应该加2就可以了呀!因为一次burst传输只是传输2个16bit的数据,那映射到mem interface应该就是4个8为数据,也就是说local地址只需递增2,存储器一边的递增地址就可以是4了,那也就满足了存储器不会覆盖之前存储数据的要求,为何地址要跳跃呢?
    3、在对DDR2进行写操作的时候,如果只是发出写命令而dqs不是有效,那这样进行的是何操作呢?谢谢!
作者: catcat_2    时间: 2012-3-2 16:24
本帖最后由 catcat_2 于 2012-3-2 16:37 编辑

回复 7# l2002924700


    1.当然是burst传输。local_size=2 和local_size=1 都是burst 传输,DDR没有single传输的,概念上你要清楚。每一次读写都是double data rate,访问好几个地址的。
    2.先告诉你,emi_ddr_ug上面8--4这张图是有问题的,各个local信号的相互位置,跟仿真出来的波形不一样,非常坑爹,还好我用它自带的testbench仿了一下。具体你说的这张图,你说的是对的,其实只要跳2就可以了。它只有一根dps线,说明外面只接了一个ddr2 sdram 颗粒,颗粒的位宽是8bit。你可以理解为它是跳着写的,先写了sdram 的0 1 2 3地址,然后跳到8 9 10 11去了。。 对了,你去下一个external memory interface handbook吧,这个比UG详细。
    3.操作ddr2的时候,是先发写命令的。顺序是先ACT,然后发WR命令,过一定的LATENCY之后才有DQS,DM 和DATA。这个跟sram是不一样的,不是对齐的。这个latency 就是WL write latency,WL = AL + CL - 1,AL叫posted CAS additive latency,CL叫CAS latency。这个你可以参考ddr2 sdram 颗粒的data sheet。说多了就啰嗦了。
作者: l2002924700    时间: 2012-3-2 16:33
回复 8# catcat_2


    嗯,十分感谢!
作者: l2002924700    时间: 2012-3-6 11:10
回复 8# catcat_2


    还有个问题想要请教一下,就是emi_ddr_ug上面8--3这张图在local_size=2时,在地址连续发送的时候,数据的发出是连续的,每一个输出数据仅占一个时钟周期。但是我在仿真local_size=1的时候,发现数据的发出不是连续的,前一个从IP里输出的数据要隔一个时钟周期才能从IP里再输出,这张图是否在这里画的不对,望指教!
作者: catcat_2    时间: 2012-3-6 12:38
回复 10# l2002924700


    8--3这张图是读ddr2 sdram 的情况,这图跟我仿出来loca_size = 2的是一样的。local_size = 1 的情况我没仿过,估计有可能是不连续出来的。要相信你自己的仿真。还有就是建议你不要去care数据是不是连续出来的,你只要看到local_rdata_valid = 1,那就证明数据是有效的。
作者: wangyingwei    时间: 2012-3-6 13:38
顶一个,目前也在用ALTERA DDR3 IP,不过只使用它的PHY,控制器自己写的,它的控制器调度效率不高。进公司一直在做DDR,希望有机会跟楼上的高手交流
作者: catcat_2    时间: 2012-3-6 17:21
回复 12# wangyingwei


    恩,有空多多交流啊,你才是高手,控制器都自己写。。 我还没用过altera 的ddr3, 只用过xilinx的ddr3。
作者: digitalimage    时间: 2012-3-6 17:34
回复 12# wangyingwei
你用的什么arbitration算法?方便透露吗?
作者: hexuezu    时间: 2012-3-6 20:43
我最近也在学ddr2 controller,请问quartus生成ip核,自动生成的testbench怎么仿真,具体步骤如何?使用quartus调用modelsim,还是用modelsim直接仿真,最近很困惑,若能解惑,感激不尽!
作者: catcat_2    时间: 2012-3-7 09:37
回复 15# hexuezu


    直接用modelsim吧,不要用什么quartus去调用,搞麻烦了。。
作者: wangyingwei    时间: 2012-3-7 13:18
DDR控制器其实算成熟的技术了,仲裁算法也主要是根据DRAM的特性来对请求进行调度,通过BANK间插、读写操作捆绑等方式对请求进行调度,目的就是尽可能得间插命令,在数据总线上数据吞吐率高。
控制IP业界很多公司都有,像DENALI 、SYNOPSYS等,它们的IP的数据带宽和延迟性能都比XILINX和ALTERA的好
作者: wangyingwei    时间: 2012-3-7 13:25
回复 15# hexuezu


    你在例子工程里面照一个generate_sim_example_design.qpf文件,用QUARUTS打开,再用TOOL里面的TCL脚本工具执行generate_sim_verilog_example_design.tcl 。然后系统就会生成仿真文件,再去里面找运行文件吧。MODELSIM应该是DO文件吧,我以前用的是VCS,我记得是运行vcs_setup.sh
作者: l2002924700    时间: 2012-3-7 16:35
回复 13# catcat_2


    关于DDR2的IP还有一个问题想要请教一下:就是我在对该控制器IP进行仿真的时候,发现在进行连续不断的发送read命令的时候,(我是每一次在local一侧连续发送五个read命令,local_burst以及local_read_req都持续5个时钟周期)但是在memory接口一侧,有时候会出现发出一个时钟周期的active命令,之后紧接着是两个时钟周期的nop命令,然后有时候memory一侧就只发出4个read命令,也就是没有将我想要发出的读命令全部发出,这是为何,望指点!
作者: l2002924700    时间: 2012-3-7 16:50
回复 16# catcat_2


    不好意思,刚才是我太粗心了,没有仔细看波形,没有发现在我当时发送第五个读请求的时候,local_ready已经变低了!犯了一个幼稚的错误。工程师的粗心真要不得!
作者: l2002924700    时间: 2012-3-8 15:12
回复 16# catcat_2


    我看了你在altera中文论坛上发的帖子,有几个问题想再向你请教一下:
    1、你们所谓的calibration到底是怎么理解的?我以前都是把它翻译为校准,以前就理解成是DDR2对其内部的片内OCT以及ODT进行校准,但是我也不知道这样理解对不对?
    2、在“ug_ddr_ddr2_sdram_hp”这篇文档中提到关于DDR2 IP core有几种设计流程,分别是SOPC Builder flow和MegaWizard Plug-In Manager flow这两种设计流程该怎样理解,我们一般都是使用的是MegaWizard Plug-In Manager flow吗?这两种流程有啥区别?咱们是不是一般只要不使用sopc的话,用的都是MegaWizard Plug-In Manager flow呢?
     望指教,不胜感激!
作者: catcat_2    时间: 2012-3-9 10:03
回复 21# l2002924700

参考下emi_handbook, v4, chapter 3 吧。 calibration 要做很多事情。。
-----------------------------------------------------------------------------
    The ALTMEMPHY IP performs the following calibration stages:
1. Enter Calibration (s_reset)
2. Initialize PHY (s_phy_initialize)
3. Initialize DRAM
4. Write Header Information in the internal RAM (s_write_ihi)
5. Load Training Patterns
6. Test More Pattern Writes
7. Calibrate Read Resynchronization Phase
8. Advertize Write Latency (s_was)
9. Calculate Read Latency (s_adv_rlat)
10. Output Write Latency (s_adv_wlat)
11. Calibrate Postamble (s_poa)
12. Set Up Address and Command Clock Cycle
13. Write User Mode Register Settings (s_prep_customer_mr_setup)
14. Voltage and Temperature Tracking
------------------------------------------------------------------------

SOPC的流程是在SOPC的时候用的,你的说的对。 也可以用到一般设计里面,只要接口时序对上了,都是可以的。但是我们一般不做SOPC就不用SOPC那套东西。其实它底层也是一样的,估计就是在上面包了一个对应到SOPC的标准接口。
作者: l2002924700    时间: 2012-3-9 10:27
回复 22# catcat_2


    好的!谢谢!我在研究一下你所说的那部分内容!很感谢你这种分享精神,向你学习!
作者: yibiantian    时间: 2012-3-9 21:47
回复 13# catcat_2

请教一个问题:DDR2 controller ip核前仿功能正确,后仿时mem_dq信号比mem_dqs信号晚一个时钟周期,有什么办法解决吗?
作者: catcat_2    时间: 2012-3-12 09:01
回复 24# yibiantian


    mem_dps和mem_dp的关系读写的时候是不一样的。。写的时候dps的rising edge和falling edge各对齐写入的前后两个数据的正中间,读的时候对齐前一个数据,后一个数据拉低。

    后仿不对的话,你是不是延时参数没设对? 还有,controller根据这个dps取到的数据是不是对的?
作者: yibiantian    时间: 2012-3-13 22:26
回复 25# catcat_2

看里面的约束文件比较多,不知从何处着手,有什么建议没?另外,它的example工程换个器件全编译之后,后仿也出现同样的问题,采用example工程默认的器件就OK
作者: yibiantian    时间: 2012-3-13 22:28
回复 25# catcat_2


    读出的数据有问题的,dqs没有指示到的dq数据就读不出来
作者: catcat_2    时间: 2012-3-14 10:50
回复 27# yibiantian


    这种情况真的没有遇到过。。 你直接上板试吧。。 如果IP的输出信号波形都是正确的,那我觉得这个现象已经跟IP 本身没有关系了,是后仿真的走线latency什么地方出了问题。。 直接上板看看。。
作者: l2002924700    时间: 2012-3-20 15:19
回复 28# catcat_2

       关于Altera的DDR2的IP核还有一个问题想要讨教一下,就是在DDR2的IP里有local_size这个参数,这个参数的设置有啥意义呢?比如说,要进行burst4的传输,也就是说要burst传输4个数,但是我可以把local_size一直设为1,这样,无非也就是local_burstbegin在burst传输期间一直为高,这和把local_size设为2,local_burstbegin一个周期为高下一个周期为低在传输效果上有啥区别呢?望赐教!
作者: catcat_2    时间: 2012-3-20 15:42
local_size是设置一次burst传输数据的大小的,也是设置一次burst传输需要访问多少个sdram的地址空间的。比如,fpga 外围接了一颗sdram颗粒,颗粒的数据DQ位宽是8bit,那么burst_len =4 的时候,每一次burst 将访问sdram的4个地址,每次burst需要4*8bit个数据。对应的,local_data宽度就是2*8bit,local_address每一次burst 加2,mem_addr每次burst则是加4。数据在full rate时候的分两个时钟周期写入,这是正常情况下local_size=2的时候。

    那么,在local_size=1时候,只是一半,local_address每次加1,mem_addr每次加2,每次burst写入2*8bit个数据,在一个时钟周期写入。你可以看到在local_size=1的时候,每次burst,phy层的 mem_dm,就是sdram的data mask信号会有置1的时候,就是屏蔽调这次burst的另外2*8bit数据。

    local_size=2的时候是4个一组访问sdram的地址空间,local_size=1的时候是2个一组访问sdram的空间,都是一次burst需要进行的操作,但是local_size=1的时候效率低了一半,只写进去一半的数据。根据不同情况可以灵活选择local_size。
作者: wzhdxtx123    时间: 2012-3-30 15:35
回复 30# catcat_2


    那么根据您所说的情况,那么当把控制器的Burst length设成8的时候,是否相应的Local_size设成4,谢谢!
作者: catcat_2    时间: 2012-3-31 08:54
回复 31# wzhdxtx123


          亲,印象中ddr2不支持bl=8吧。。 ddr3貌似才支持这个。。
作者: l2002924700    时间: 2012-3-31 11:37
回复 22# catcat_2


    再请教你一个问题,就是你在用nc-verilog做DDR的后仿时,你看的是那一份文档啊?我怎么在user-guide中找不到相关信息呢?
作者: catcat_2    时间: 2012-3-31 12:27
回复 33# l2002924700


    我直接上板测的,没做后仿。主要板上的delay参数跟仿真的不是很好匹配,加上时间比较紧,我就直接上板去run了。
作者: l2002924700    时间: 2012-3-31 17:15
回复 24# yibiantian


    我在看External Memory Interface Handbook时,看到Altera’s ALTMEMPHY-based external memory interfaces不支持的特性里有一条是针对DDR和DDR2 SDRAM它并不支持时序仿真啊!请问你的后仿真是怎么做的啊?相关文档能否上传一下啊?谢谢!
作者: l2002924700    时间: 2012-3-31 17:16
回复 34# catcat_2


    谢谢!
作者: wangyingwei    时间: 2012-3-31 18:16
回复 32# catcat_2


    DDR2是同时支持BL4和BL8,DDR3 主要支持BL8,对于BL4 可以通过BC4 ON THE FLY获得
作者: catcat_2    时间: 2012-4-1 10:27
—_—~! 楼主,楼上说的是对的。我记错了。搞混了..

local_size 是avalon的burst个数,具体取值范围是1到Local Maximum Burst Count。Local Maximum Burst Count是根据你的内存颗粒决定的,这个值在生成IP core的时候在controller setting那一页eifficiency这项里面有写。
作者: doomsten    时间: 2012-4-1 14:13
可以的
作者: azhe5587    时间: 2012-4-1 14:19
问题解决没?
作者: xaoyaolee    时间: 2012-4-1 17:27
请教各位大侠,你们的DDR IP是不是只能在Altera的FPGA上跑
不能用在ASIC里面?
作者: l2002924700    时间: 2012-4-5 09:15
回复 41# xaoyaolee


    应该是的!因为这个和底层硬件是有关系的!
作者: wangyingwei    时间: 2012-4-5 13:04
控制器是可以移植的,但是PHY会调用一些ALTERA的库
作者: beihua26080115    时间: 2012-4-5 15:30
首先声明,我没有用过altera的DDR Controller,解释的不一定正确,只是供你参考。

个人认为altera的ddr controller仅仅是一个DRAM的控制协议层控制器,也就是说这个ctrl只是负责把你的request转换成符合DDR控制协议的request。另外DDR2是4n prefetch结构,因此一次读写至少要传输4 beat的数据,而且不可以打断。如果在读的过程中你只需要2 beat或者1 beat的数据,就需要你自己再altera ctrl的外围再加一个数据传输控制器,帮助你选取需要的数据。在写DDR的时候,你可以通过byte enable信号(这个信号会被映射到DDR的DM,data mask)来控制你需要写入的有效数据的个数。

另外也有可能是你的DDR/ctrl配置的不合适,我感觉你很有可能吧DDR被指为BL8了,你可以再MR0中把DDR配置成BL4,然后再试试!
作者: yibiantian    时间: 2012-4-8 23:01
回复 35# l2002924700


    确实fpga初级器件不支持后仿,但是人家给example工程可以后仿,我采用example工程中的器件却不行,后仿结果有错!
    另外,这些东西都是在公司做的,资料是弄不出来的,呵呵!
作者: ckzuan    时间: 2012-4-24 15:08
新手上路!最近我也正在搞altera的DDR2 IP,选的是DDR2 SDRAM Controller with UniPHY这个和DDR2 SDRAM Controller 有什么区别?因为我用的FPGA是S3只能选UniPHY这个。简单设置了下就generate了,顶层文件应该是自己命名的ddr2_if,请问其他的.v文件都哪些啊,看着产生了一大堆。全部导进去综合了一遍不对啊!像ddr2_if_pll0.v这都没有啊,但是里面却有实例化。。。另外还有很多问题要问,请指教!
作者: ckzuan    时间: 2012-4-24 15:11
还有疑问,DDR2 SDRAM Controller with UniPHY不要建立工程文件,而DDR2 SDRAM Controller 却要建立工程文件才能生成IP。
作者: whz1006    时间: 2012-8-13 10:56
回复 6# catcat_2


    这位大侠你好,小弟最近刚开始接触altera的ddr2 sdram high performance controller,想通过给出的example design 验证一下我的板子上的ddr2是否能够正常工作,下板后,发现每一个测试周期中大多数的数据都是正确的,但都会有一小段读出的数据与写入的数据不符,但是不多。我的DDR2不在ip核提供的ddr2列表中,但我已根据ddr2的手册,修改了ip核设置。想请您帮忙想想可能是哪里出了问题。谢谢
作者: gxiaob    时间: 2012-8-21 16:45
回复 13# catcat_2
您好!我正在用xilinx的ddr2控制器,请问你的ddr3在时序约束方面是如何做的?谢谢!
作者: momo0502    时间: 2013-3-8 11:34
感觉看到这篇帖子有点晚了,前端时间也搞了下DDR2,好多问题不是很懂,看了后明白了一些。
作者: zcjzcj11    时间: 2014-8-11 13:57
回复 6# catcat_2


   感谢为我解惑!
作者: aifuliwade    时间: 2015-3-9 09:54
回复 46# ckzuan


    你好,麻烦问一下你弄的ddr2最后好了没?我现在刚弄,遇到了跟您当初一样的问题,那么多的生成文件,不知道怎么操作测试,全部拉进去运行不出来,麻烦您指导一下。谢谢!
作者: 999    时间: 2016-2-11 11:01
see see
作者: xiaoyiuestc    时间: 2017-10-29 14:23
回复 30# catcat_2
你好,大神!我想问一下我想仿真一下自己的ddr2控制器(调用altera的ddr2 ip核)可不可以使用生成ip核时自动生成的那个testbench呢,是否需要做相应修改呢,因为testbench里面一些信号我自己的控制器里面没有。我试着修改一下后发现mem_dq要么为零要么为x值。您是怎么对自己的ddr2控制器进行仿真的呢,如果能有相应的testbench参考代码就更好啦,希望能不吝赐教。谢谢!
作者: abner_cheng    时间: 2017-11-7 12:18
尽可能是全部有效。屏蔽也没有太大作用,效率都是一致的。建议你还是全部有效。




欢迎光临 EETOP 创芯网论坛 (原名:电子顶级开发网) (https://bbs.eetop.cn/) Powered by Discuz! X3.4