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

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

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 2082|回复: 6

[原创] verilog testbench的问题讨论

[复制链接]
发表于 2018-7-7 22:52:54 | 显示全部楼层 |阅读模式
1资产
最近学习verilog的时候发现了一个问题希望大家能帮忙解决!1.verilog代码如下:


        reg clk, d;

reg q;


always @(posedge clk) begin

q<=d;

end


initial begin

clk = 0;

forever #20 clk = ~clk;

end

initial begin

d = 0;

#20 d = 1;

#40 d = 0;

#40 d = 1;

#40 d = 0;

#40 d = 1;

#40 d = 0;

#40 d = 1;

#40 d = 0;

#40 d = 1;

#40 d = 0;

#80 $finish;

end

仿真波形:
2.PNG

也就是输入激励和输出是同拍的。

2.如果将上面激励换成非阻塞赋值的话:
                reg clk, d;

reg q;


always @(posedge clk) begin

q<=d;

end


initial begin

clk = 0;

forever #20 clk = ~clk;

end

initial begin

d <= 0;

#20 d <= 1;

#40 d <= 0;

#40 d <= 1;

#40 d <= 0;

#40 d <= 1;

#40 d <= 0;

#40 d <= 1;

#40 d <= 0;

#40 d <= 1;

#40 d <= 0;

#80 $finish;

end

仿真波形: 2.PNG
输入激励和输出是有一拍的延迟。

既然都只有1个D触发器输入的波形都是一样的,为什么输出不一样的呢?

发表于 2018-7-8 17:20:02 | 显示全部楼层
在clk上升沿时d应稳定
发表于 2018-7-8 18:23:52 | 显示全部楼层
=是立即赋值的,所以q<=d,能够得到你当前的值;<=是右边表达式同时更新,所以q<=d和其他d<=X,同时更新右边表达式,所以q<=d,只能得到前一拍的值。
 楼主| 发表于 2018-7-9 22:28:20 | 显示全部楼层
回复 3# gaurson

貌似找到了更合理的解释!http://www.eetop.cn/blog/html/46/553746-51456.html
发表于 2018-7-10 11:24:26 | 显示全部楼层
本帖最后由 rosshardware 于 2018-7-10 12:54 编辑

用= 的时候,D的值是在CLK上升沿同时生效,因此,Q会在之后生效产生D的当拍有效,因为你的代码没有器件延迟,所以看起来就是D和Q通拍,而用<=的时候,D的值是在CLK上升沿之后才生效,因此当拍的上升沿采集不到,是下一个20ns的上升沿采集到,所以Q会晚一拍。
第1个时序,如下所示:


时序1 

时序1 



图话的稍微有点问题,就是D和Q要保持一个时钟周期哈,但是表达的时序意思没有问题
发表于 2018-7-10 12:53:48 | 显示全部楼层
本帖最后由 rosshardware 于 2018-7-10 12:56 编辑

第二时序,如下所示:

         ____       _____       ____

时序二.png

图中,第一个上升沿本来红色的,第二个上升沿是绿色的,不知道为什么拷贝过来就失色,顺便吐槽一下这个论坛回复框不能直接画图,真是太土了。
发表于 2018-7-10 13:26:07 | 显示全部楼层
本帖最后由 wuyi316904 于 2018-7-10 13:27 编辑

1 module block_nonblock();  2 reg a, b, c, d , e, f ;  
3   
4 // Blocking assignments  
5 initial begin  
6   a = #10 1'b1;// The simulator assigns 1 to a at time 10  
7   b = #20 1'b0;// The simulator assigns 0 to b at time 30  
8   c = #40 1'b1;// The simulator assigns 1 to c at time 70  
9 end
10  
11 // Nonblocking assignments
12 initial begin
13   d <=  #10 1'b1;// The simulator assigns 1 to d at time 10
14   e <=  #20 1'b0;// The simulator assigns 0 to e at time 20
15   f  <=  #40 1'b1;// The simulator assigns 1 to f at time 40
16 end
17   
18 endmodule
阻塞赋值的时候要执行完当前语句再执行下一句。非阻塞赋值可以同时完成。你使用阻塞和非阻塞赋值导致实际赋值时间不同,造成激励不同。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

×

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

GMT+8, 2024-4-25 07:16 , Processed in 0.029917 second(s), 6 queries , Gzip On, Redis On.

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