主要内容

编写 MATLAB 代码以生成高效 HDL 和 HLS 代码的规范

用于 HDL 和 HLS 代码生成的 MATLAB 设计要求

当您从 MATLAB® 设计生成 HDL 或高级综合 (HLS) 代码时,您需要将算法转换为必须满足硬件面积和速度要求的架构。

您的 MATLAB 设计具有以下要求:

  • 设计中的 MATLAB 代码必须受 HDL 或 HLS 代码生成支持。

  • 输入和输出不能是矩阵或结构体。

如果您在命令行中生成代码,请使用以下命令验证您的代码是否准备好进行代码生成:

coder.screener('design_function_name')
如果您使用 HDL 工作流顾问生成代码,此检查会自动运行。

有关 MATLAB 语言支持参考,包括来自 Fixed-Point Designer™ 的受支持函数,请参阅 支持 HDL 和 HLS 代码生成的函数

编写 MATLAB 代码的规范

为了更高效、更快速地生成 HDL 和 HLS 代码,请使用以下最佳做法来设计您的 MATLAB 代码:

  • 串行化您的输入和输出数据。并行数据处理结构需要更多硬件资源和更高的引脚数。

  • 使用加减算法,而不是使用函数(如正弦、除法和取模)的算法。加减运算使用的硬件资源更少。

  • 避免使用大型数组和矩阵。大型数组和矩阵需要更多寄存器和更多 RAM 来存储。每当您需要使用会占用大量内存的大型数组时,请考虑使用 RAM 映射优化将这些内存映射到 RAM。

  • 将您的代码从浮点转换为定点。浮点数据类型对于硬件实现效率低下。HDL Coder™ 提供用于浮点到定点转换的自动化工作流。

  • 通过减少用于表示变量的位数(即 MATLAB 代码内操作数的位宽)来优化生成的代码。

  • 使用硬件友好的舍入和溢出方法。这可以通过在您的 MATLAB 代码中使用 hdlfimath 函数来实现。

    function out = add(a,b)​
       out = fi(a+b,1,12,4,hdlfimath);​
    end

  • 循环展开和流式处理规范:

    • 默认情况下,MATLAB 代码中的 for 循环在生成的 HDL 中实现为串行循环,这会节省面积,但可能导致吞吐量较低。

    • 要提高吞吐量,您可以使用 LoopUnrolling 选项展开循环,这会复制硬件资源并提升并行度。然而,这是以更高的面积使用量为代价的。

    • 您也可以将 coder.hdl.loopspecstream 选项结合使用以启用循环流式处理,这会在循环迭代间重用硬件。这种做法会在面积和吞吐量之间提供平衡。

高效 HLS 代码生成的其他规范:

  • 尽可能将设计模块化为子函数。这样做可以提高代码的可读性,并更容易在代码的特定区域指定约束,例如 coder.hdl.constrainlatency

  • 使用从 0 开始的索引方案,然后通过加 1 进行数组访问,因为 MATLAB 使用基于 1 的索引:例如,使用 arrayVar(index+1) 而不是 arrayVar(index)。代码生成器不需要插入额外的索引逻辑,从而可减少总面积。

另请参阅

App

对象

函数

主题