MIg生成ddr2时序约束问题

[复制链接]
11131|38
 楼主| zx1278 发表于 2012-8-20 11:51 | 显示全部楼层 |阅读模式
在使用MIG生成ddr2,实现ddr2读写控制时遇到了一些问题:
首先,在时序约束方面,起初使用MIG自动生成的UCF文件,由于ddr2的系统时钟是由差分时钟sys_clk_p和sys_clk_n作用产生的,所以UCF文件中定义如下约束为时钟周期约束:NET "u_ddr2_infrastructure/sys_clk_ibufg"TNM_NET=  "SYS_CLK";
TIMESPEC "TS_SYS_CLK" = PERIOD "SYS_CLK" 3.75 ns HIGH 50 %;
NET "u_ddr2_infrastructure/clk200_ibufg" TNM_NET = "SYS_CLK_200";
TIMESPEC "TS_SYS_CLK_200" = PERIOD "SYS_CLK_200" 5 ns HIGH 50 %;
但是在Implement Design过程中会报错找不到NET "SYS_CLK",这是一个什么原因呢?
其次,在测试过程中,通过自己添加的UCF文件(约束不完整的)虽然通过Implement Design,在Chipscope pro Analyzer中观察到写入ddr2中的数据app_wdf_data基本上是正确的,但ddr2的输出数据rd_data_fifo_out没有和写入的有效数据对应起来,请大家帮着分析一下
水畔天蓝 发表于 2012-8-20 12:45 | 显示全部楼层
你用的FPGA是什么型号的?如果是spartan3或者V5的芯片,是需要修改的
 楼主| zx1278 发表于 2012-8-20 14:34 | 显示全部楼层
你好,我是用的V5110t的,还要请教您如何修改?谢谢!
水畔天蓝 发表于 2012-8-20 15:25 | 显示全部楼层
这里的sys_clk_p和sys_clk_n是指FPGA输入的控制时钟,并非指DDR2硬件连接上的时钟ck和ck_n,所以当时我是用单端时钟输入的

评分

参与人数 1威望 +2 收起 理由
GoldSunMonkey + 2 感谢回复

查看全部评分

 楼主| zx1278 发表于 2012-8-20 16:57 | 显示全部楼层
水畔天蓝:
很高兴你的回答!我使用的是sys_clk_p和sys_clk_n双端输入时钟,现在正纠结于怎样对FPGA输入时钟进行时序约束,不知道是该选用sys_clk_p还是sys_clk_n,或者是其他的时钟信号,因为我发现此时的时序约束直接影响了我设计系统的性能,时序约束稍有改变,输出数据有比较大的差异,还请你多多指教!谢谢
GoldSunMonkey 发表于 2012-8-20 22:06 | 显示全部楼层
MIG版本是什么?
 楼主| zx1278 发表于 2012-8-21 09:04 | 显示全部楼层
6# GoldSunMonkey 使用的是MIG3.61的,采用的是sys_clk_p和sys_clk_n这对差分时钟作为FPGA的输入时钟控制,但不太清楚如何对差分时钟进行时序约束,而MIG3.61自己生成的UCF文件不能直接用,不太清楚需要修改哪些地方
GoldSunMonkey 发表于 2012-8-21 09:53 | 显示全部楼层
谁说不能直接用?
 楼主| zx1278 发表于 2012-8-21 10:14 | 显示全部楼层
8# GoldSunMonkey 我用的是V5的芯片,前面的帖子上也提到了直接用所遇到的问题,如果你能帮我解决上面的问题,将不胜感激!
水畔天蓝 发表于 2012-8-22 10:44 | 显示全部楼层
请问你是用chipscope看到的信号吗?
 楼主| zx1278 发表于 2012-8-22 14:35 | 显示全部楼层
10# 水畔天蓝
是的,只要是因为时序约束没有做好,在chipscope中观察到输入数据基本是正常的,但输出数据没有和输入数据相对应起来,比如:输入数据是12345,输出数据可能是45123,或者51234等情况,但输出的都是写入DDR中的有效数据
明空 发表于 2012-8-22 18:02 | 显示全部楼层
可以用PLL输出的频率做约束
piandhai 发表于 2012-8-22 20:25 | 显示全部楼层
看来你对约束规则的语法不是很了解!将sys_clk_p和sys_clk_n调用差分buffer基元,基元输出为SYS_CLK!然后将其引至u_ddr2_infrastructure模块下sys_clk_ibufg的输入。NET "u_ddr2_infrastructure/sys_clk_ibufg"TNM_NET=  "SYS_CLK";意思是u_ddr2_infrastructure/sys_clk_ibufg下的SYS_CLK net。
 楼主| zx1278 发表于 2012-8-22 21:33 | 显示全部楼层
13# piandhai
对,您说的很对,我现在刚接触时序约束不久,有些地方不是很熟悉。 想深入的请教一下高手:在UCF文件中定义如下:NET "u_ddr2_infrastructure/sys_clk_ibufg"TNM_NET=  "SYS_CLK";
TIMESPEC "TS_SYS_CLK" = PERIOD "SYS_CLK" 3.75 ns HIGH 50 %;
NET "phy_init_done" OFFSET = OUT 11 ns AFTER "SYS_CLK";
……
在Implement Design过程中会报错:NET "SYS_CLK" not found.  Please
   verify that:
   1. The specified design element actually exists in the original design.
   2. The specified object is spelled correctly in the constraint source file.
请问这是一种什么原因?
GoldSunMonkey 发表于 2012-8-22 22:24 | 显示全部楼层
你是XP系统?然后?
GoldSunMonkey 发表于 2012-8-22 22:34 | 显示全部楼层
你用XILINX的user design来试一下。
 楼主| zx1278 发表于 2012-8-23 08:59 | 显示全部楼层
15# GoldSunMonkey
Win7的哈
piandhai 发表于 2012-8-23 09:43 | 显示全部楼层
楼主这个不是系统的问题,也不是软件的问题!上面说的很清楚,NET "SYS_CLK" not found,你的“u_ddr2_infrastructure/sys_clk_ibufg”下面根本就没有这个信号,你怎么对他进行约束!我昨天查了下,楼主肯定是自动生成的设计例子,想使用差分时钟输入,但你的约束条件写的有问题,如果楼主不介意的话将u_ddr2_infrastructure这个文件贴出来,我就知道你的约束条件该怎么写了!
 楼主| zx1278 发表于 2012-8-23 10:30 | 显示全部楼层
18# piandhai
piandhai:
真心感谢您的帮助!正如您所说,我是想采用自动生成的设计例子,由于行不通所以想寻求帮助,下面贴出u_ddr2_infrastructure,具体情况在附件中。麻烦您帮忙指点一下,谢谢!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
piandhai 发表于 2012-8-23 10:47 | 显示全部楼层
约束更改如下:
NET "u_ddr2_infrastructure/sys_clk_ibufg"TNM_NET=  "sys_clk_ibufg";
TIMESPEC "TS_SYS_CLK" = PERIOD "sys_clk_ibufg" 3.75 ns HIGH 50 %;
NET "phy_init_done" OFFSET = OUT 11 ns AFTER "sys_clk_ibufg";
...
分析:
你的ddr2_infrastructure.v中是这么写的
generate
  if(CLK_TYPE == "DIFFERENTIAL") begin : DIFF_ENDED_CLKS_INST
    //***************************************************************************
    // Differential input clock input buffers
    //***************************************************************************

    IBUFGDS_LVPECL_25 SYS_CLK_INST
      (
       .I  (sys_clk_p),
       .IB (sys_clk_n),
       .O  (sys_clk_ibufg)
       );

    IBUFGDS_LVPECL_25 IDLY_CLK_INST   //clk200一直有信号,其来源于clk200_p和clk200_n;
      (
       .I  (clk200_p),
       .IB (clk200_n),
       .O  (clk200_ibufg)
       );

  end else if(CLK_TYPE == "SINGLE_ENDED") begin : SINGLE_ENDED_CLKS_INST
    //**************************************************************************
    // Single ended input clock input buffers
    //**************************************************************************

    IBUFG SYS_CLK_INST
      (
       .I  (sys_clk),
       .O  (sys_clk_ibufg)
       );
    if ( NOCLK200 == 0 ) begin : IBUFG_INST
        IBUFG IDLY_CLK_INST
          (
           .I  (idly_clk_200),
           .O  (clk200_ibufg)
           );
    end

  end
  endgenerate

那么你使用差分时钟,CLK_TYPE == "DIFFERENTIAL",程序就综合的是:
if(CLK_TYPE == "DIFFERENTIAL") begin : DIFF_ENDED_CLKS_INST
    //***************************************************************************
    // Differential input clock input buffers
    //***************************************************************************

    IBUFGDS_LVPECL_25 SYS_CLK_INST
      (
       .I  (sys_clk_p),
       .IB (sys_clk_n),
       .O  (sys_clk_ibufg)
       );

    IBUFGDS_LVPECL_25 IDLY_CLK_INST   //clk200一直有信号,其来源于clk200_p和clk200_n;
      (
       .I  (clk200_p),
       .IB (clk200_n),
       .O  (clk200_ibufg)
       );
这部分使用的时钟就是“sys_clk_ibufg”,所以你该对“sys_clk_ibufg”约束。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

16

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部