建立testbench

前一节已经叙述过,要仿真设计的功能,必须为其建立一个testbench 也叫仿真平台。为了验证设计模块功能的正确性,我们通常需要在testbench中编写一些激励给设计模块,同时观察这些激励在设计模块(DUV)中的响应是否与我们的期望值一致。

要充分验证一个设计,需要模拟各种外部的可能情况,特别是一些边界情况,因为往往是这些边界情况最容易出问题。

下图显示了一个DUV。我们不仅需要产生时钟信号和复位信号,而且还需要编写一系列的仿真向量,同时观察DUV的响应,确认仿真结果。

3d01f482899a4f77a8890dafc4ddc2e9.jpg

一、仿真激励与被测对象的连接

在testbench中需要实例化被测试模块(DUV),DUV的端口与testbench中的信号互连需要遵循一定的规则

c2590e21659240af8c2aaad704332328.jpg

这里需要提醒的是,驱动双向信号的也一定是一个三态的线网,而不能是寄存器类型,否则就会发生冲突。

二、使用initial语句和always语句

initial和always是两种基本的过程结构语句,在仿真开始时就相互并行执行。通常来说,被动地检测响应时使用always语句,而主动地产生激励时则使用initial语句。

initial和always的区别是initial语句只执行一次,而always语句则不断地重复执行。但是,如果希望在initial里多次运行一个语句块,可以在initial里嵌入循环语句(如while、repeat、for和forever等),比如

initial

begin

    forever永远执行

    begin

    ...

    end

end

而always语句通常只有在一些条件发生时才能执行,比如

always@(posedge clock)

begin

    siga=sigb;

    ...

end

当发生clock上升沿时,执行always操作,begjn...end中的语句顺序执行

三、时钟、复位的写法

用initial语句产生时钟的方法如下

产生一个周期为10的时钟

parameter FAST_PERIOD=10;

reg clock;

initial

begin

    clock=0;

    forever

    #(FAST_PERIOD/2)    clock=~clock;

end

用always语句产生时钟的方法如下

parameter FAST_PERIOD=10;

reg clock;

initial

    clock=0;

always

#(FAST_PERIOD/2)    clock=~clock;

以上写法产生的波形如图所示

233d180f12ee4ada891ad9ad2f0de96b.jpg

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

人生如象棋

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值