在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

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

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 12500|回复: 11

[求助] 紧急求助一个testbench的问题

[复制链接]
发表于 2011-9-5 12:02:00 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

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

x
我用sv写的一个testbench,其中有一段一直有问题: 波形显示赋值的位置一直是反的.
本来应该是g2xclkcnt=0赋值p0_rxd[3:0], 等于1时赋值p0_rxc[7:4],仿真结果却正好相反;
而下面的p0_rxd和byteidx本该在g2xclkcnt=1才更新,结果却是在=0的时候更新;
请高手帮我看一下我得代码有什么问题吗?

//testbench里面的激励产生代码;
  while(byteidx!=mpt.total_num_of_bytes)
  begin
     @(posedge g_2Xrxclk)
     begin
       if(~g2xclkcnt)
       begin
            g0_rxctl<=p0_rxdv;
            g0_rxd<=p0_rxd[3:0];
       end
       else
       begin
            g0_rxctl<=p0_rxdv;
            g0_rxd<=p0_rxd[7:4];
       end
   
       if(g2xclkcnt)
       begin
            if(p0_rxd==8'h55)
                 p0_rxdv<=1;
            else if(datain[byteidx]==8'hee && datain[byteidx+1]==8'hee && datain[byteidx+2]==8'hee && datain[byteidx+4]==8'hee)
                 p0_rxdv<=0;
     
   
            p0_rxd<=datain[byteidx];
            byteidx<=byteidx+1;
        end
     end
  end

//top文件里面的时钟产生代码(时钟波形在仿真时是正确的)
always #2 g_2Xrxclk=~g_2Xrxclk; //250Mhz
always @(posedge g_2Xrxclk) g2xclkcnt<=~g2xclkcnt; //125Mhz
 楼主| 发表于 2011-9-5 12:03:53 | 显示全部楼层
我得testbench是用的sv的program block写的,会不会和这个有关?
发表于 2011-9-5 14:08:10 | 显示全部楼层
时序逻辑在posedge沿做判断的时候应该以上一个上升沿时的g2xclkcnt的值作为判断标准吧,不知道楼主的g2xclkcnt是怎么产生的,个人见解
发表于 2011-9-6 12:49:34 | 显示全部楼层
嗯,楼上的解释合理,正是因为两个进程在一个边沿处去产生cnt和rxd,所以导致错位。
 楼主| 发表于 2011-9-7 09:33:48 | 显示全部楼层
不太明白楼上的解释,是说 program里面的if(g2xclkcnt)判断和top中的always @(posedge g_2Xrxclk) g2xclkcnt<=~g2xclkcnt产生了冲突? 难道不应该是像verilog一样并行取值吗?

两个进程在一个边沿产生是什么意思?
发表于 2011-9-7 11:59:36 | 显示全部楼层
并行是并行,但这里是非阻塞赋值,两个进程里面的左边变量都要等到进程结束才能得到右边的结果,所以cnt的产生和cnt的判断两个地方用的值是不同的,cnt产生进程中得到的结果要在下一个时钟沿才能在cnt判断条件中采样到。这个思想很不好解释,需要慢慢理解。
 楼主| 发表于 2011-9-7 13:08:48 | 显示全部楼层
您的意思是always @(posedge g_2Xrxclk)语句中和program中的 @(posedge g_2Xrxclk)
其实不是在同一个时钟的上升沿采样这个上升沿到来之前的cnt数据?

如果把program看成传统verilog的module的话,不是应该是同时在同一个g_2Xrxclk的上升沿采样吗?
还是说用sv的program block有一些讲究?
发表于 2011-9-8 12:12:00 | 显示全部楼层
always @(posedge g_2Xrxclk) g2xclkcnt<=~g2xclkcnt; //125Mhz
和     @(posedge g_2Xrxclk)
     begin
       if(~g2xclkcnt)

我是说这两个地方,第一个是时钟沿产生cnt,第二个是时钟沿判断cnt,在这里同一个沿对应的数据是不同的,因为是非阻塞赋值的关系。说直接一点,就是时钟沿来到后,这两个进程并行触发,第一个进程用右边的cnt更新左边的cnt,而第二个进程此时判断的cnt还是第一个进程右边的cnt,还无法采样到左边的cnt,这就是非阻塞赋值的作用。
 楼主| 发表于 2011-9-10 15:56:07 | 显示全部楼层
是啊 你说的对...我也知道...但是我的问题不是你说的这个问题...
我说的问题就是实际仿真出来的波形和这个代码的功能不吻合的情况.
代码的情况是当上升沿到来之前是(~g2xclkcnt)的时候在上升沿执行之后的赋值,而仿真结果却是在(g2xclkcnt==1)的时候执行..

你说的那个是非阻塞赋值最基本的概念...我当然明白
 楼主| 发表于 2011-9-10 16:09:09 | 显示全部楼层
看这一小段的话:
       if(g2xclkcnt)
       begin
            if(p0_rxd==8'h55)
                 p0_rxdv<=1;
            else if(datain[byteidx]==8'hee && datain[byteidx+1]==8'hee && datain[byteidx+2]==8'hee && datain[byteidx+4]==8'hee)
                 p0_rxdv<=0;
我把仿真的波形图画出来就是这样的(在分频enable==0的时候赋值了):
g_2Xrxclk:--__--__--__--__---__----
g2xclkcnt: ___---- -___-----____-----
p0_rxdv:   ___------------------
而我的代码的意思应该是这样的(在分频时钟enable==1的时候才赋值):
g_2Xrxclk:--__--__--__--__---__----
g2xclkcnt: ___---- -___-----____-----
p0_rxdv:   ______ ---------------
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /2 下一条

×

小黑屋| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-4-27 23:21 , Processed in 0.027737 second(s), 6 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表