【Modelsim零基础入门】新建项目+运行第一个verilog仿真程序:一位加法器

本篇注释比较详细,由《Moselsim 第一个仿真程序 四位加法器》修改而来
原博客:https://blog.csdn.net/sinat_42483341/article/details/88970852

新建项目步骤:

1、File->New->Project
【Modelsim零基础入门】新建项目+运行第一个verilog仿真程序:一位加法器_第1张图片
【Modelsim零基础入门】新建项目+运行第一个verilog仿真程序:一位加法器_第2张图片
分别创建两个verilog文件
【Modelsim零基础入门】新建项目+运行第一个verilog仿真程序:一位加法器_第3张图片
【Modelsim零基础入门】新建项目+运行第一个verilog仿真程序:一位加法器_第4张图片
填写代码(可以复制这篇下面的源程序),保存后编译全部
【Modelsim零基础入门】新建项目+运行第一个verilog仿真程序:一位加法器_第5张图片
下面这个控制台输出说明没有bug,如果有bug,双击错误信息,会定位到错误所在行
在这里插入图片描述
simulate->start simulation,在work下选择刚写的两个文件
【Modelsim零基础入门】新建项目+运行第一个verilog仿真程序:一位加法器_第6张图片
右键单击这两个,分别“add wave”
【Modelsim零基础入门】新建项目+运行第一个verilog仿真程序:一位加法器_第7张图片
点这个run
【Modelsim零基础入门】新建项目+运行第一个verilog仿真程序:一位加法器_第8张图片

箭头中标注了一些常用的功能,至此,仿真教程结束。
【Modelsim零基础入门】新建项目+运行第一个verilog仿真程序:一位加法器_第9张图片

关于begin end 串行并行的易错点

代码一

源程序

//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 

查看波形
【Modelsim零基础入门】新建项目+运行第一个verilog仿真程序:一位加法器_第10张图片
控制台输出
【Modelsim零基础入门】新建项目+运行第一个verilog仿真程序:一位加法器_第11张图片

代码二

源程序不变,仿真程序如下:

注意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 

从下图看出,和代码一的运行效果是完全一样的
【Modelsim零基础入门】新建项目+运行第一个verilog仿真程序:一位加法器_第12张图片

你可能感兴趣的:(verilog)