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

2024-02-12 19:50

本文主要是介绍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/703452

相关文章

uniapp接入微信小程序原生代码配置方案(优化版)

uniapp项目需要把微信小程序原生语法的功能代码嵌套过来,无需把原生代码转换为uniapp,可以配置拷贝的方式集成过来 1、拷贝代码包到src目录 2、vue.config.js中配置原生代码包直接拷贝到编译目录中 3、pages.json中配置分包目录,原生入口组件的路径 4、manifest.json中配置分包,使用原生组件 5、需要把原生代码包里的页面修改成组件的方

Java面试八股之怎么通过Java程序判断JVM是32位还是64位

怎么通过Java程序判断JVM是32位还是64位 可以通过Java程序内部检查系统属性来判断当前运行的JVM是32位还是64位。以下是一个简单的方法: public class JvmBitCheck {public static void main(String[] args) {String arch = System.getProperty("os.arch");String dataM

一道经典Python程序样例带你飞速掌握Python的字典和列表

Python中的列表(list)和字典(dict)是两种常用的数据结构,它们在数据组织和存储方面有很大的不同。 列表(List) 列表是Python中的一种有序集合,可以随时添加和删除其中的元素。列表中的元素可以是任何数据类型,包括数字、字符串、其他列表等。列表使用方括号[]表示,元素之间用逗号,分隔。 定义和使用 # 定义一个列表 fruits = ['apple', 'banana

剑指offer(C++)--两个链表的第一个公共结点

题目 输入两个链表,找出它们的第一个公共结点。 解法一 两个链表一定有交点的话,方法是指向短链表指针先走完,然后指向长链表,指向长链表指针后走完,指向短链表。所以,第二次走过,一定会在交点相遇。 class Solution {public:ListNode* FindFirstCommonNode( ListNode *pHead1, ListNode *pHead2) {ListN

剑指offer(C++)--第一个只出现一次的字符

题目 在一个字符串(0<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置, 如果没有则返回 -1(需要区分大小写). class Solution {public:int FirstNotRepeatingChar(string str) {map<char, int> mp;for(int i = 0; i < str.size(); ++i)m

美容美发店营销版微信小程序源码

打造线上生意新篇章 一、引言:微信小程序,开启美容美发行业新纪元 在数字化时代,微信小程序以其便捷、高效的特点,成为了美容美发行业营销的新宠。本文将带您深入了解美容美发营销微信小程序,探讨其独特优势及如何助力商家实现业务增长。 二、微信小程序:美容美发行业的得力助手 拓宽客源渠道:微信小程序基于微信社交平台,轻松实现线上线下融合,帮助商家快速吸引潜在客户,拓宽客源渠道。 提升用户体验:

程序人生--拔丝地瓜

一个会享受生活的人,难免会执迷于探索“三餐茶饭,四季衣裳”的朴素涵义。如今在这繁杂喧闹、竞争激烈的社会环境里,如何才能从周而复始的生活中挖掘出一点儿期待!这是一个仁者见仁智者见智的开放性话题。对于大部分的人来说,看电影、运动、旅游、美食、加班....是假日的备选安排。 春节临走之前,再次尝试“拔丝地瓜”,为何要强调“再次”二字?因为这道甜菜我已经尝试过很多次,失败与成功都经历过。十几年的烧饭经历

导航条下 ScrollView 第一个View去掉向下偏移的64px

self.automaticallyAdjustsScrollViewInsets=NO;      self.scrollView.contentInset=UIEdgeInsetsMake(-64, 0, 0, 0); self.automaticallyAdjustsScrollViewInsets=NO; 相同的意思。

vscode python pip : 无法将“pip”项识别为 cmdlet、函数、脚本文件或可运行程序的名称

在vscode中控制台运行python文件出现:无法将"pip”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。 使用vscode开发python,需要安装python开发扩展: 本文已经安装,我们需要找的是python安装所在目录,本文实际路径如下: 如果在本文路径中没有此目录,请尝试在C盘中搜索 python,搜索到相关python目录后,点击Python 3.9进入目录,

2_为MFC程序添加菜单

在MFC中添加菜单栏 1,双击资源文件,显示资源视图,点击Menu插入Menu菜单,编辑菜单的ID,自己取名字。 2,点击“请在此处键入”添加菜单选项,输入&E,E的下面就会产生下划线;在产生的弹出菜单中继续编辑,并且可以添加事件处理函数; 在弹出菜单的任意位置,鼠标右键,弹出的菜单中选择“插入分隔符”,即可产生分隔符 3,在你设计的Dialog窗口的属性栏,选择Menu后面的