主要内容

验证手写和生成的HDL代码的组合

本例使用HDL联合仿真和fpga在环(FIL)仿真来验证由生成的和遗留的HDL代码组成的HDL设计。这里使用术语“遗留”来表示可能是手写的、从第三方购买的或为另一个项目生成的并保存以供在本设计中重用的代码。

本例中的遗留代码实现了有限状态机(FSM),它是用于无线通信系统的多输入多输出(MIMO)解码器的子模块。MIMO解码器的大部分是在Simulink中开发的,其HDL代码将由HDL Coder生成。金宝appFSM属于Simulink设计。金宝appFSM的遗留代码将与Simulink模型集成,并通过代码生成过程集成到FPGA实现中。金宝app

该示例将展示设计人员或验证工程师如何使用HDL Verifier协同仿真向导将遗留FSM与Simulink模型集成并验证它。金宝appHDL Cosimulation提供了完全的可见性和控制,支持代码的调试和验证。

在成功集成遗留FSM之后,当从Simulink模型生成HDL代码时,协同仿真块自动集成遗留代码,从而实现MIMO解码器的完整FPGA实现。金宝app最后,在实际FPGA上使用FPGA在环对整个设计进行了验证。

示例大纲

  1. 使用协同仿真向导将遗留HDL代码导入到Simulink模型中金宝app

  2. 通过共同模拟并将结果与行为模型进行比较来验证遗留HDL代码

  3. 使用Blackbox中的cosimulation块为整个MIMO解码器生成HDL代码

  4. 使用fpga在环验证MIMO解码器

要求和前提条件

对于联合仿真和fpga在环,您需要以下软件和硬件:

  • 受支持的HDL模拟器之金宝app一。有关支持金宝app的模拟器,请参阅Cosimulation需求

  • FPGA设计软件

  • 支持的FPGA开发板之金宝app一。支持的硬金宝app件,请参见金宝appFPGA校验支持的FPGA设备

  • 使用以太网连接:主机上安装千兆以太网适配器,千兆以太网交叉电缆

  • 使用JTAG连接:用于Intel FPGA板的USB Blaster I或II电缆和驱动器。Digilent®JTAG电缆和驱动器用于Xilinx FPGA板。

MATLAB®和FPGA设计软件既可以安装在您的计算机上,也可以安装在网络可访问的设备上。如果您使用来自网络的软件,则需要在计算机中安装第二个网络适配器,以便为FPGA开发板提供专用网络。要了解如何安装网络适配器,请参阅计算机的硬件和网络指南。

注意:示例包括代码生成。如果您无法访问HDL Coder软件,您可以跳过本例中的代码生成步骤,并使用为您提供的HDL文件以及FIL向导来使用fpga -in- loop模拟它们。

为有限状态机创建一个参考模型

参考模型是实现预期行为的模拟模型。它通常用于HDL验证,方法是将它与RTL实现一起实例化,为两者提供相同的输入并比较它们的输出。在验证中,参考模型的优点是它们可以独立于实现(通常由不同的人)开发,提供对预期行为的独立验证,它们比实际实现更容易创建(不需要综合或实际的设备定时),并且它们通常在模拟中运行得很快。

在本例中验证遗留HDL代码的第一步是为设计的这一部分创建一个参考模型。FSM已经这样做了。打开behavioral_mimo。基金模式。双击进入MIMO Decoder子系统,您将看到FSM子系统包含实现FSM行为的MATLAB函数块。这个参考模型将用于验证FSM的遗留HDL代码。

1.使用协同仿真向导导入遗留HDL代码

在MATLAB命令提示符下输入以下命令调用协同仿真向导:

cosimWizard

从下拉列表中选择HDL cosimulation with金宝app Simulink和您首选的HDL模拟器。如果HDL模拟器不在您的系统路径上,请提供该路径并单击Next。

添加FSMSubsystem。FSMSubsystem_pkg vhd。vhd和Embedded_Controller。vhd文件(位于“verify_legacy_hdlsrc”文件夹中)使用cosimWizard的Add按钮并重新排序列表以放置FSMSubsystem。vhd和FSMSubsystem_pkg。VHD在列表的顶部,为正确的编译顺序。然后单击“下一步”。

在以下2个面板上单击Next以接受默认值并到达Input/Output Ports面板。在“输入端口”列表中,前3个端口分别通过下拉菜单选择“端口类型”:

clk: Port Type = clock reset: Port Type = reset clk_enable: Port Type = reset

这种端口类型的识别导致联合仿真块强制HDL模拟器中的这些信号,而不是要求它们在Simulink图中被驱动。金宝app在本例中,我们将clk_enable端口视为另一个用于共同模拟的重置。在继续下一步之前,同样地为ce_out选择“unused”,使它从cosimulation块中被省略,因为在Simulink中不需要它。金宝app

协同仿真向导自动识别HDL代码中的输入和输出,并基于它在其中找到的端口为Simulink创建协同仿真块。金宝app有一些关于输出端口的细节是它无法从HDL代码中学习到的。在HDL代码中,输出只是一些位的集合,没有说明您希望如何在Simulink中解释这些位。金宝app您必须告诉协同模拟向导,您希望将这些位视为有符号值还是无符号值,如果要将它们解释为定点数,则需要告诉它们将基数点放在哪里。

在Output Port Details面板中细化每个输出的数据类型。在本设计中,输出端口的解释如下。注意,对于矢量端口(out_1, out_6, out_9, out_10, out_11, out_12), HDL代码中有多个标量端口:

out_1:签订,部分长度= 0(4标量港口)out_2:无符号,分数长度= 0 out_3:无符号,分数长度= 0 out_4:无符号,分数长度= 0 out_5:签订,部分长度= 10 out_6:签订,部分长度= 10(3标量港口)out_7:签订,部分长度= 2 out_8:无符号,分数长度= 0 out_9:签订,部分长度= 0(4标量港口)out_10:签订,部分长度= 0(4标量港口)out_11:有符号,分数长度= 10(4个标量端口)out_12:有符号,分数长度= 10(4个标量端口)out_13:无符号,分数长度= 0 out_14:有符号,分数长度= 0

在Clock/Reset Details面板上设置以下值:

clk_enable初始值= 0,持续时间= 37 ns。clk_enable初始值= 0,持续时间= 37 ns

单击Next继续到Start Time Alignment面板,并将“HDL Time to Start cosimulation (ns)”设置为40。

继续到最后一步,取消选中“在模拟开始时自动确定时间刻度”的复选框。对于这个例子,我们知道在Simulink中共同模拟的时间尺度应该是1秒,在HDL模拟器中对应10 ns。金宝app有关在其他设计中使用自动时间刻度设置功能的信息,请参阅HDL验证器文档。设置前面提到的时间刻度并单击Finish。

将生成用于将遗留HDL代码导入Simulink模型的联合仿真块。金宝app您可以将新生成的联合仿真块和2个方便的命令块拖放到FSMSubsystem块内的Simulink模型中,并将其连接到FSMSubsystem的输出端口。金宝app本示例提供了一个共同仿真模型,在MIMO Decoder子系统中包含比较器和断言块。已经添加了比较器和断言块,以便在嵌入式控制器的参考模型输出和遗留HDL实现之间的任何不匹配时向您发出警告。

使用以下命令来调整生成的cosimulation块的大小,使其更容易插入到cosimulation模型中:

set_param (“untitled / fsmsubsystem”“位置”, [0 0 165 852]);

打开cosim_mimo。基金模式。将cosimWizard创建的新块和方便的命令块拖到协同模拟模型中,替换MIMODecoder子系统中的占位符子系统。

2.cosimulation验证遗留HDL代码

在您的联合仿真模型中双击“启动HDL模拟器”块来启动您选择的HDL模拟器。点击Simulink中的Play按钮,开始联合仿真金宝app,观察MATLAB窗口中显示警告信息。这些表示输出信号上的不匹配,因为参考FSM模型和HDL实现之间存在差异。

现在您可以使用Simulink和金宝appHDL模拟器调试特性来隔离问题并修复错误。在这种情况下,出现错误是因为在HDL实现中错过了状态转换弧。注意,在HDL模拟器的波形显示中,FSM状态在模拟中很早就卡住了。

修复手写HDL代码并重新运行联合仿真

本例提供了更正后的HDL代码。使用以下命令将新代码复制到你的工作目录,覆盖坏版本的Embedded_Controller.vhd:

拷贝文件(fullfile (“verify_legacy_hdlsrc”“fixed_hdl”“Embedded_Controller.vhd”),“verify_legacy_hdlsrc”“f”);

通过双击“Compile HDL Design”块重新编译遗留HDL代码。如果在上次执行共同模拟之后,HDL模拟器仍处于打开状态,则退出HDL模拟器并重新启动HDL模拟器,然后重播共同模拟。这次您应该没有发现错配。

现在您已经调试和验证了嵌入式控制器的遗留HDL代码,您可以继续使用fpga在环验证整个MIMODecoder。

设置FPGA设计软件环境

在使用FPGA在环之前,请确保您的系统环境已正确设置为访问FPGA设计软件。你可以使用这个函数hdlsetuptoolpath将FPGA设计软件添加到当前MATLAB会话的系统路径中。

为HDL代码生成准备模型

为了为FPGA-in- loop准备模型,结合遗留的HDL代码并为MIMO解码器的剩余部分生成新的HDL代码,您需要做2件事来完成FPGA实现:

  1. 编辑协同仿真模型以删除FSM参考设计

  2. 使用HDL Coder Blackbox将遗留的HDL合并到代码生成的模型中

如果您想按照使用HDL Blackbox为HDL代码生成准备模型的所有步骤,请使用不同的名称保存联合仿真模型,并按照如下方式继续其余的模型准备工作:

1.编辑协同仿真模型以删除FSM参考设计

  • 在MIMO解码器子系统中删除Embedded_Controller函数块

  • 删除驱动Embedded_Controller输入的"from"块,enablecoder输入除外

  • 删除输出上的比较器和断言块

  • 将共模拟块输出重新连接到DelaySubsystem1的输入

2.使用HDL Coder Blackbox将遗留的HDL合并到代码生成的模型中

  • 选择cosimulation块并输入control-G来创建一个子系统

  • 右键单击新的协同仿真子系统并选择HDL代码和HDL块属性

  • select Architecture = BlackBox

  • 在EntityName参数中输入FSMSubsystem

  • 在ImplementationLatency参数中输入0

  • 好的,HDL Block属性对话框

3.重新运行模拟以更新图表。

  • 双击“Launch HDL Simulator”块来启动HDL模拟器

  • 点击Simulink中的Play按钮开始联合仿真金宝app

  • 保存模型

3.生成HDL代码和fpga在环

这一步需要HDL Coder。如果您没有这个软件,您可以使用预生成的HDL文件进行FIL模拟。直接跳转到步骤5。使用filWizard进行FIL模拟。

如果您想按照生成HDL文件的过程自己返回到模型的顶层,右键单击MIMODecoder子系统,在“HDL代码”下启动HDL Coder Workflow Advisor。

  • 步骤1.1:选择FPGA-in- loop Target Workflow,从下拉列表中选择您首选的FPGA开发板,并确定一个可写目录来保存生成的HDL代码。

  • 步骤4.1:在Set FPGA Options中选择“Add”,并使用浏览器导航到在步骤1中复制到工作文件夹中的EmbeddedController HDL文件,并在步骤3中使用固定的HDL代码进行修改。

  • 步骤4.2:在左侧导航树中右键单击工作流的步骤4.2并选择“运行到此任务”。这个步骤可能需要几分钟,因为它包含了合成、映射和路由FPGA设备设计的步骤。

结果将是用于MIMO解码器子系统的FPGA在环仿真的FPGA编程文件,以及包含解码器的原始模型(包括用于FSM的遗留HDL)的新模型以及FPGA在环块。它还将具有带有断言块的比较器,以识别类似于我们在联合仿真模型中看到的不匹配信号。

4.用fpga在环仿真验证设计

由于生成的验证模型包括fsm子系统的联合仿真,您将需要使用HDL模拟器来运行整个FIL模型。确保关闭以前的联合模拟中的HDL模拟器,并重新启动HDL模拟器。

在步骤3生成的fpga - In -loop模型中,打开FIL块。

选择“Load”将FPGA编程文件下载到单板上的设备。

在Simulink模型中单击Play金宝app,运行fpga在环仿真。

观察模型中比较范围和ErrorRate计算的结果。您的FIL模拟结果应该与参考模型完全匹配。

5.使用FIL向导进行FIL模拟

对于那些没有HDL Coder软件的人来说,这一步是步骤4的替代方案。如果您已经完成了第4步,则不需要继续此步骤。

预生成的HDL文件位于“verify_legacy_gen_hdlsrc”文件夹中。可以使用FIL向导创建FPGA在环编程文件。FIL向导还将创建一个可以丢弃的FIL块,因为为本例提供的FIL模型已经包含了FIL块。

输入以下命令打开FIL向导:

filWizard
  • 费尔选项从列表中选择您的FPGA开发板。

  • 在源文件中选择添加选择文件夹verify_legacy_gen_hdlsrc中的所有文件并进行标识MIMODecoder.vhd作为顶级文件。

  • 其余的filWizard选项接受默认值

  • 等待FIl块和FPGA编程文件创建完成。由于合成和路由FPGA实现所需的时间,这可能需要几分钟。

  • 打开“gm_fil_codegen_mimo_fil. zip”文件。slx模型,并将新生成的FIL块拖动到模型中指定的位置。

  • 打开FIL块掩码,单击“信号属性”选项卡。将每个rx_decoded输出的数据类型更改为fixdt(1,6,0),以匹配行为块的数据类型。

  • 打开FIL块掩码,单击“Main”页签,选择“Load”,等待FPGA编程文件下载到设备。

  • 在Simulink模型中按Play键金宝app运行fpga -in- loop。

观察模型中比较范围和ErrorRate计算的结果。您的FIL模拟结果应该与参考模型完全匹配。

最后给出了使用HDL协同仿真和fpga在环验证HDL设计的实例。