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

一、概述

        在本文中,我们将介绍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仿真的一个基本流程,并做出了详细的步骤指导。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

arcgis将合并(组合)要素拆分的方法

1、打开一幅图&#xff0c;发现两块区域被连接成一块区域&#xff0c;如下&#xff1a; 2、在可编辑状态下&#xff0c;进行拆分&#xff0c;先选中待拆分要素&#xff0c;如下&#xff1a; 3、拆分后&#xff0c;如下&#xff1a;

C++初阶 类和对象(上)

前言&#xff1a;C初阶系列&#xff0c;每一期博主都会使用简单朴素的语言将对应的知识分享给大家&#xff0c;争取让所有人都可以听懂&#xff0c;C初阶系列会持续更新&#xff0c;上学期间将不定时更新&#xff0c;但总会更的 目录 一、什么是面向对象编程 二、什么是类和如…

白银期货投资指南,轻松搞定白银投资

在今天的金融市场中&#xff0c;白银已成为备受瞩目的投资选择。不仅如此&#xff0c;白银还是避险资产的首选之一&#xff0c;兼具保值和增值的潜力。万洲金业将为您提供一份白银期货投资指南&#xff0c;让您轻松了解白银投资&#xff0c;助力在白银交易市场获得潜在收益。 …

mpp解码详解

解码器数据流接口 一. decode_put_packet 输入码流的形式&#xff1a;分帧与不分帧 MPP 的输入都是没有封装信息的裸码流&#xff0c;裸码流输入有两种形式&#xff1a; 不分帧 这种方式是已经按帧分段的数据&#xff0c;即每一包输入给 decode_put_packet 函数的 MppPacket 数…

Spring事务失效的几种情况及其解决方案

Spring事务失效的几种情况及其解决方案 方法权限修饰符不是public Transactional 使用的是 Spring AOP 实现的&#xff0c;而 Spring AOP 是通过动态代理实现的&#xff0c;而 Transactional 在生成代理时会判断&#xff0c;如果方法为非 public 修饰的方法&#xff0c;则不生…

皮肤渲染方法总结

一、皮肤次表面光照 HDRP用的延迟管线&#xff0c;镜面和散射分开进行计算 UE有透射开启和关闭的效果 &#xff08;一&#xff09;镜面反射 BRDF和Kelemen方法 &#xff08;二&#xff09;次表面散射与透射 1.散射&#xff1a;BRDF与BRSSDF&#xff08;从反射点附近的点进行…

2023-11-01 LeetCode每日一题(参加会议的最多员工数)

2023-11-01每日一题 一、题目编号 2127. 参加会议的最多员工数二、题目链接 点击跳转到题目位置 三、题目描述 一个公司准备组织一场会议&#xff0c;邀请名单上有 n 位员工。公司准备了一张 圆形 的桌子&#xff0c;可以坐下 任意数目 的员工。 员工编号为 0 到 n - 1 。…

MongoDB——MongoDB删除系统自带的local数据库

一、MongoDB删除系统自带的local数据库 1.1、linux环境进入mongo客户端 输入 mongo 命令&#xff0c;进入命令行客户端 进入admin库&#xff0c;并登录&#xff0c;查看所有数据库 #进入admin库 use admin #并登录admin db.auth("username","password")…

【论文笔记】Unifying Large Language Models and Knowledge Graphs:A Roadmap

&#xff08;后续更新完善&#xff09; 2. KG-ENHANCED LLMS 2.1 KG-enhanced LLM Pre-training 以往将KGs集成到大型语言模型的工作主要分为三个部分:1)将KGs集成到训练目标中&#xff0c;2)将KGs集成到LLM输入中&#xff0c;3)将KGs集成到附加的融合模块中。 2.1.1 Integr…

大语言模型(LLM)综述(五):使用大型语言模型的主要方法

A Survey of Large Language Models 前言6 UTILIZATION6.1 In-Context Learning6.1.1 提示公式6.1.2 演示设计6.1.3 底层机制 6.2 Chain-of-Thought Prompting6.2.1 CoT的上下文学习6.2.2 关于CoT的进一步讨论 6.3 Planning for Complex Task Solving6.3.1 整体架构6.3.2 计划生…

基于松鼠算法的无人机航迹规划-附代码

基于松鼠算法的无人机航迹规划 文章目录 基于松鼠算法的无人机航迹规划1.松鼠搜索算法2.无人机飞行环境建模3.无人机航迹规划建模4.实验结果4.1地图创建4.2 航迹规划 5.参考文献6.Matlab代码 摘要&#xff1a;本文主要介绍利用松鼠算法来优化无人机航迹规划。 1.松鼠搜索算法 …

pytorch复现_NMS

NMS&#xff08;非极大值抑制&#xff09;阈值是用于控制在一组重叠的边界框中保留哪些边界框的参数。当检测或识别算法生成多个边界框可能涵盖相同物体时&#xff0c;NMS用于筛选出最相关的边界框&#xff0c;通常是根据它们的置信度分数。 具体来说&#xff0c;NMS的工作原理…

Linux系统jdkTomcatMySQL安装以及J2EE后端接口部署

目录 一、jdk&Tomcat安装 1.1 上传安装包到服务器 1.2 解压对应工具包 1.3 配置环境变量并测试jdk安装 1.4 启动tomcat 1.5 防火墙设置 1.5.1 开启/关闭防火墙以及防火墙状态查看 1.5.2 开放防火墙端口 二、MySQL安装 2.1 卸载mariadb 2.2 在线下载MySQL安装包(…

2015年美亚杯全国电子数据取证大赛个人

做题 1.请找出如下windows XP系统信息&#xff1a;&#xff08;10分&#xff09; a. 系统安装时间 &#xff08;YYYY/MM/DD&#xff09; 考时间 我们先去看看该电脑的时区 都是东八区 那我们直接看时间 因为题目没有要求我们时间 答案为 2015-08-07 16:45:52 转为格式 201…

【zip密码】如何取消zip压缩包的密码?

我们想要对压缩包进行加密&#xff0c;但是当我们不需要加密压缩包的时候&#xff0c;该如何取消zip压缩包密码呢&#xff1f;那么zip压缩包密码取消都有什么方法呢&#xff1f;今天将方法总结分享给大家。 最原始的方法&#xff0c;就是通过解压文件&#xff0c;将解压出的文…

uniapp 微信小程序 授权隐私流程 网上没有的踩坑记录!

首先什么时候我们需要授权操作&#xff0c;比如下图我们调用这些接口时候首先必须让用户授权&#xff0c;这个政策是2022年2月21日24时起对一下接口增加用户授权操作&#xff0c;详情可以看微信文档 授权的逻辑按照官网的意思是&#xff1a; 这个时候就踩坑了&#xff0c;我把…

这个电力问题难倒90%的人,但我只用一招就搞定!

随着现代社会对电力需求的不断增加&#xff0c;配电系统的可靠性和安全性变得至关重要。为了确保电力系统的稳定运行&#xff0c;配电柜监控系统应运而生。 配电柜监控系统通过实时监测和控制电力分配&#xff0c;提供了对电力系统状态的详细洞察&#xff0c;以帮助运维人员及时…

编程助手DevChat:让开发更轻松

#AI编程助手哪家好&#xff1f;DevChat“真”好用 # 目录 前言一、安装Vscode1、下载链接2、安装 二、注册DevChat1、打开注册页2、验证成功完成邮箱绑定3、绑定微信可获得8元 三、安装插件四、配置Access Key1、获取Access Key2、设置Access Key①、点击左下角管理&#xff08…

linux jdk配置

1.下载jdk &#xff0c;以jdk1.8为例子 Java Downloads | Oracle JDK 8 Update Release Notes (oracle.com) 2.配置环境变量 1.下载相关jdk版本&#xff0c;执行以下命令安装jdk tar -zxvf jdk-8u144-linux-x64.tar.gz 2.编辑命令 vi /etc/profile 3.在最后加入下面配置 e…

Kafka - 3.x 消费者 生产经验不完全指北

文章目录 生产经验之Consumer事务生产经验—数据积压&#xff08;消费者如何提高吞吐量&#xff09; 生产经验之Consumer事务 Kafka引入了消费者事务&#xff08;Consumer Transactions&#xff09;来确保在消息处理期间维护端到端的数据一致性。这使得消费者能够以事务的方式…