Testbench书写

Posted by SkyCity's Blog on November 18, 2019

总结一些testbench常用模块和语法以及仿真时出现的问题。

—————————————————————————————————————

1 testbench常用小模块

1.1 时钟产生模块

产生50MHz时钟模块:

1
2
3
4
`timescale 1ns/1ns
`define CLK50M_PERIOD 20
initial clk = 1'b1;
always #(`CLK50M_PERIOD/2) clk = ~clk;

2 testbench语法

2.1 task语法

task表示任务,里面的语句顺序执行,写好之后直接调用即可,注意加括号,该语法可以起到精简代码的作用。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
initial begin
	rst_n = 0;
	#201;
	rst_n = 1;
	#20000;
	key_press();	//调用
	#20000;
end

reg key;
task key_press;		//定义
	begin
		key = 1;
		#200000;
		key = 0;
	end
endtask

2.2 repeat语法

repeat表示重复,括号中为次数。 简单的重复10次的例子:

1
2
3
4
5
repeat(10) begin
	key = 1;
	#200000;
	key = 0;
end

含敏感信号的例子:

1
repeat(10) @(posedge clk) syn_rst = 1'b0;

2.3 随机数$random(不可综合)

random函数仅用于测试验证,如果需要可综合的随机数,需要研究LSFR等随机数生成方法。 产生一个(-50,50)范围内的随机数:

1
2
reg	[23:0]	rand;
rand = $random % 50

产生一个(min,max)范围内的随机数:

1
2
reg [23:0]	rand;
rand = min + {$random} % (max - min + 1);

2.4 wait语法

等待key=1时往下执行。

1
wait(key == 1);

2.5 for语法

与C基本一致,注意不能i++,实例如下:

1
2
3
4
5
for(i=0;i<100;i=i+1) begin
	key = 1;
	#(i * 1000);
	key = 0;
end

—————————————————————————————————————

HOME