微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 微电子和IC设计 > IC验证交流 > 紧急求助一个testbench的问题

紧急求助一个testbench的问题

时间:10-02 整理:3721RD 点击:
我用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

我得testbench是用的sv的program block写的,会不会和这个有关?

时序逻辑在posedge沿做判断的时候应该以上一个上升沿时的g2xclkcnt的值作为判断标准吧,不知道小编的g2xclkcnt是怎么产生的,个人见解

嗯,楼上的解释合理,正是因为两个进程在一个边沿处去产生cnt和rxd,所以导致错位。

不太明白楼上的解释,是说 program里面的if(g2xclkcnt)判断和top中的always @(posedge g_2Xrxclk) g2xclkcnt<=~g2xclkcnt产生了冲突? 难道不应该是像verilog一样并行取值吗?
两个进程在一个边沿产生是什么意思?

并行是并行,但这里是非阻塞赋值,两个进程里面的左边变量都要等到进程结束才能得到右边的结果,所以cnt的产生和cnt的判断两个地方用的值是不同的,cnt产生进程中得到的结果要在下一个时钟沿才能在cnt判断条件中采样到。这个思想很不好解释,需要慢慢理解。

您的意思是always @(posedge g_2Xrxclk)语句中和program中的 @(posedge g_2Xrxclk)
其实不是在同一个时钟的上升沿采样这个上升沿到来之前的cnt数据?
如果把program看成传统verilog的module的话,不是应该是同时在同一个g_2Xrxclk的上升沿采样吗?
还是说用sv的program block有一些讲究?

always @(posedge g_2Xrxclk) g2xclkcnt<=~g2xclkcnt; //125Mhz
和@(posedge g_2Xrxclk)
begin
if(~g2xclkcnt)
我是说这两个地方,第一个是时钟沿产生cnt,第二个是时钟沿判断cnt,在这里同一个沿对应的数据是不同的,因为是非阻塞赋值的关系。说直接一点,就是时钟沿来到后,这两个进程并行触发,第一个进程用右边的cnt更新左边的cnt,而第二个进程此时判断的cnt还是第一个进程右边的cnt,还无法采样到左边的cnt,这就是非阻塞赋值的作用。

是啊 你说的对...我也知道...但是我的问题不是你说的这个问题...
我说的问题就是实际仿真出来的波形和这个代码的功能不吻合的情况.
代码的情况是当上升沿到来之前是(~g2xclkcnt)的时候在上升沿执行之后的赋值,而仿真结果却是在(g2xclkcnt==1)的时候执行..
你说的那个是非阻塞赋值最基本的概念...我当然明白

看这一小段的话:
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:______ ---------------

你用的什么仿真工具?这个我有同事遇到过,貌似modelsim会延时,而VCS还是ncverilog是当前拍去判断,好像是和仿真工具的理解有关系。就是说按照我们的理解,应该是你的那个波形,但是不同工具它对非阻塞赋值的delta延时时刻做的处理不同,有些是先操作再延时,有些是先延时再操作。我也没有找到合适的词汇来说明,可能是这个情况。

修修补补,总能过的吧

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

网站地图

Top