文章目录
参考:Verilog数字VLSI设计教程
硬件描述语言Verilog
Verilog HDL数字设计与综合
Verilog HDL 数字集成电路高级程序设计
4. 测试仿真结构
对于一个典型的电路测试,一般会有一个信号源对它的目标电路进行激励,然后通过测试设备,对波形进行观察,然后确定电路的正确与否
下图为测试仿真的示意图:
流程图如下:
testbench的结构模板:
module 仿真模块名;
//数据类型声明
激励信号为reg型,显示信号为wire型
//实例化待测模块
<模块名><实例名><(端口列表)>;
//测试激励定义
always和initial过程块
function和task结构
if-else和case等控制语句
//输出响应
endmodule
测试激励描述方式
(1)直接编辑测试激励波形。在测试环境中,用人工的方式去改变信号的电平,产生我们要求的向量,但效率较低
(2)用Verilog产生测试激励,效率相对较高
(3)利用Verilog从文本文件中读取数据。对于大规模集成电路以及可靠性要求较高的测试环境中,通常会使用
4.1 信号初始化
一般来说,testbench中信号初始化采用initial过程块来完成
4.2 延迟控制
1.延迟语句
(1)外部时间控制方式
initial #5 a=b;
等效于
initial
begin
#5;
a=b;
end
(2)内部时间控制方式
initial a=#5 b;
等效于
initial
begin
temp=b;
#5;
a=temp;
end
2.事件语句
@(<事件表达式>);
@(<事件表达式>)行为语句;
例如
initial
begin
#10;
@(posedge en) in=~in;
end
3.等待语句
wait(<条件表达式>) 行为语句;
例如:
always #5 cnt=cnt+1'b1;
initial
wait(cnt==4'b1111)
$display($time,"cnt=%b",cnt);
4.3 initial和always过程块的使用
1. initial过程块
例:
`timescale 1ns/1ns
module wave_initial;
reg a;
initial
begin
a=1'b0;
#5 a=1'b1;
#5 a=1'b0;
#10 a=1'b1;
end
endmodule
2. always过程块
例:
`timescale 1ns/1ns
module wave_always;
reg clk;
initial clk=1'b0;
always #5 clk=~clk;
endmodule
4.4 串行与并行语句块产生测试信号
1. 串行语句块产生测试信号
例:
`timescale 1ns/1ns
module serial_wave