本篇注释比较详细,由《Moselsim 第一个仿真程序 四位加法器》修改而来
原博客:https://blog.csdn.net/sinat_42483341/article/details/88970852
1、File->New->Project
分别创建两个verilog文件
填写代码(可以复制这篇下面的源程序),保存后编译全部
下面这个控制台输出说明没有bug,如果有bug,双击错误信息,会定位到错误所在行
simulate->start simulation,在work下选择刚写的两个文件
右键单击这两个,分别“add wave”
点这个run
源程序
//source program
module myadd(sum,cout,a,b,cin); //output,output,input,input
input a,b; //I change a from 4-bit to 1-bit
input cin;
output cout;
output sum; //I change sum from 4-bit to 1-bit
assign {count,sum} = a+b+cin; //to always give value
endmodule
仿真程序
//Simulation program
`timescale 1ns/1ns
`include "MyFirstVerilog.v"
module myadd_tb; //测试模块的名字
reg a,b; //测试输入信号定义为 reg 型
reg cin; //测试输入信号进位设置为 reg 型
wire sum; //测试输出信号定义为 wire 型
wire cout; //测试输出信号进位定义为 wire 型
integer i,j;
myadd adder(sum,cout,a,b,cin); //调用测试对象(实例化)
always #5 cin=~cin;//每5ns对cin进行一次取反
//赋值
initial
begin a=0;b=0;cin=0;
#10 a<=1;b<=1;//这里使用非阻塞赋值,如果使用阻塞赋值a=1;b=1无法成功赋值
end
//定义结果显示格式
initial
begin
$monitor($time,,,"%d + %d + %b={%b,%d}",a,b,cin,cout,sum);//控制台输出
#20
$finish;
end
endmodule
源程序不变,仿真程序如下:
注意25~35行与原来代码1的不同:代码1是将a,b 的赋值放在一个initial - begin end
中,而本代码将a,b的赋值过程放在了两个initial - begin end中。由于initial语句上电后便执行一次,所以两个initial仍然是并行的,本程序与原来程序运行效果相同。
//Simulation program
`timescale 1ns/1ns
`include "MyFirstVerilog.v"
module myadd_tb; //测试模块的名字
reg a,b; //测试输入信号定义为 reg 型
reg cin; //测试输入信号进位设置为 reg 型
wire sum; //测试输出信号定义为 wire 型
wire cout; //测试输出信号进位定义为 wire 型
integer i,j;
myadd adder(sum,cout,a,b,cin); //调用测试对象(实例化)
always #5 cin=~cin;//每5ns对cin进行一次取反
//赋值a
initial
begin a=0;b=0;cin=0;
#10 a<=1; //从第10ns开始执行,非阻塞赋值
end
//赋值b
initial
begin
#10 b<=1; //从第10ns开始执行,非阻塞赋值
end
//定义结果显示格式
initial
begin
$monitor($time,,,"%d + %d + %b={%b,%d}",a,b,cin,cout,sum);//控制台输出
#20
$finish;
end
endmodule