人生状态机 · 2022年03月12日

[走近FPGA]之工具篇(下)—Modelsim

工具简介

在本专栏之前发布的一篇知乎文章中,已经对SoC设计实验需要用到的相关软件工具进行了简单的介绍,文章链接如下:

在走近FPGA系列文章中主要用到的工具有Vivado和Modelsim,其中Vivado软件在上一篇文章中已经做过详细介绍,文章链接如下:

本篇文章将主要介绍Modelsim的安装和使用。

安装流程

在官网(https://www.mentor.com/company/higher\_ed/modelsim-student-edition)可以下载到免费版(学生版),只需填写少量信息即可。在下载完成后,打开安装包,开始安装过程。前两个界面直接点击Next和Yes即可。接下来选择安装目录,注意不要出现中文。

选择安装目录

选择图标文件夹,保持默认点击Next即可。

最后点击Finish即可。

在等待一段时间的安装过程后,会自动弹出申请学生License的网站界面,填写完带*标记的信息后,便会弹出License申请成功的通知。申请成功后License将会很快发送到填写的邮箱中。

License下载完成之后,将其复制到Modelsim软件的安装目录下,即可正常使用Modelsim软件进行仿真,进入Modelsim时正常的界面如下:

将license移入安装目录

功能仿真

功能仿真(前仿)主要特点是只仿真逻辑功能是否正确,而时序仿真(后仿)主要关心在考虑电路中的时序信息后功能是否正确。关于前仿和后仿更多的区别与联系可以看这个问题下的回答:

本文将简要介绍做功能仿真和时序仿真的步骤。

首先打开Modelsim软件,点击左上角的File->New->Project新建一个工程,如图所示。

新建工程

接着在下图所示的界面中输入工程名和工程存放的路径(注意不要有中文)。

添加文件到工程时选择“Add Existing File”(已经事先编写好模块~一个简单的计数器,为了对比按[N:0]定义A信号,[0:N]定义A\_comp信号,每次时钟上升沿+1),点击browse选择文件(可以一次选择多个文件),然后点击OK。

//counter.v
module counter(
  input clk,
  input rstn,
  output reg [3:0] A
);

reg [0 : 3] A_comp;

wire [3 : 0] A_next = A + 1'b1;
wire [0 : 3] A_comp_next = A_comp + 1'b1;

always @ (posedge clk or negedge rstn) begin
  if (~rstn) begin
    {A, A_comp} <= 8'b0;
  end
  else begin
    A <= A_next;
    A_comp <= A_comp_next;
  end
end

endmodule

//counter_tb.v
`timescale 1ns/1ps
module counter_tb();

reg clk, rstn;
wire [3:0] A;

counter uut(
   .clk  (clk)
  ,.rstn (rstn)
  ,.A    (A)
);

initial begin
  clk <= 1'b0;
  rstn <= 1'b0;
  #21
  rstn <= 1'b1;
end

always begin
  #5 clk <= ~clk;
end

endmodule

添加已有设计文件

之后便可以在Project一栏看到刚才添加的文件,右键空白区域,选择Compile一栏下的Compile All,将刚才添加的文件全部编译。编译完成后每个文件右边对应的Status会变成绿色的对勾,如果出现错误,则需要根据下方消息框的报错信息进行代码修改再编译。

编译模块

编译完成后,在Library一栏下找到work,可以看到编译好的两个模块test和test\_tb,双击test\_tb开始仿真。

开始仿真

进入仿真界面后,首先在左侧sim栏中选中例化的模块,在右侧的Objects栏中便会出现信号列表,将需要添加到波形中进行观察的信号选中,右键选择Add Wave即可。

添加需要观察的信号

可以看到在右边的波形窗口中已经出现了刚才添加的信号,最后点击上方工具栏的的Run即可,时间框内的100ps表示Run一次的仿真时间。

至此,功能仿真过程结束,可以在右边的窗口中看到波形。

波形图

联合Vivado进行时序仿真

进行时序仿真需要考虑到FPGA实现时布局布线带来的延迟,因此需要在Vivado综合实现后进行(Vivado的基本操作在上一篇文章已经讲过,所以本篇不再赘述),为了联合Vivado和Modelsim软件进行时序仿真,首先需要在Vivado中进行相应的设置。

首先从左侧工具栏中的Settings进入设置,如下图。

在Tool Settings下方的3rd Party Simulators中找到Modelsim,选择安装路径之后点击OK。

指定第三方仿真器

接着在Modelsim的安装路径下新建一个文件夹(vivado\_lib),用于存储仿真库。

在Vivado中Tools栏下点击Compile Simulation Libraries开始编译仿真库。

编译仿真库

在弹出的界面中选择Modelsim Simulator,器件里选上Artix-7,Compiled library location选择刚才新建的文件夹vivado\_lib,Simulator executable path选择modelsim的安装路径,都选择完成后点击Compile开始编译。这个过程需要等待一段不算太短的时间,建议玩会游戏。

路径设置

编译完成之后再回到Simulation设置中将Compiled library location设置为刚才新建的vivado\_lib文件夹即可。

设置完成后,接下来便需要添加testbench文件到工程中,首先在文件管理区点击Add Sources添加文件,在弹出的窗口中选择Add or create simulation sources。

在弹出的窗口中选择Add Files,然后选中testbench文件,点击OK添加到工程中。

添加testbench到工程中

点击左侧工具栏中的Run Implementation开始综合实现,完成后点击Run Simulation然后点击Run Post-Implementation Timing Simulation(实现后时序仿真)开始时序仿真。

开始时序仿真

Vivado将会调用Modelsim软件,最后可以观察到如下图所示的波形图。时序仿真过程已经考虑到了实际电路中的延时信息,可以看到,信号A在时钟上升沿后经过了短暂的延时才发生变化。

时序仿真波形图

仿真的重要性

这里扯一点题外话,虽然本文的主旨是介绍仿真工具Modelsim的使用,但仿真的重要性往往被初学者忽视,所以想就这个话题简单谈一谈。上

@其实我是老莫

老师的EDA课时,老师便经常强调仿真的重要性,结合老师上课讲的内容和个人实际的经验来看,如果(自信地)不进行仿真直接在FPGA板上进行验证,最后都得回归到功能仿真这一步来查错。一次功能仿真的时间不到一分钟,而一个比较简单的设计综合实现生成比特流的过程也需要几分钟,所以在上板之前先进行功能仿真查错,既节约了时间,又不会因为上板出现一堆低级错误而懊恼,何乐而不为呢?另外,在SoC设计实验中,如果忽视仿真过程,直接上板跑C程序,出现错误时比较难定位是硬件问题还是软件问题,如果先进行仿真,就可以先把硬件上的问题解决,之后再进行软件调试时效率会高很多。

END

知乎:https://zhuanlan.zhihu.com/p/159451972

推荐阅读

更多内容请关注其实我是老莫的网络书场专栏
推荐阅读
目录
极术微信服务号
关注极术微信号
实时接收点赞提醒和评论通知
安谋科技学堂公众号
关注安谋科技学堂
实时获取安谋科技及 Arm 教学资源
安谋科技招聘公众号
关注安谋科技招聘
实时获取安谋科技中国职位信息