基础知识
Test bench即Verilog需要编写的
测试文件。在module设计完成、综合之后我们需要通过测试文件完成对设计module的测试。
Test bench大致分为下面三个部分:
一般采用always实现
-
实例化instantiate要测试的module
-
对实例的输入赋值
与待测模块的接口:
-
与输出端口相连接的变量定义为reg
-
与输出端口相连的定义为wire
初始化变量
Verilog中使用initialblock初始化变量。
时钟的产生
always # 10 clk=~clk; 产生时钟
initial repeat(13) #5 clk=~clk
控制只产生13个时钟
同步数据
initial forever @ (posedge clk) #3 x=$random;
为了降低多个输入同时翻转的概率,对时序电路的输入一般采用素数作为时间间隔
随机数据
initial repeat(5) #7 x=$random;
a=$random%60; //产生-59到59之间的随机数
a={$random}%60; //产生0到59之间的随机数
产生随机事件间隔always begin t=$random #(t) x=$random; end
数据缓存initial buffer = 16'b1110_0001_1011_0101;//将测试数据进行初始化always@(posedge clk) #1 {x,buffer}={buffer,x}//可以在控制的数据下输入信号x
## 读取数据文件 ##
reg [7:0] mem1[0:1024];//定义一个1KB的存储initial begin $readmemh(data1.dat,mem1)
简单的实例`timescale 1ns / 10ps`include "adder.v"module test; // Inputs reg a,b; wire sum,count; // 实例化待测试模块 add uut ( .sum(sum), .c(count), .b(b), .a(a) ); initial begin // Initialize Inputs a=0; //没经过20个单位时间,a取反 forever #20 a=~a; end initial begin // Initialize Inputs b=0; //没经过10个单位时间,b取反 forever #10 b=~b; end initial begin //监控输出 $monitor()$time,,,"%d+%d={%d,%d}",a,b,count,sum; #40 $stop; endendmodule
-
1
-
2
-
3
-
4
-
5
-
6
-
7
-
8
-
9
-
10
-
11
-
12
-
13
-
14
-
15
-
16
-
17
-
18
-
19
-
20
-
21
-
22
-
23
-
24
-
25
-
26
-
27
-
28
-
29
-
30
-
31
-
32
-
33
-
34
-
35
-
36
-
1
-
2
-
3
-
4
-
5
-
6
-
7
-
8
-
9
-
10
-
11
-
12
-
13
-
14
-
15
-
16
-
17
-
18
-
19
-
20
-
21
-
22
-
23
-
24
-
25
-
26
-
27
-
28
-
29
-
30
-
31
-
32
-
33
-
34
-
35
-
36
Tip
-
$monitor 出输出打印显示
-
$stop 停止当前仿真
-
¥finish 结束仿真
时钟产生
reg clock;initial begin clock=0; forever #10 clock=~clock;end
reg clock;initial clock=0;always #10 clock=~clock;