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

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

新建项目步骤:

1、File->New->Project
在这里插入图片描述
在这里插入图片描述
分别创建两个verilog文件
在这里插入图片描述
在这里插入图片描述
填写代码(可以复制这篇下面的源程序),保存后编译全部
在这里插入图片描述
下面这个控制台输出说明没有bug,如果有bug,双击错误信息,会定位到错误所在行
在这里插入图片描述
simulate->start simulation,在work下选择刚写的两个文件
在这里插入图片描述
右键单击这两个,分别“add wave”
在这里插入图片描述
点这个run
在这里插入图片描述

箭头中标注了一些常用的功能,至此,仿真教程结束。
在这里插入图片描述

关于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 

查看波形
在这里插入图片描述
控制台输出
在这里插入图片描述

代码二

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

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

从下图看出,和代码一的运行效果是完全一样的
在这里插入图片描述

  • 10
    点赞
  • 70
    收藏
    觉得还不错? 一键收藏
  • 9
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值