Modelsim 第一个仿真程序 四位加法器

2023-12-31 21:58

本文主要是介绍Modelsim 第一个仿真程序 四位加法器,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

4位全加器

//4位全加器
module a4(sum,cout,a,b,cin);input [3:0] a,b;
input cin;
output cout;
output [3:0] sum;
assign {count,sum} = a+b+cin;
endmodule

4位全加器的仿真程序

//4位全加器的仿真程序
`timescale 1ns/1ns 
`include "MyFirstVerilog.v"
module add3_top; 测试模块的名字
reg[3:0] a,b;//测试输入信号定义为 reg 型
reg cin;  
wire[3:0] sum;//测试输出信号定义为 wire 型
wire cout; integer i,j;
a4 adder(sum,cout,a,b,cin); //调用测试对象
always #5 cin=~cin;//设定 cin 的取值
initial 
begin  a=0;b=0;cin=0; 
for(i=1;i<16;i=i+1)
#10   a=i;  //设定 a 的取值
end 
initial
begin 
for(j=1;j<16;j=j+1)
#10   b=j;//设定 b 的取值
end
initial
//定义结果显示格式
begin 
$monitor($time,,,"%d + %d + %b={%b,%d}",a,b,cin,cout,sum);
#160 
$finish; 
end 
endmodule 

窗口效果
在这里插入图片描述
wave窗口
在这里插入图片描述
可以把波形缩放到合适大小,这样能看清细节
在这里插入图片描述

测试模块的编写——initial语句

首先说说结构化过程语句,在verilog中有两种结构化的过程语句:initial语句always语句,他们是行为级建模的两种基本语句。其他所有的行为语句只能出现在这两种语句里。

与C语言不同,verilog在本质上是并发,而非顺序的。
verilog中的各个执行流程(进程)并发执行,而不是顺序执行的。
每个initial语句和always语句代表一个独立的执行过程,每个执行过程从仿真时间0开始执行并且两种语句不能嵌套使用。

下面举例解释之:

initial语句

所有的initial语句内的语句构成了一个initial块。initial块从仿真0时刻开始执行,在整个仿真过程中只执行一次。
如果一个模块中包括了若干个initial块,则这些initial块从仿真0时刻开始并发执行,且每个块的执行是各自独立的。
如果在块内包含了多条行为语句,那么需要将这些语句组成一组,一般式使用关键字begin和end将他们组合在一个块语句;如果块内只有一条语句,则不必使用begin和end.下面给出了initial语句的例子:

module stimulus reg x,y, a,b, m initial 
m = 1*b0; initial 
begin 
#5 a = 1*b1; 
#25 b = 1*b0; 
end initial 
begin 
#10 x = 1*b0; 
#25 y = 1*b1; 
end initial 
#50 $finish; endmodule 

在上面例子中,三条initial语句在仿真0时刻开始并行执行。
如果在某一条语句前面存在延迟#,那么这条initial语句的仿真将会停顿下来,在经过指定的延迟时间之后再继续执行。因此上面的initial语句执行顺序为:

时间 所执行的语句 
0 m = 1*b0; 
5 a = 1*b1; 
10 x = 1*b0; 
30 b = 1*b0; 
35 y = 1*b1; 
50 $finish;

仿真时,出现:Error loading design 错误

遇到过类似的问题,代码编译没问题,但modelsim启动仿真的时候会报错,说Error loading design。一般都是一些内部信号定义不一致之类的问题。比如设计中有两个子模块A和B,A给B传递一个信号,但是A的输出端口和B的输入端口中,这个信号的类型、位宽等定义的不一致。这样的代码在编译时是检查不到语法错误的,在启动仿真时才能检测到两个模块之间的这个信号对接不上,所以才会报错。你再检查一下modelsim的日志文件(工程目录下的transcript),一般都能找到出问题的模块。Ps:编译通过只是说明代码中没有语法错误了,所以编译通过不代表代码就没问题了。

这篇关于Modelsim 第一个仿真程序 四位加法器的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/557239

相关文章

java程序远程debug原理与配置全过程

《java程序远程debug原理与配置全过程》文章介绍了Java远程调试的JPDA体系,包含JVMTI监控JVM、JDWP传输调试命令、JDI提供调试接口,通过-Xdebug、-Xrunjdwp参数配... 目录背景组成模块间联系IBM对三个模块的详细介绍编程使用总结背景日常工作中,每个程序员都会遇到bu

uni-app小程序项目中实现前端图片压缩实现方式(附详细代码)

《uni-app小程序项目中实现前端图片压缩实现方式(附详细代码)》在uni-app开发中,文件上传和图片处理是很常见的需求,但也经常会遇到各种问题,下面:本文主要介绍uni-app小程序项目中实... 目录方式一:使用<canvas>实现图片压缩(推荐,兼容性好)示例代码(小程序平台):方式二:使用uni

python获取指定名字的程序的文件路径的两种方法

《python获取指定名字的程序的文件路径的两种方法》本文主要介绍了python获取指定名字的程序的文件路径的两种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要... 最近在做项目,需要用到给定一个程序名字就可以自动获取到这个程序在Windows系统下的绝对路径,以下

基于Python编写自动化邮件发送程序(进阶版)

《基于Python编写自动化邮件发送程序(进阶版)》在数字化时代,自动化邮件发送功能已成为企业和个人提升工作效率的重要工具,本文将使用Python编写一个简单的自动化邮件发送程序,希望对大家有所帮助... 目录理解SMTP协议基础配置开发环境构建邮件发送函数核心逻辑实现完整发送流程添加附件支持功能实现htm

C#控制台程序同步调用WebApi实现方式

《C#控制台程序同步调用WebApi实现方式》控制台程序作为Job时,需同步调用WebApi以确保获取返回结果后执行后续操作,否则会引发TaskCanceledException异常,同步处理可避免异... 目录同步调用WebApi方法Cls001类里面的写法总结控制台程序一般当作Job使用,有时候需要控制

golang程序打包成脚本部署到Linux系统方式

《golang程序打包成脚本部署到Linux系统方式》Golang程序通过本地编译(设置GOOS为linux生成无后缀二进制文件),上传至Linux服务器后赋权执行,使用nohup命令实现后台运行,完... 目录本地编译golang程序上传Golang二进制文件到linux服务器总结本地编译Golang程序

使用Docker构建Python Flask程序的详细教程

《使用Docker构建PythonFlask程序的详细教程》在当今的软件开发领域,容器化技术正变得越来越流行,而Docker无疑是其中的佼佼者,本文我们就来聊聊如何使用Docker构建一个简单的Py... 目录引言一、准备工作二、创建 Flask 应用程序三、创建 dockerfile四、构建 Docker

python编写朋克风格的天气查询程序

《python编写朋克风格的天气查询程序》这篇文章主要为大家详细介绍了一个基于Python的桌面应用程序,使用了tkinter库来创建图形用户界面并通过requests库调用Open-MeteoAPI... 目录工具介绍工具使用说明python脚本内容如何运行脚本工具介绍这个天气查询工具是一个基于 Pyt

Ubuntu设置程序开机自启动的操作步骤

《Ubuntu设置程序开机自启动的操作步骤》在部署程序到边缘端时,我们总希望可以通电即启动我们写好的程序,本篇博客用以记录如何在ubuntu开机执行某条命令或者某个可执行程序,需要的朋友可以参考下... 目录1、概述2、图形界面设置3、设置为Systemd服务1、概述测试环境:Ubuntu22.04 带图

Python程序打包exe,单文件和多文件方式

《Python程序打包exe,单文件和多文件方式》:本文主要介绍Python程序打包exe,单文件和多文件方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录python 脚本打成exe文件安装Pyinstaller准备一个ico图标打包方式一(适用于文件较少的程