主要内容

验证HDL模块MATLAB试验台

教程概述

本教程指导您通过使用MATLAB设置一个HDL验证器™应用程序的基本步骤®验证一个简单的HDL设计。在本教程中,您将开发、模拟和验证一个基于斐波那契序列的伪随机数生成器模型。该模型采用VHDL语言编写®

请注意

本教程演示如何使用ModelSim创建和运行测试工作台®6.5 SE。如果您没有使用这个版本,ModelSim的消息和屏幕图像在您看来可能与本教程中完全不同。

本教程需要MATLAB、HDL验证软件和ModelSim HDL模拟器。

在本教程中,您将执行以下步骤:

设置教程文件

为了帮助其他人获得教程文件的副本,为你自己的教程工作建立一个文件夹:

  1. 在MATLAB安装文件夹范围之外创建一个文件夹,可以将教程文件复制到其中。文件夹必须是可写的。本教程假设您创建了一个名为MyPlayArea

  2. 将以下文件复制到刚才创建的文件夹中:

    matlabroot\ \工具箱\ edalink \扩展modelsim \ modelsimdemos \ modsimrand_plot.m

    matlabroot\工具箱\edalink\extensions\modelsim\modelsimdemos\VHDL\modsimrand\modsimrand.vhd

启动MATLAB服务器

本节描述了使用共享内存或TCP/IP套接字模式启动MATLAB、设置当前文件夹以完成教程、启动MATLAB服务器组件、检查客户端连接。这些说明假设您熟悉MATLAB用户界面。

执行以下步骤:

  1. 启动MATLAB。

  2. 将MATLAB当前文件夹设置为您创建的文件夹设置教程文件

  3. 通过调用函数验证MATLAB服务器是否正在运行hdldaemon“状态”MATLAB命令窗口中的选项,如下所示:

    hdldaemon(的状态)

    如果服务器未运行,则显示此命令

    HDLDaemon未运行

    如果服务器以TCP/IP套接字模式运行,消息将读取

    HDLDaemon套接字服务器在Port上运行波特纳姆为0的连接

    如果服务器在共享内存模式下运行,则消息将显示

    HDLDaemon共享内存服务器以0连接运行

    如果服务器当前未运行,则跳过该步骤5

  4. 通过输入关闭服务器

    hdldaemon(“杀死”)

    您将看到以下消息,确认服务器已关闭。

    日志含义HDLDaemon服务器关闭
  5. 通过调用以TCP/IP套接字模式启动服务器hdldaemon使用属性名称/属性值对“套接字”0. 值0指定操作系统为服务器分配系统上可用的TCP/IP套接字端口。例如

    hdldaemon(“套接字”,0)

    服务器通过显示以下消息通知您它已经启动。的波特纳姆将特定于您的系统:

    HDLDaemon套接字服务器在Port上运行波特纳姆为0的连接

    波特纳姆因为当你发出matlabtb命令在负载模拟

    您也可以指定MATLAB服务器使用共享内存通信而不是TCP/IP套接字通信;但是,在本教程中,我们将使用套接字通信来演示这种类型的连接。有关如何指定各种选项的详细信息,请参见hdldaemon

开始ModelSim协同仿真的模拟器和设置

本节介绍启动ModelSim软件和设置ModelSim设计库的基本步骤。这些说明假定您熟悉ModelSim用户界面。

执行以下步骤:

  1. 通过调用函数从MATLAB环境启动ModelSimvsim在MATLAB命令窗口中。

    vsim

    这个函数启动并配置ModelSim,以便与HDL验证软件一起使用。ModelSim的第一个文件夹与MATLAB当前文件夹匹配。

  2. 验证当前ModelSim文件夹。可以通过输入。来验证当前ModelSim文件夹是否与MATLAB当前文件夹匹配ls命令在ModelSim命令窗口中。

    命令应该列出这些文件modsimrand.vhdmodsimrand_plot.m成绩单,编译_和_launch.tcl

    如果没有,则将ModelSim文件夹更改为当前的MATLAB文件夹。您可以通过查看当前文件夹浏览器或查看当前文件夹导航栏找到当前MATLAB文件夹。在ModelSim中,您可以通过发出命令来更改工作文件夹

    cd目录

    在哪里目录是你想要工作的文件夹。或者您也可以通过选择来更改目录文件>更改目录……

  3. 创建一个设计库来保存编译结果。创建所需的库_info文件,输入vlibvmap命令如下:

    ModelSim> vlib工作

    请注意

    您必须使用ModelSim文件菜单或vlib命令创建库文件夹,以便所需的_info创建文件。不要使用操作系统命令创建库。

开发硬件描述语言(VHDL)代码

在设置设计库之后,通常您将使用ModelSim Editor来创建和修改您的HDL代码。对于本教程,您不需要自己创建VHDL代码。相反,打开并检查现有文件modsimrand.vhd.本节重点介绍modsimrand.vhd这是ModelSim和MATLAB测试台感兴趣的部分。

如果选择此时不检查HDL代码,请跳到编译硬件描述语言(VHDL)的代码

您可以打开modsimrand.vhd的编辑窗口中编辑命令,如下所示:

ModelSim>编辑modsimrand.vhd

ModelSim打开它编辑窗口,并显示的VHDL代码modsimrand.vhd

当你在查看文件时,注意以下几点:

  • 线路实体modsimrand包含VHDL实体的定义modsimrand

    ENTITY modsimrand IS PORT (clk: IN std_logic;clk_en: IN std_logic;reset: IN std_logic;dout: OUT std_logic_vector (31 DOWNTO 0);modsimrand结束;

    这是将在教程中在MATLAB环境中验证的实体。请注意以下几点:

    • 默认情况下,MATLAB服务器假设在MATLAB环境中验证实体的MATLAB函数的名称与实体名称相同。您可以选择显式地命名MATLAB函数。但是,如果不指定名称,服务器希望函数名称与实体名称匹配。在本例中,MATLAB函数名为modsimrand_plot而且不匹配。

    • 实体必须使用港口包含至少一个端口定义的子句。每个端口定义必须指定端口模式(出来,或伊努特)以及HDL验证器软件支持的VHDL数据类型。金宝app

      实体modsimrand在这个例子中,定义了三个输入端口clk赤濸恩,重置类型的STD_LOGIC和输出端口dout类型的STD_LOGIC_VECTOR.输出端口将仿真输出数据传递给MATLAB函数进行验证。可选输入端口接收来自该功能的时钟和复位信号。或者,输入端口可以接收ModelSim的信号武力命令。

      有关用MATLAB编写端口实体的更多信息,请参见用MATLAB编写HDL模块进行验证

  • 下面的代码modsimrand.vhd定义的行为架构modsimrand当时钟经历上升沿时,将随机生成的斐波那契数列写入输出寄存器。

检查完文件后,关闭ModelSim编辑窗口。

编译硬件描述语言(VHDL)代码

创建或编辑VHDL源文件后,编译它们。作为本教程的一部分,编译modsimrand.vhd.编译文件的一种方法是单击项目工作区中的文件名并选择编译>编译所有.另一种选择是指定modsimrand.vhd威科姆公司命令,如下所示:

ModelSim>vcom modsimrand.vhd

如果编译成功,命令窗口中将出现消息,编译器将使用编译结果填充工作库。

开发MATLAB函数

HDL验证器软件在MATLAB中作为功能验证HDL硬件。通常,在这一点上,您将创建或编辑MATLAB函数,以满足HDL验证器的要求。对于本教程,您不需要自己开发MATLAB测试台函数。相反,打开并检查现有文件modsimrand_plot.m

如果选择此时不检查HDL代码,请跳到负载模拟

请注意

modsimrand_plot.m是一个下层组件的MATLAB随机数发生器的例子。内部打印代码modsimrand_plot.m在下一节中不讨论。本教程只关注这些部分modsimrand_plot.m这是MATLAB验证VHDL模型所需的。

您可以打开modsimrand_plot.m在MATLAB编辑器中。例如:

编辑modsimrand_plot.m

当你在查看文件时,注意以下几点:

  • 在第1行,您将找到指定的MATLAB函数名及其所需参数:

    Function [iport,tnext] = modsimrand_plot(port,tnow,portinfo)

    这个函数定义很重要,因为它代表了MATLAB和ModelSim之间的通信通道。注意:

    • 编码函数时,必须使用两个输出参数定义函数,iport下一个,以及三个输入参数,奥波特tnow,portinfo. 看见MATLAB函数语法和函数参数定义

    • 你可以使用iport参数来驱动输入信号,而不是使用其他信号源,如ModelSim武力命令。根据您的应用程序,您可以使用任何输入源的组合。然而,如果多个源驱动信号到一个iport,您将需要一个解析函数来处理信号争用。

  • 在第22和23行,你会发现一些参数初始化:

    tnext = [];iport =结构();

    在这种情况下,函数输出iport下一个初始化为空值。

  • 当编写MATLAB函数与HDL验证器一起使用时,您需要知道测试台函数接收到的数据类型,以及需要返回到ModelSim的数据类型,以及HDL验证器如何处理这些数据;看到金宝app支持的数据类型. 此函数包括以下端口数据类型定义和转换:

    • 为本教程定义的实体由三个类型的输入端口组成STD_LOGIC和类型的输出端口STD_LOGIC_VECTOR

    • 数据的类型STD_LOGIC_VECTOR由每个字符一个位的字符列向量组成。

    • 接口转换类型的标量数据STD_LOGIC到与对应枚举类型的字符字面值相匹配的字符。

    在第62行,这行代码包含oport.dout演示了MATLAB函数从ModelSim接收的数据可能需要转换以便在MATLAB环境中使用:

    ud.buffer(本体)= mvl2dec (oport.dout)

    在本例中,函数接收STD_LOGIC_VECTOR上的数据奥波特.这个函数mvl2dec将位向量转换为可用于算术计算的十进制值。金宝app支持的数据类型提供在编码自己的MATLAB函数时要考虑的数据转换类型的摘要。

  • 请随意浏览剩下的内容modsimrand_plot.m.当你完成时,去负载模拟

负载模拟

编译完VHDL源文件后,就可以为模拟加载模型了。本节介绍如何加载实体的实例modsimrand仿真:

  1. 加载的实例modsimrand核查。要加载实例,请指定vsimmatlab命令如下:

    ModelSim > vsimmatlab modsimrand

    vsimmatlab命令启动ModelSim模拟器,vsim,专门用于MATLAB。ModelSim在加载实体的包和体系结构时在命令窗口中显示一系列消息。

  2. 初始化模拟器以进行验证modsimrand用MATLAB。您可以使用HDL验证器初始化ModelSimmatlabtb命令。这个命令定义了通信链接和一个回调到一个代表ModelSim在MATLAB中执行的MATLAB函数。此外,matlabtb命令可以指定控制MATLAB函数执行时的参数。

    对于本教程,请输入以下内容matlabtb命令:

    > matlabtb modsimrand -mfunc modsimrand_plot -rising /modsimrand/clk波特纳姆

    命令行中的参数指定以下条件:

    • modsimrand—指定要模拟的VHDL模块。

    • -mfunc modsimrand_plot—链接实体的实例modsimrand对MATLAB函数的修改modsimrand_plot.m.这个参数是必需的,因为实体名称与测试台函数名称不相同。

    • -上升/modsimrand/clk-指定当信号出现时调用测试台函数/ modsimrand clk体验上升的优势。

    • 套接字波特纳姆—指定由调用发出或返回的端口号hdldaemon启动MATLAB服务器

  3. 初始化时钟和重置输入信号。您可以使用多种机制驱动模拟输入信号,包括ModelSim武力命令和一个iport参数(见测试台函数的语法)。现在,请输入以下内容武力命令:

    > force /modsimrand/clk 0 0 ns, 1 5 ns -repeat 10 ns > force /modsimrand/clk_en 1 > force /modsimrand/reset 1 0,0 50 ns

    第一个命令迫使clk信号在0纳秒时值为0,在5纳秒时值为1。10纳秒之后,循环开始每10纳秒重复一次。第二和第三武力命令集赤濸恩1,重置在0纳秒时变为1,在50纳秒时变为0。

ModelSim环境已准备好运行模拟。现在,您需要设置MATLAB函数。

运行仿真

本节介绍了如何启动和监视此模拟,并根据需要重新运行它。完成所需数量的模拟运行后,按照下一节中的说明关闭模拟。

第一次运行模拟

在首次运行模拟之前,必须验证客户端连接。您可能还希望为调试设置断点。

执行以下步骤:

  1. 打开ModelSim和MATLAB窗口。

  2. 在MATLAB中,通过调用hdldaemon“状态”选项:

    hdldaemon(的状态)

    这个函数返回一条消息,表明存在一个连接:

    HDLDaemon套接字服务器运行在端口4795上,有一个连接

    HDLDaemon共享内存服务器正在使用1个连接运行

    请注意

    如果您试图在启动hdldaemon在MATLAB中,您将收到以下警告:

    #ML warning - MATLAB server not available (yet), The entity 'modsimrand' will not be active
  3. 开放modsimrand_plot.m在MATLAB编辑器中。

  4. 搜索oport.dout并通过单击行号旁边的来在该行设置断点。将出现一个红色断点标记。

  5. 返回ModelSim并在命令窗口中输入以下命令:

    >跑了80000

    该命令指示ModelSim将模拟推进80000个时间步长(使用默认的时间步长周期为80000纳秒)。因为您之前设置了一个断点modsimrand_plot.m但是,仿真在MATLAB中运行,直到达到断点。

    ModelSim现在被阻塞,并且一直处于阻塞状态,直到您显式地解除它的阻塞。当模拟被阻塞时,请注意,MATLAB显示ModelSim传递给MATLAB函数的数据工作空间窗口。

    在ModelSim中,将打开一个空的地物窗口。可以使用此窗口打印模拟生成的数据。

  6. 检查奥波特portinfo,tnow将鼠标悬停在MATLAB编辑器中的这些参数上。注意tnow,当前模拟时间设置为0.还要注意,因为模拟在第一次调用期间已经到达了一个断点modsimrand_plot,portinfo参数在MATLAB工作空间中可见。

  7. 点击继续在MATLAB编辑器中。下次到达断点时,请注意portinfo不再出现在MATLAB工作区中。的portinfo函数没有显示,因为它只在第一次函数调用时传入。还要注意的是tnow从0推进到5e-009。

  8. 通过单击红色断点标记清除断点。

  9. 取消阻止ModelSim并单击继续模拟继续在MATLAB编辑器中。

    模拟工作即将完成。随着模拟的进行,它会在图形窗口中绘制生成的数据。模拟完成后,将显示figure窗口,如图所示。

仿真在MATLAB中运行,直到达到刚才设置的断点。根据需要继续模拟/调试会话。

运行仿真

如果希望再次运行模拟,则必须在ModelSim中重新启动模拟,重新初始化时钟,并重置输入信号。这样做:

  1. 关闭图形窗口。

  2. 使用以下命令重新启动模拟:

    >重启

    重新启动对话框出现了。保留所有选项,然后单击重新启动

    请注意

    重新启动按钮清除由控件建立的模拟上下文matlabtb命令。因此,重新启动ModelSim后,必须重新发出以前的命令或发出新的命令。

  3. 补发的matlabtb命令在HDL模拟器中。

    > matlabtb modsimrand -mfunc modsimrand_plot -rising /modsimrand/clk波特纳姆

  4. 开放modsimrand_plot.m在MATLAB编辑器中。

  5. 在与上次运行时相同的行上设置断点。

  6. 返回ModelSim并重新输入以下命令来重新初始化时钟和输入信号:

    > force /modsimrand/clk 0 0,1 5 ns -repeat 10 ns > force /modsimrand/clk_en 1 > force /modsimrand/reset 10, 0 50 ns

  7. 输入命令启动模拟,例如:

    >跑了80000

关闭模拟

本节介绍如何有序地关闭模拟。

在ModelSim中,执行以下步骤:

  1. 通过选择在客户端停止模拟模拟>最后仿真或进入辞职命令。

  2. ModelSim辞职。

在MATLAB中,您可以退出应用程序,这将关闭仿真并关闭MATLAB。

要在不关闭MATLAB的情况下关闭服务器,可以选择调用hdldaemon“杀”选项:

hdldaemon(“杀死”)

出现以下消息,确认服务器已关闭:

日志含义HDLDaemon服务器关闭