使用Quartus&Modelsim联合仿真时,需要自行编写TestBench来产生激励信号,下面进行简要的介绍。
对于2选1数据选择器,其verilog代码如下:
module mux21(
input a,b,c,
output y;
assign y=(a&~c)|(b&c);
endmodule
编写对应的testbench如下:
`timescale 100ns/1ns //设置仿真步长(单位时间)/仿真精度(最高分辨率)
module TB_mux21; //实体名,自行拟定,建议与元件实体名区分开来
//端口声明
reg A,B,C; //一般输入端口使用reg型
wire Y; //输出端口只能用wire型
//实例引用被测模块,格式:
// .<实例端口名>(<欲链接的测试端口名>)
//注:这里的testMux21就是一个自己起的名字,是用元件mux21实例化的一个对象
mux21 testMux21(.a(A),.b(B),.c(C),.y(Y));
initial //initial块(用begin/end括起来),只执行一次
begin
A=0;B=0;C=0; //激励设置
#10 A=1; //#10即延时10个时间单位
#5 C=1;
#10 B=1;
#10 C=0;
#20 A=0;
#10 B=1;
end
endmodule
此外,归纳一些常用激励的写法:
1、用for循环
initial
begin
a=0; b=0;
for(a=0;a<4;a=a+1) begin
for(b=0;b<4;b=b+1)begin
#20; //延时
end
end
end
2、重复波形
(i)
always #2 clk = ~clk; //每过两个时间单位,clk反转一次
//效果是产生周期为4个时间单位,占空比50%的时钟信号
(ii)
parameter tON=2,tOFF=2; //参数定义,可以类比C语言中的宏名
always
begin
#tON clk=0;
#tOFF clk=1;
end
//也是产生时钟信号,周期(tON+tOFF)个时间单位,占空比tON/(tON+tOFF)
(iii)
parameter Tlen=100,Ton=2,Toff=2;
initial
begin
repeat(Tlen) //在Tlen个时间单位内不断重复
begin
#Toff clk=1;
#Ton clk=0;
end
end
//效果类似(ii),但限定了时钟信号持续的总时长
最后,使用联合仿真需要按需更改一些Quartus II的设置,具体说明可以参考FPGA开发笔记-Quartus II入门的“二、硬件描述语言入门(Verilog)”