时序电路测试程序的Verilog设计(摘录)

时序逻辑电路的测试程序
  • 时序逻辑电路的测试程序代码框架如下所示。
module testbench_name();
// 信号定义
// 模块实例化
// 阶段1:时钟、复位和输入信号初始化,复位信号生成(通过initial过程块)
// 阶段2:产生时钟(通过always过程块)
// 阶段3:测试激励产生(通过initial过程块,配合事件触发@和时间延迟#)
// 显示输出结果(可以不添加任何显示打印语句,只生成波形图即可)
endmodule
  • 相比于组合逻辑电路的测试,信号定义、模块实例化和输出响应这几部均相同,只是将施加测试激励进一步细分为了3段式

    ① 通过initial过程块初始化时钟、复位和输入信号,并生成完整复位信号。 ② 通过always过程块产生系统时钟。 ③ 通过initial过程块生成激励信号,为了满足时序电路特性,事件触发语句@延迟量#可配合使用。

  • 一个时序逻辑电路的测试程序示例如图1所示。

 图1 时序逻辑电路的测试程序
信号初始化
  • 通过initial过程块,初始化时钟、复位和输入信号,并通过延迟量#生成完整复位信号。

  • 如图1所示,时钟clk、复位rst_n和输入D均被初始化为“0”,然后经过100ns后,复位信号rst_n被拉高,从而撤销复位信号(即低电平复位,拉高使复位信号无效)。

  • 由于对时序逻辑电路进行测试,因此赋值语句建议采用非阻塞赋值

产生时钟信号
  • 利用always过程块的反复执行特性,可产生周期性变化的时钟信号,如下所示为生成100MHz时钟的代码示例。
`timescale 1ns/1ps
module testbench_name();
always #5 clk = ~clk; // 每隔5ns,时钟翻转1次,生成时钟周期10ns(100MHz)的时钟
endmodule
  • 为了便于生成多种频率的时钟,可通过define宏定义语句,利用参数化方法实现,如下所示。
`timescale 1ns/1ps
`define CLK_PERIOD 10 // 定义时钟周期为10ns
module testbench_name();
always #(`CLK_PERIOD / 2) clk = ~clk; // 每隔5ns,时钟翻转1次
endmodule
产生激励信号
  • 与组合逻辑电路测试相同,在initial过程块通过#延迟量给出激励信号的方法同样可以应用到时序逻辑电路的测试上。但我们知道,同步时序逻辑电路是以时钟有效沿为基准进行状态更新的,因此相比#延迟量,通过事件触发@语句(即敏感列表)产生测试激励对于时序逻辑电路更加便捷。这种方法既可以基于某个信号的取值给出激励,也可以基于某个信号沿的方向变化给出激励,如下所示。
initial begin
@(posedge rst_n); // 当rst_n出现第一次上升沿,则stima被赋值5
stima <= 4’d5;
@ (posedge clk); // 在rst_n出现上升沿后,再出现一个时钟clk的上升沿,则stimb被赋值0
stimb <= 4’d0;
repeat (5) begin // 连续出现5个时钟clk下降沿,每次下降沿stmic都被加“1”
@(negedge clk);
stimc <= stimc + 1;
end
  • 为了精确的对时序逻辑电路进行测试,测试激励的赋值语句建议使用非阻塞赋值

  • 在仿真过程中,如果数据的变化与时钟沿的的变化是对齐的(注意:这种情况在实际物理电路上是不应该存在的,因为不满足建立时间,会触发亚稳态。但在行为仿真过程中,通常不考虑建立时间的影响,因此是可行的,同时也简化了测试程序的编写),则当前时钟沿采集到的数据为该时钟有效沿前一时刻的值,即出现延迟一拍的效果,俗称“打一拍”。图2给出了4位寄存器“打一拍”的效果。

图2 “打一拍”的效果

  • 从图中可以看出,在“45ns”时刻,时钟sys_clk出现上升沿,而寄存器数据输入端口D从“1”变化到“3”。此时,上升沿采集到的是D变化前的值(即“1”)。因此该时钟沿过后,寄存器的状态Q仍是“1”,直到下一个时钟上升沿到来(55ns时刻),寄存器的状态Q才变为“3”,延迟了一个周期。这与寄存器的工作行为一致,即寄存器的输入发生了变化,状态不会马上发生变化,要等时钟有效沿到了之后,才更新状态。

  • 我们在后面设计时要养成一些“条件反射”,即做到根据波形写代码的时候,看到波形中有延一拍的现象时,就要想到用always块的时序逻辑(非阻塞赋值)来实现;看到使用always块表达时序逻辑时就要想到波形中会出现“打一拍”的效果。如果使用了阻塞赋值,将无法出现“打一拍”的效果。因为,阻塞赋值用于建模组合逻辑电路,输出随输入的变化即可发生变化。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值