Verilog 学习日志#第三天

设计的仿真与测试

一个设计一旦完成就应当对它进行测试。通过编写激励块,输入激励信号然后检测结果可以检测一个设计功能的正确性。将激励块和设计块分离开来是设计者应该养成的一个好习惯。通常测试块也被称为测试凳(Test Bench),应用不同的测试凳可以对一个设计块进行全方位的测试。激励信号的应用方式大致被分为两种。

第一种,在激励块内调用设计块,并且直接驱动设计块的信号。在图中,激励块成为顶层模块,对输入信号clk 和reset 进行操作,检测并显示输出信号q。
Verilog 学习日志#第三天
第二种,在顶层的假模块内同时调用激励块和设计块,激励块和设计块仅通过接口相互作用,如下图所示。激励模块驱动信号d_clk 和d_reset,这两个信号与设计块的两个端口clk 和 reset分别相连。它也检测并显示输出信号c_q,该信号与设计块的输出端口q相连。顶层假模块的功能仅仅是为了调用设计块和激励块。
Verilog 学习日志#第三天
下面对昨天学习的行波计数器进行仿真测试。
昨天行为级描述的代码为

module cnt_4bit (q,clear,clock);
	output [3:0] q;
	input clear,clock;

	reg [3:0] q;

	always @(posedge clear or negedge clock)
	begin
		if (clear)
			q=4'd0;
		else
			q=(q+1) % 16;
	end
endmodule

现在改为

module cnt_4bit (q,clear,clock);
	output [3:0] q;
	input clear,clock;

	reg [3:0] q;
	
	always @(posedge clear or negedge clock)
	begin
		if (clear)
			q=4'd0;
		else
			q=(q+1) % 16;
	end
endmodule

现在必须写出激励块以检测行波计数器功能是否正确。在此,必须控制信号clk和reset以检测行波计数器的计数功能和异步复位机制是否都正确。我们将使用下图所示的波形来检测设计块。图中显示了输入信号clk,reset以及4bit的输出信号q。时钟信号clk的时钟周期为10个时间单位;复位信号 reset从0到15保持为高,然后变低,直到195再次变高,至205后变低,输出信号q的范围是从0到15。
Verilog 学习日志#第三天

下面就准备写出激励块,生成上图中的波形。我们将使用如最开始的图所示的激励方式。在此不要过多考虑Verilog 的语法,将精力集中在激励模块是如何调用设计模块上。

编写激励块

module stimulusl;
reg clk;
reg reset;
wire [3:0] q;
cnt_4bit r1(q,reset,clk);   //调用设计块cnt_4bit生成实例r1

//控制信号clk以驱动设计块,时钟周期设为10个时间单位
initial
	clk=1'b0;	//设置clk到0
always
	#5 clk=~clk;
	
//控制复位信号reset以驱动设计块,0~15为高,15~195为低,195~205为高,然后变低
initial
begin
	reset=1'b1;
	#15 reset=1'b0;
	#180 reset=1'b1;
	#10 reset=1'b0;
	#20 $finish;
end

//监视输出
initial
	$monitor($time,"output q=%d,q);
endmodule

下面就可以运行仿真器了,以检测设计块功能的正确性。仿真的输出结果如图所示。
Verilog 学习日志#第三天

上一篇:4-6.字体样式重置


下一篇:竞斗云刷机过程