Modelsim 使用教程(2)——Basic Simulation

news2024/11/25 23:41:42

一、概述

        在本文中,我们将介绍Modelsim基本的仿真流程,包括有:

  • Create the Working Design Library(创建工具库)
  • Compile the Design Units(编译设计单元)
  • Optimize the Design(优化设计)
  • Load the Design(加载设计)
  • Run the Simulation(运行仿真)

 二、设计文件及tb

        首先给出本文中用到的设计文件及tb。

2.1 设计文件 counter.v

// Copyright 1991-2014 Mentor Graphics Corporation
//
// All Rights Reserved.
//
// THIS WORK CONTAINS TRADE SECRET AND PROPRIETARY INFORMATION WHICH IS THE PROPERTY OF 
// MENTOR GRAPHICS CORPORATION OR ITS LICENSORS AND IS SUBJECT TO LICENSE TERMS.
//   

`timescale 1ns / 1ns
module counter (count, clk, reset);
output [7:0] count;
input clk, reset;

reg [7:0] count;
parameter tpd_reset_to_count = 3;
parameter tpd_clk_to_count   = 2;

function [7:0] increment;
input [7:0] val;
reg [3:0] i;
reg carry;
  begin
    increment = val;
    carry = 1'b1;
    /* 
     * Exit this loop when carry == zero, OR all bits processed 
     */ 
    for (i = 4'b0; ((carry == 4'b1) && (i <= 7));  i = i+ 4'b1)
       begin
         increment[i] = val[i] ^ carry;
         carry = val[i] & carry;
       end
  end       
endfunction

always @ (posedge clk or posedge reset)
  if (reset)
     count = #tpd_reset_to_count 8'h00;
  else
     count <= #tpd_clk_to_count increment(count);

/***************************************************************** 
Use the following block to make the design synthesizable.

always @ (posedge clk or posedge reset)
  if (reset)
     count = 8'h00;
  else
     count <= count + 8'h01;
******************************************************************/
endmodule

2.2 仿真文件 tcounter.v

//
// Copyright 1991-2014 Mentor Graphics Corporation
//
// All Rights Reserved.
//
// THIS WORK CONTAINS TRADE SECRET AND PROPRIETARY INFORMATION WHICH IS THE PROPERTY OF 
// MENTOR GRAPHICS CORPORATION OR ITS LICENSORS AND IS SUBJECT TO LICENSE TERMS.
//   

`timescale 1ns / 1ns
module test_counter;

reg clk, reset;
wire [7:0] count;

counter dut (count, clk, reset);

initial // Clock generator
  begin
    clk = 0;
    forever #10 clk = !clk;
  end
  
initial	// Test stimulus
  begin
    reset = 0;
    #5 reset = 1;
    #4 reset = 0;
  end
  
initial
    $monitor($stime,, reset,, clk,,, count); 
    
endmodule    

三、操作流程

3.1 Create the Working Design Library(创建工具库)

        在开始设计仿真之前,必须首先创建一个库,并将源代码编译到该库中。

1、创建一个新的目录,并将设计文件复制到其中。

2、打开modelsim,点击File -> Change Directory,把目录改成我们之前刚刚创建的新文件夹。

3、 创建工作库

(1)选择File -> New -> Library

(2)点击OK 

         ModelSim创建一个名为work的目录,并将一个名为_info的特殊格式文件写入该目录。_info文件必须保留在目录中,以区分它作为ModelSim库。不要在操作系统中编辑文件夹内容;所有更改都应在ModelSim中进行。

        ModelSim还将库添加到库窗口,并将库映射记录在ModelSim初始化文件(modelsim.ini)中以供将来参考。

        此时在Transcript界面应该打印有如下内容:

        这两行是你所做的菜单选择的命令行。许多命令行等价物将以这种方式响应它们的菜单驱动功能。 

3.2 Compile the Design Units(编译设计单元)

         在创建了工作库后,你就可以编译源文件了。你可以使用图形界面的菜单和对话框来编译源文件,如下面的Verilog示例中所述,或者通过在ModelSim>prompt下输入一个命令。

1、编译 counter.v 和 tcounter.v

(1)选择 Compile > Compile ,这会打开编译源文件对话框。

        如果“编译”菜单选项不可用,则你可能已经打开了一个项目。如果是,通过使库窗口活动,并从菜单中选择File > Close来关闭项目。

(2)从编译源文件对话框中选择到 counter.v 和 tcounter.v 文件,分别点击Complie,完成后点击done。这些文件就会被编译到库中。

2、查看编译好的设计单元

(1)在“library”窗口中,单击work库旁边的“+”图标,您将看到两个设计单元,您还可以看到它们的类型(模块、实体等)。以及到底层源文件的路径。

 3.3 Optimize the Design(优化设计)

        优化你的仿真设计会加快这个过程。

1、使用 vopt 命令优化设计,使所有设计单位完全可见。

        在 Transcript 窗口中的 ModelSim>prompt 下输入以下命令:

vopt +acc test_counter -o testcounter_opt

        +acc为调试提供了对设计的可见性。

        -o允许你指定优化后的设计文件(testcounter_opt)的名称。

        (使用vopt命令时,必须为优化的设计文件提供名称。)

 

3.4 Load the Design(加载设计)

         现在我们就可以把设计加载进仿真中了

1、把tb_module模块加载到仿真中

        通过vsim指令,使用优化后的设计名称(testcounter_opt)来加载设计

vsim testcounter_opt

        当设计被加载时,就会打开一个结构窗口(标记为sim)。此窗口显示了设计的层次结构,如下图所示:

2、打开 Objects 和 Process 窗口

(1)选择 View > Objects,同样的方式 打开View > Process 

        Objects窗口显示了在结构(sim)窗口中选定的当前区域中的数据对象的名称和当前值。数据对象包括信号、线网、寄存器、常量和变量、泛型、参数和SystemC模块的成员数据变量。

        Process窗口提供了4种观测模式:动态,在区域、设计和分层中(Active, In Region, Design, and Hierarchical)来观测HDL或者SystemC过程。设计视图模式是用于ESL(电子系统级)设计的主要导航,其中流程是最要考虑的因素。默认情况下,此窗口将显示仿真的动态进程(active模式)。

3.5 Run the Simulation(运行仿真)

        现在我们就可以进行仿真了,但是在此之前,我们还要打开wave窗口,把信号添加进去。

1、打开wave窗口

2、把信号加到wave窗口中

(1)在结构(sim)窗口中,右键单击test_counter打开弹出上下文菜单。

(2)选择 Add Wave 

3、进行仿真

(1)点击 Run 按钮 

        仿真运行100ns(默认的仿真长度),波形会在Wave窗口中绘制。

(2)在Transcript界面的VSIM> prompt后面直接输入run 500us

        仿真器又进行了500us的仿真,总共就进行了600us的仿真

(3)在命令行输入run -all 或者在主界面点击

 

仿真继续运行,直到执行break命令或代码中的停止仿真的命令语句(即Verilog $stop语句)。

(4)单击“中断”图标以停止模拟

         至此,我们就完成了一些基本的仿真操作。

3.6  Set Breakpoints and Step through the Source(设置断点并逐行运行源代码)

         接下来,我们将简单介绍Modelsim的交互式调试特性环境。你将在“源代码”窗口中设置一个断点,运行仿真,然后逐步完成测试中的设计。断点只能在可执行行上设置,它们用红线号表示。

1、在源代码窗口打开 counter.v 文件

(1)选择 View > Files 来打开Files窗口

(2)单击sim文件名旁边的+符号,可以查看vsim.wlf数据集的内容

(3)双击打开counter.v文件 

2、在counter.v文件的第36行设置一个断点

        滚动到第36行,然后单击行号旁边的Ln#(行号)列。在第36行行号列中出现一个红点(图3-9),表示已设置了断点。

3、禁用、启用和删除该断点 

(1)单击该红点以禁用该断点。它会变成一个灰色的点

(2)再次单击灰点以重新启用断点。它会变成一个红点

 

(3)用鼠标右键单击红点,然后选择“删除断点36。

(4)再次单击第36行旁边的行号列,以重新创建断点。 

4、重新启动仿真

(1)单击“重新启动”图标以重新加载设计元素,并将模拟时间重置为零。

        出现的“重新启动”对话框为你提供了关于在重新启动期间要保留什么的选项。

(2)点击OK

(3)点击 run -all按键

        仿真将一直运行,直到到达断点为止。当仿真到达断点时,它将停止运行,在源代码视图中用蓝色箭头突出显示该行(图3-11),并在文字记录窗口中发出中断消息。

        在这个时候程序就停止了运行,我们可以通过自己的方式进行程序运行的检查。

(4)继续运行

        单击步骤”工具栏上的“Step into”图标

        程序就跳过了断点,可以继续运行了。接下来可以自己进行尝试,掌握这部分的相关内容。

四、总结

        我们需要结束当前的模拟。 1.选择“Simulate>End Simulate”。 2.当提示确认要退出仿真时,单击“是”。

        在本文中,我们详细介绍了Modelsim仿真的一个基本流程,并做出了详细的步骤指导。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1161205.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

单工通信、半双工通信、全双工通信分别是什么?

单工通信&#xff1a; 单工通信是一种单向传输数据的通信方式&#xff0c;只允许信息在一个方向上流动。在单工通信中&#xff0c;通信的两个节点中的一个节点只能作为发送方&#xff0c;而另一个节点只能作为接收方。发送方只负责发送数据&#xff0c;而接收方只负责接收数据&…

LLMs之Agent之AutoGen:AutoGen的简介、安装、使用方法之详细攻略

LLMs之Agent之AutoGen&#xff1a;AutoGen的简介、安装、使用方法之详细攻略 目录 AutoGen的简介、安装、使用方法 1、多Agent对话框架 2、AutoGen的对话流程 3、增强的LLM推理 AutoGen的安装 1、安装 2、快速测试 AutoGen的使用方法 1、基础用法 (1)、启动两个代理之…

C++:map和set的基本使用

文章目录 搜索模型关联式容器setset的基本使用set的其他使用 multisetmapmap的基本使用map中的[] multimap 搜索模型 在实际搜索中有两个搜索模型&#xff1a;Key的搜索模型和Key/Value的搜索模型 Key的搜索模型&#xff1a; 简单来说就是在一个搜索树&#xff0c;搜索树中的…

大桌子安装笔记

单位弄了个服务器&#xff0c;里面全是虚拟机&#xff0c;自己也学着建了一个测试用的虚拟机&#xff0c;不知道干点啥好&#xff0c;朋友说做个网盘吧&#xff0c;就用大桌子。 于是&#xff0c;干起来&#xff0c;不会配制&#xff0c;就跟朋友一步一步学起来。 他说&#…

服务熔断保护实践--Sentinal

目录 概述 环境说明 步骤 Sentinel服务端 Sentinel客户端 依赖 在客户端配置sentinel参数 测试 保护规则设置 设置资源名 设置默认的熔断规则 RestTemplate的流控规则 Feign的流控规则 概述 微服务有很多互相调用的服务&#xff0c;构成一系列的调用链路&#xf…

LangChain介绍及代码实践

一、简介 LangChian 作为一个大语言模型开发框架&#xff0c;是 LLM 应用架构的重要一环。那什么是 LLM 应用架构呢&#xff1f;其实就是指基于语言模型的应用程序设计和开发的架构。 LangChian 可以将 LLM 模型、向量数据库、交互层 Prompt、外部知识、外部工具整合到一起&a…

如何看待将本增效?

如何看待将本增效&#xff1f; 么是降本增效&#xff1f;就是公司里&#xff0c;增进收益的动作要多做&#xff0c;无效的动作要少做&#xff0c;甚至不做。什么叫有效&#xff1f;回到公司的经营目标上去&#xff0c;企业的管理就是目标管理。降本&#xff0c;需要卓越运营&a…

NLP学习笔记:使用 Python 进行NLTK

一、说明 本文和接下来的几篇文章将介绍 Python NLTK 库。NLTK — 自然语言工具包 — NLTK 是一个强大的开源库&#xff0c;用于 NLP 的研究和开发。它内置了 50 多个文本语料库和词汇资源。它支持文本标记化、词性标记、词干提取、词形还原、命名实体提取、分割、分类、语义推…

【计算系统】5分钟了解超算,高性能计算,并行计算,分布式计算,网格计算,集群计算以及云计算的区别

5分钟了解超算&#xff0c;高性能计算&#xff0c;并行计算&#xff0c;分布式计算&#xff0c;网格计算&#xff0c;集群计算以及云计算的区别 1. 超算2. 高性能计算3. 并行计算4. 分布式计算5. 网格计算6. 集群计算7. 云计算小结相关资料 1. 超算 超级计算机&#xff08;Sup…

Android拖放startDragAndDrop拖拽onDrawShadow静态添加xml布局View,Kotlin(4)

Android拖放startDragAndDrop拖拽onDrawShadow静态添加xml布局View&#xff0c;Kotlin&#xff08;4&#xff09; import android.content.ClipData import android.graphics.Canvas import android.graphics.Point import android.os.Bundle import android.util.Log import a…

MATLAB 支持向量机(SVM)

MATLAB 支持向量机&#xff08;SVM&#xff09;详细解释&#xff08;含代码&#xff09; 基础线性可分最大间隔超平面 SVM分类基本代码和工具二分类线性非线性 多分类详细解释 基础 线性可分 简单来讲就是如何将两个数据用点、直线、平面分开。。。。。 二维空间中&#xff…

ios原生分享

什么是 ios 系统的原生分享呢&#xff0c;如下图所示 具体使用系统UIActivityViewController&#xff0c;完整代码如下&#xff1a; -(void)shareAny:(NSString *)text url:(NSString *)_url imagePath:(NSString *)_imagePath {NSLog("shareAny, text:%, url:%, imagePa…

Security ❀ DNS协议常见DOS攻击详解

文章目录 1. DNS协议基础概述2. DNS报文详解2.1. DNS Request 请求包2.2. DNS Reply 响应包 3. DNS Request Flood3.1. 攻击原理3.2. 防护方法3.2.1. TC源认证3.2.2. 被动防御3.2.3. CNAME防护模式3.2.4. *CANME类型解析过程** 4. DNS Reply Flood4.1. 攻击原理4.2. 防护方法 5…

【44.全排列Ⅱ】

目录 一、题目描述二、算法原理三、代码实现 一、题目描述 二、算法原理 三、代码实现 class Solution { public:vector<vector<int>> ret;vector<int> path;vector<bool> check;vector<vector<int>> permuteUnique(vector<int>&am…

C语言--温度转化(把华氏度转换为摄氏度)

一.问题描述: 有人用温度计测量出用华氏法表示的温度,今要求把它转换为以摄氏法表示的温度,转换公式如下: 这个代码是C语言的入门代码&#xff0c;难点在于5/9在程序中如何写出。在计算机中5/9等于1。 /符号&#xff1a;整除问题(整数/整数 结果是丢弃小数的整数) 5/2 2。那…

好看的个人导航页源码

这款导航页源码 非常合适个人使用 简洁漂亮 放点自己经常用到的网站 还支持别人自助添加快捷书签 源码获取&#xff1a;https://www.qqmu.com/930.html

UE5——网络——属性复制

当属性被注册进行复制后&#xff0c;您将无法再取消注册&#xff08;涉及到生存期这一话题&#xff09;。之所以会这样&#xff0c;是因为我们要预制尽可能多的信息&#xff0c;以便针对同一组属性将某一工作分担给多个连接。这样可以节省大量的计算时间。 virtual void GetLif…

java入坑之运行管理

一、概述 1.1Java开发和运行过程 编写阶段&#xff1a;采用各种编辑工具&#xff0c;编写.java文件编译阶段&#xff1a;采用javac.exe对java文件编译&#xff0c;产生.class文件运行阶段&#xff1a;采用java.exe加载.class文件运行 详细过程 1.2相关概念 javaOS管理 JavaOS是…

全新二开游戏支付通道/话费/电网、紫水晶带云端源码

源码修复可用&#xff0c;YY业务都可用 本店所售程序只供测试研究&#xff0c;不得使用于非法用途&#xff0c;不得违反国家法律&#xff0c;不得用于进行违法行为&#xff0c;否则后果自负&#xff01;购买以后用作他用附带的一切法律责任后果都由购买者承担于本店无任何关…

Linux开机、重启、关机和用户登录注销

1.【关机】 shutdown shutdown now 表示立即关机 shutdown -h now 表示立即关机 shutdown -h 1 表示1分钟后关机 halt 用来关闭正在运行的Linux操作系统 2.【重启】 shutdown -r now 表示立即重启 reboot 重启系统 sync …