testbench其本质也是一个模块,但是我们把它看成是一个不具有外部接口的模块
故开头是
module testbench_comp; //testbench_comp是testbench声明的模块名称
...
endmodule //模块结尾标志
使用符号常量parameter声明常数
如声明clock_period来指定clock的周期时间
parameter CLOCK_PERIOD=10; //声明常量CLOCK_PERIOD的值是10
在实例化要simulation仿真的模块时,要先声明该模块所需要的接口变量。原则是,testbench模块需要更改值,作为输入变量输入到实例化的模块中时,应声明为reg变量,该变量在实例化模块中必须为wire类型。在实例化模块中,作为reg类型,在内部读写寄存器的,在testbench中,应声明为wire类型,可以用于供testbench读值来显示。
原则:寄存器只能由一个过程块进行操作
reg clk;
reg in0,in1; //reg输入到comp模块中的wire
wire eq,lt,gt; //comp模块中reg输出为wire
comp comp_1(.clk(clk),
.in0(in0),
.in1(in1),
.eq(eq),
.lt(lt),
.gt(gt)); //按名称进行实例化
//comp模块原型
module comp
(
input clk,
input in0,in1,
output reg eq,lt,gt
);
使用Initial过程块及#num进行延时num ns后进行执行
initial
//Initial过程块标志符号,用begin、end来声明initial过程块的边界
begin
clk=0;
forever #(CLOCK_PEROID/2) clk=~clk;
//forever一直循环,#(CLOCK_PEROID/2)延时(CLOCK_PEROID/2)ns后,执行clk=~clk
end
设置实例化模块输入数据时序
initial
begin
in0=1'b0;
in1=1'b1;
#100
in0=1;
in1=1;
#100
in0=1;
in1=0;
#100
$stop; //到此处执行中断,simulation仿真停止
end
`timescale 1ns / 1ps
//
// Company:
// Engineer:
//
// Create Date: 2022/03/01 15:06:18
// Design Name:
// Module Name: testbench_comp
// Project Name:
// Target Devices:
// Tool Versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//
module testbench_comp;
parameter CLOCK_PEROID=10;
reg clk;
reg in0,in1;
wire eq,lt,gt;
comp comp_1(.clk(clk),
.in0(in0),
.in1(in1),
.e_q(eq),
.lt(lt),
.gt(gt));
initial
begin
clk=0;
forever #(CLOCK_PEROID/2) clk=~clk;
end
initial
begin
in0=1'b0;
in1=1'b1;
#100
in0=1;
in1=1;
#100
in0=1;
in1=0;
#100
$stop;
end
endmodule