验证HDL模块MATLAB试验台
教程概述
本教程指导您完成设置使用MATLAB的HDL Verifier™应用程序的基本步骤®验证一个简单的HDL设计。在本教程中,您将开发、模拟并验证基于斐波那契数列的伪随机数生成器的模型。模型是用VHDL编写的®.
请注意
本教程演示使用ModelSim创建和运行测试工作台®6.5 SE。如果您没有使用此版本,来自ModelSim的消息和屏幕图像可能与本教程中显示的不完全相同。
本教程需要MATLAB、HDL Verifier软件和ModelSim HDL模拟器。
在本教程中,您将执行以下步骤:
建立教程文件
为了帮助其他人访问教程文件的副本,为自己的教程工作建立一个文件夹:
在MATLAB安装文件夹的范围之外创建一个文件夹,您可以将教程文件复制到该文件夹中。该文件夹必须是可写的。本教程假设您创建了一个名为
MyPlayArea
.复制以下文件到你刚刚创建的文件夹:
matlabroot
\ \工具箱\ edalink \扩展modelsim \ modelsimdemos \ modsimrand_plot.mmatlabroot
\工具箱\ edalink \ \ modelsim \ modelsimdemos \扩展硬件描述语言(VHDL) \ modsimrand \ modsimrand.vhd
启动MATLAB服务器
本节描述启动MATLAB,设置当前文件夹以完成教程,启动MATLAB服务器组件,使用共享内存或TCP/IP套接字模式检查客户端连接。这些说明假设您熟悉MATLAB用户界面。
请执行以下步骤:
MATLAB开始。
将您的MATLAB当前文件夹设置为您创建的文件夹建立教程文件.
通过调用函数验证MATLAB服务器正在运行
hdldaemon
与“状态”
选项在MATLAB命令窗口,如下所示:hdldaemon(的状态)
如果服务器没有运行,则显示此函数
HDLDaemon没有运行
如果服务器以TCP/IP套接字模式运行,则消息读取
HDLDaemon套接字服务器正在端口上运行portnum为0的连接
如果服务器以共享内存模式运行,则消息读取
HDLDaemon共享内存服务器在0连接的情况下运行
如果服务器当前未运行,请跳到步骤
5
.通过输入关闭服务器
hdldaemon(“杀死”)
您将看到以下消息,确认服务器已关闭。
HDLDaemon服务器被关闭
通过调用以TCP/IP套接字模式启动服务器
hdldaemon
使用属性名/属性值对“套接字”0
.值0指定操作系统为服务器分配一个系统上可用的TCP/IP套接字端口。例如hdldaemon(“套接字”,0)
服务器通过显示以下消息通知您它已经启动。的
portnum
将特定于您的系统:HDLDaemon套接字服务器正在端口上运行portnum为0的连接
值得注意的
portnum
当您发出matlabtb
命令在负载模拟.您也可以指定MATLAB服务器使用共享内存通信,而不是TCP/IP套接字通信;然而,在本教程中,我们将使用套接字通信来演示这种类型的连接。关于如何指定各种选项的详细信息,请参见
hdldaemon
.
开始ModelSim用于联合仿真的模拟器和设置
本节描述启动ModelSim软件和设置ModelSim设计库的基本过程。这些说明假设您熟悉ModelSim用户界面。
请执行以下步骤:
通过调用函数从MATLAB环境启动ModelSim
vsim
在MATLAB命令窗口中。vsim
该函数启动并配置ModelSim,以便与HDL Verifier软件一起使用。ModelSim的第一个文件夹与您的MATLAB当前文件夹相匹配。
验证当前ModelSim文件夹。您可以通过输入。来验证当前ModelSim文件夹是否与MATLAB当前文件夹匹配
ls
命令。该命令应该列出文件
modsimrand.vhd
,modsimrand_plot.m
,成绩单
,compile_and_launch.tcl
.如果没有,则将ModelSim文件夹更改为当前的MATLAB文件夹。您可以通过查看当前文件夹浏览器或查看当前文件夹导航栏找到当前MATLAB文件夹。在ModelSim中,您可以通过发出命令来更改工作文件夹
cd目录
在哪里
目录
要从其中工作的文件夹。或者您也可以通过选择更改目录文件>更改目录…….创建一个设计库来保存编译结果。来创建所需的库
_info
文件,输入vlib
而且vmap
命令如下:ModelSim> vlib工作ModelSim> vmap工作工作
请注意
您必须使用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
:实体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
和不匹配。实体必须用
港口
子句,包含至少一个端口定义。每个端口定义必须指定端口模式(在
,出
,或INOUT
)和由HDL Verifier软件支持的VHDL数据类型。实体
modsimrand
在本例中定义了三个输入端口clk
,clk_en
,重置
类型的STD_LOGIC
和输出端口dout
类型的STD_LOGIC_VECTOR
.输出端口将仿真输出数据传递给MATLAB函数进行验证。可选的输入端口接收来自函数的时钟和复位信号。或者,输入端口可以接收来自ModelSim的信号力
命令。有关编码用于MATLAB的端口实体的更多信息,请参见用MATLAB编写HDL模块进行验证.
的剩余代码
modsimrand.vhd
定义行为体系结构modsimrand
当时钟经历上升沿时,它会将一个随机生成的斐波那契数列写入输出寄存器。
当您检查完文件后,关闭ModelSim编辑窗口。
编译硬件描述语言(VHDL)代码
创建或编辑VHDL源文件后,编译它们。作为本教程的一部分,编译modsimrand.vhd
.编译文件的一种方法是在项目工作区中单击文件名并进行选择编译>编译所有.另一种方法是指定modsimrand.vhd
与威科姆公司
命令,如下所示:
ModelSim >威科姆公司modsimrand.vhd
如果编译成功,消息将出现在命令窗口中,编译器将用编译结果填充工作库。
开发MATLAB函数
HDL Verifier软件在MATLAB中作为一个函数对HDL硬件进行验证。通常,此时您将创建或编辑一个满足HDL验证器要求的MATLAB函数。对于本教程,您不需要自己开发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函数名及其所需的参数:
函数[import,tnext] = modsimrand_plot(oport,tnow,portinfo)
这个函数定义很重要,因为它代表了MATLAB和ModelSim之间的通信通道。注意:
在编写函数时,必须用两个输出参数定义函数,
iport
而且tnext
和三个输入参数,oport
,tnow
,portinfo
.看到MATLAB函数语法和函数参数定义.您可以使用
iport
参数来驱动输入信号,而不是使用其他信号源,如ModelSim力
命令。根据您的应用程序,您可以使用输入源的任何组合。然而,如果多个源驱动信号到单个源iport
,则需要一个分辨率函数来处理信号争用。
在第22和23行,你会发现一些参数初始化:
tnext = [];iport =结构();
在本例中,是函数输出
iport
而且tnext
初始化为空值。当编写与HDL Verifier一起使用的MATLAB函数时,您需要知道测试台架函数从ModelSim接收和需要返回的数据的类型,以及HDL Verifier如何处理这些数据;看到支持的数据类型.该函数包括以下端口数据类型定义和转换:
为本教程定义的实体由三个类型的输入端口组成
STD_LOGIC
和类型的输出端口STD_LOGIC_VECTOR
.数据的类型
STD_LOGIC_VECTOR
由字符的列向量组成,每个字符有一个位。该接口转换类型的标量数据
STD_LOGIC
到与对应枚举类型的字符字面量匹配的字符。
在第62行,包含
oport.dout
演示了MATLAB函数从ModelSim接收到的数据可能需要转换以在MATLAB环境中使用:ud.buffer(本体)= mvl2dec (oport.dout)
在本例中,函数接收
STD_LOGIC_VECTOR
上的数据oport
.这个函数mvl2dec
将位向量转换为可用于算术计算的十进制值。支持的数据类型提供了在编写自己的MATLAB函数时要考虑的数据转换类型的摘要。请随意浏览剩下的部分
modsimrand_plot.m
.当你完成时,转到负载模拟.
负载模拟
编译VHDL源文件之后,就可以加载模型进行模拟了。本节解释如何加载实体的实例modsimrand
仿真:
的实例加载
modsimrand
核查。要加载实例,请指定vsimmatlab
命令如下:ModelSim > vsimmatlab modsimrand
的
vsimmatlab
命令启动ModelSim模拟器,vsim
,专门与MATLAB一起使用。ModelSim在加载实体的包和体系结构时,在命令窗口中显示一系列消息。初始化模拟器进行验证
modsimrand
用MATLAB。您可以使用HDL验证器初始化ModelSimmatlabtb
命令。该命令定义了通信链接和对代表ModelSim在MATLAB中执行的MATLAB函数的回调。此外,matlabtb
命令可以指定控制MATLAB函数何时执行的参数。对于本教程,输入以下内容
matlabtb
命令:> matlabtb modsimrand -mfunc modsimrand_plot -rising /modsimrand/clk -socket .使用实例portnum
命令行中的参数指定以下条件:
modsimrand
—指定要共同模拟的VHDL模块。-mfunc modsimrand_plot
—链接实体的实例modsimrand
到MATLAB函数modsimrand_plot.m
.必须使用此参数,因为实体名称与测试工作台函数名称不相同。/ modsimrand clk不断
-指定每当有信号时调用测试台函数/ modsimrand clk
经历一个上升的边缘。套接字
portnum
—指定调用时发出或返回的端口号hdldaemon
在启动MATLAB服务器.
初始化时钟并重置输入信号。您可以使用包括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纳秒重复一次。第二个和第三个力
命令集clk_en
1,重置
0纳秒到1 50纳秒到0。
ModelSim环境已经准备好运行模拟了。现在,你需要建立MATLAB函数。
运行仿真
本节解释如何启动和监视此模拟,并根据需要重新运行它。当您完成了所需的模拟运行次数后,请按下一节所述关闭模拟。
第一次运行仿真
在第一次运行模拟之前,必须验证客户端连接。您可能还希望为调试设置断点。
请执行以下步骤:
打开ModelSim和MATLAB窗口。
在MATLAB中,通过调用验证客户端连接
hdldaemon
与“状态”
选择:hdldaemon(的状态)
这个函数返回一个消息,表明连接存在:
HDLDaemon套接字服务器在4795端口上运行,有一个连接
或
HDLDaemon共享内存服务器运行一个连接
请注意
方法之前,如果试图运行模拟
hdldaemon
在MATLAB中,你会收到以下警告:#ML警告- MATLAB服务器不可用(还),实体“modsimrand”将不会被激活
开放
modsimrand_plot.m
在MATLAB编辑器中。搜索
oport.dout
并通过单击行号旁边的按钮在该行上设置断点。将出现一个红色的断点标记。返回ModelSim,在命令窗口中输入以下命令:
>跑了80000
该命令指示ModelSim将模拟提前80,000个时间步(使用默认时间步周期80,000纳秒)。因为您之前在中设置了断点
modsimrand_plot.m
然而,仿真在MATLAB中运行,直到达到断点。ModelSim现在被阻塞,并且一直保持阻塞状态,直到显式地解除阻塞。当模拟被阻塞时,注意MATLAB显示ModelSim传递给MATLAB函数的数据工作空间窗口。
在ModelSim中,打开一个空的图形窗口。您可以使用此窗口绘制模拟生成的数据。
检查
oport
,portinfo
,tnow
将鼠标悬停在MATLAB编辑器中的这些参数上。观察到tnow
,当前模拟时间设置为0
.还要注意,因为模拟在第一次调用时达到了断点modsimrand_plot
,portinfo
参数在MATLAB工作区中是可见的。点击继续在MATLAB编辑器中。下次到达断点时,请注意
portinfo
不再出现在MATLAB工作区中。的portinfo
函数没有显示,因为它只在第一次函数调用时传入。的值也要注意tnow
从0升级到5e-009。通过单击红色断点标记清除断点。
解除阻塞ModelSim并通过单击继续模拟继续在MATLAB编辑器中。
模拟运行到完成。随着模拟的进行,它在一个图形窗口中绘制生成的数据。模拟完成后,将出现如图所示的图窗口。
仿真在MATLAB中运行,直到达到您刚刚设置的断点。按照需要继续模拟/调试会话。
运行仿真
如果希望再次运行模拟,则必须在ModelSim中重新启动模拟,重新初始化时钟,并重置输入信号。这样做:
关闭图形窗口。
使用以下命令重新启动模拟:
>重启
的重新启动对话框出现了。保留所有选项的启用状态,然后单击重新启动.
请注意
的重新启动控件建立的模拟上下文
matlabtb
命令。因此,在重新启动ModelSim之后,您必须重新发出以前的命令或发出一个新命令。补发的
matlabtb
命令。> matlabtb modsimrand -mfunc modsimrand_plot -rising /modsimrand/clk -socket .使用实例
portnum
开放
modsimrand_plot.m
在MATLAB编辑器中。在与前一次运行中相同的行上设置断点。
返回ModelSim,重新输入以下命令,重新初始化时钟和输入信号:
> force /modsimrand/clk 0 0,1 5 ns -repeat 10 ns > force /modsimrand/clk_en 1 > force /modsimrand/reset 1 0,0 50 ns
输入命令开始模拟,例如:
>跑了80000
关闭模拟
本节解释如何有序地关闭模拟。
在ModelSim中,执行以下步骤:
通过选择在客户端停止模拟模拟>最后仿真或进入
辞职
命令。ModelSim辞职。
在MATLAB中,你可以退出应用程序,这将关闭模拟,也将关闭MATLAB。
要在不关闭MATLAB的情况下关闭服务器,可以调用hdldaemon
与“杀”
选择:
hdldaemon(“杀死”)
出现以下消息,确认服务器已关闭:
HDLDaemon服务器被关闭