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

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

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 6102|回复: 13

[求助] 使用Modelsim对触发器进行仿真,到底应该怎样写testbench?

[复制链接]
发表于 2010-9-19 10:40:35 | 显示全部楼层 |阅读模式

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

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

x
我用Modelsim仿真自己的设计,但是对于怎样写触发器的testbench一直糊涂,大家看一下我的代码并赐教。

dff_test.v




  1. module dff_test
  2. (
  3.     CLK,
  4.     D,
  5.     Q
  6. );

  7. input CLK;
  8. input D;
  9. output Q;
  10. reg Q;

  11. always@(posedge CLK)
  12. begin
  13.     Q <= D;
  14. end

  15. endmodule


复制代码


dff_test_tb.v




  1. module dff_test_tb  ;

  2.   reg    D   ;
  3.   wire    Q   ;
  4.   reg    CLK   ;
  5.   
  6.   dff_test  
  7.    DUT  (
  8.        .D (D ) ,
  9.       .Q (Q ) ,
  10.       .CLK (CLK ) );

  11. initial
  12. begin
  13.     CLK = 1'b0;
  14.     #500;
  15.     forever #50 CLK = ~CLK;
  16. end

  17. initial
  18. begin
  19.     D = 1'b0;
  20.     #3000;
  21.     @(posedge CLK);
  22.     D = 1'b1;
  23.     #10000;
  24.     @(posedge CLK);
  25.     D = 1'b0;
  26.     #110;
  27.     @(posedge CLK);
  28.     D = 1'b0;
  29. end

  30. endmodule


复制代码


我认为仿真的结果Q应该比D迟一个时钟节拍,但是仿真的结果却如下图所示
dff1.jpg
dff2.jpg

Q并没有比D迟一个时钟节拍。难道是@(posedge CLK)这种等待时钟沿的方法没有使D信号的产生发生在CLK的上升沿之后?

请大家赐教,谢谢!
发表于 2010-9-19 12:10:36 | 显示全部楼层
你对触发器的验证激励,就不用写等待时钟了,只要提供电平和时间即可。触发的东西交给你的设计去采集边沿了。把@的都去掉,没必要加入同步机制。
 楼主| 发表于 2010-9-19 12:32:19 | 显示全部楼层
2# gaurson

gaurson,谢谢你的回复!
你的意思是说去掉@语句,只用延迟吗?那么如果我的时钟初始值是0,从时间0就开始产生,并且周期是100,那么在比如150,250,1050等等这样和时钟上升沿同步的时刻改变信号D的值,这个被改变的值是立刻会被触发器采到的,从仿真结果上来看也是没有延迟一拍的,除非我把这个信号的改变推迟一点,稍晚于时钟的上升沿。
发表于 2010-9-19 12:56:32 | 显示全部楼层
如果是功能仿真的话,一般都是这样的。只要输入的数据都是同一时刻产生的,基本能采样到。
 楼主| 发表于 2010-9-19 13:37:19 | 显示全部楼层
4# gaurson
gaurson,十分感谢!我还有问题继续请教。
如果真如之前所说,这样的激励写法会让和时钟上升沿同时改变的信号在刚刚改变时就被时钟采到,那么如果有一个信号是D和Q运算产生的,那么这个信号的仿真结果是和预期的结果不符的啊
请看如下
dff_tb.v




  1. module dff_test
  2. (
  3.     CLK,
  4.     D,
  5.     Q
  6. );
  7. input CLK;
  8. input D;
  9. output Q;
  10. reg Q;
  11. wire A;
  12. assign A = Q & (~D);
  13. always@(posedge CLK)
  14. begin
  15.     Q <= D;
  16. end
  17. endmodule


复制代码

dff_test_tb.v




  1. module dff_test_tb  ;

  2.   reg    D   ;
  3.   wire    Q   ;
  4.   reg    CLK   ;   
  5.   dff_test  
  6.    DUT  (
  7.        .D (D ) ,
  8.       .Q (Q ) ,
  9.       .CLK (CLK ) );
  10. initial
  11. begin
  12.     CLK = 1'b0;
  13.     forever #50 CLK = ~CLK;
  14. end
  15. initial
  16. begin
  17.     D = 1'b0;
  18.     #150;
  19.     D = 1'b1;
  20.     #300;
  21.     D = 1'b0;
  22. end
  23. endmodule


复制代码

仿真结果
dff3.jpg

本意是想在D信号的下降沿后产生一个一时钟周期宽度的脉冲,现在的仿真结果只是一个刺,这样的话对后级使用A信号的电路是不是就产生了影响?

请赐教!
发表于 2010-9-19 14:52:56 | 显示全部楼层
如果D的产生一定要跟CLK的上升沿相关的话,用第一种testbench,并改为非阻塞赋值:D <= 1'b1 和 D<= 1'b0.
 楼主| 发表于 2010-9-19 15:04:29 | 显示全部楼层
6# yongfenr
感谢yongfenr!
我使用了非阻塞赋值,的确解决了问题,就是对其中的原因还不是很明白。
发表于 2010-9-19 17:19:26 | 显示全部楼层
问个简单的问题:
我写的test程序仿真时,波形图为什吗只能防出输入波形(TEST里写的),但相应的输出波形没有?
发表于 2010-9-19 21:09:44 | 显示全部楼层


你调用要仿真的模块了么?
发表于 2011-1-22 00:32:51 | 显示全部楼层
謝謝分享
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

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

GMT+8, 2024-6-29 19:59 , Processed in 0.686325 second(s), 10 queries , Gzip On, Redis On.

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