分布式管道:速度优化
这个例子展示了如何使用分布式流水线来优化HDL Coder™中的设计速度。
简介
分布式流水线是由HDL Coder支持的一种子系统范围的优化,用于实现高时钟速度硬件。金宝app通过打开分布式流水线,HDL Coder将子系统的输入管道寄存器、输出管道寄存器和子系统中的寄存器重新分配到适当的位置,以最小化寄存器之间的组合逻辑,并最大化由生成的HDL代码合成的芯片的时钟速度。
考虑以下对称FIR滤波器的示例模型。从输入或寄存器到输出或另一个寄存器的组合逻辑包含一个积块和一个加法器树。分布式流水线移动在子系统级别设置的输出寄存器,以减少组合逻辑的级别。
bdclose所有;load_system (“sfir_fixed”);open_system (“sfir_fixed / symmetric_fir”);
设置输出管路级
为了提高时钟速度,您可以为任何子系统设置许多管道阶段。在不开启分布式流水线的情况下,指定数量的寄存器被添加到子系统的每个输出端口。一些合成工具支持优化,比如重新计时,在合成金宝app过程中优化寄存器的位置。
要查看分布式流水线在减少关键路径和增加时钟频率方面的效果,请启用CriticalPathEstimation
估算设计的关键路径。当启用关键路径估计时,HDL Coder将使用特定于目标的定时数据库来估计关键路径。如果您没有设置合成工具芯片家族和合成工具速度值来指定特定的目标定时数据库,HDL Coder将为关键路径估计的这两个参数设置默认值,并在生成HDL代码时生成警告。要防止警告,请指定合成工具芯片家族和合成工具速度值。您可以使用或不使用指定的合成工具来完成此操作。有关更多信息,请参见不运行综合的关键路径估计.
hdlset_param (“sfir_fixed”,“CriticalPathEstimation”,“上”);hdlset_param (“sfir_fixed”,“SynthesisToolChipFamily”,“virtex7”,“SynthesisToolSpeedValue”,' 1 ')
在本例中,子系统输出管道寄存器被设置为2。
代码生成模型显式地反映子系统输出端口上插入的寄存器(用橙色突出显示)。
hdlset_param (“sfir_fixed / symmetric_fir”,“OutputPipeline”2);makehdl (“sfir_fixed / symmetric_fir”);open_system (“gm_sfir_fixed / symmetric_fir”);set_param (“gm_sfir_fixed”,“SimulationCommand”,“更新”);
###生成HDL 'sfir_fixed/symmetric_fir'。###使用模型的配置集sfir_fixed用于HDL代码生成参数。在模型'sfir_fixed'上运行HDL检查。开始编译模型'sfir_fixed'…###应用HDL优化模型'sfir_fixed'…您所选择的代码生成和优化选项引入了额外的管道延迟。延迟平衡功能自动插入匹配的延迟进行补偿。DUT需要初始管道设置延迟。每个输出端口都会经历这些额外的延迟。 ### Output port 1: 2 cycles. ### Output port 2: 2 cycles. ### Begin model generation. ### Model generation complete. ### Estimated critical path for design: hdlsrc\sfir_fixed\criticalPathEstimated.m ### To clear highlighting, click the following MATLAB script: hdlsrc\sfir_fixed\clearhighlighting.m ### Begin VHDL Code Generation for 'sfir_fixed'. ### Working on sfir_fixed/symmetric_fir as hdlsrc\sfir_fixed\symmetric_fir.vhd. ### Generating package file hdlsrc\sfir_fixed\symmetric_fir_pkg.vhd. ### Code Generation for 'sfir_fixed' completed. ### Generating HTML files for code generation report at sfir_fixed_codegen_rpt.html ### Creating HDL Code Generation Check Report file://C:\Users\clewis\OneDrive - MathWorks\Documents\MATLAB\Examples\hdlcoder-ex37495842\hdlsrc\sfir_fixed\symmetric_fir_report.html ### HDL check for 'sfir_fixed' complete with 0 errors, 0 warnings, and 1 messages. ### HDL code generation complete.
没有分布式流水线的关键路径估计为10.269 ns。方法中显示估计的关键路径代码生成报告>时序和区域报告>关键路径估计选项卡。
设置分布式管道
分布式流水线是子系统块选项之一。在您打开它之后,子系统中的寄存器(包括输出管道寄存器和输入管道寄存器)将重新定位以实现最佳时钟速度。它相当于在子系统级别上重新计时。
代码生成模型显式地反映子系统中的分布式寄存器(用橙色突出显示)。
hdlset_param (“sfir_fixed / symmetric_fir”,“DistributedPipelining”,“上”);makehdl (“sfir_fixed / symmetric_fir”,“GeneratedModelNamePrefix”,“gm2_”);open_system (“gm2_sfir_fixed / symmetric_fir”);set_param (“gm2_sfir_fixed”,“SimulationCommand”,“更新”);
###生成HDL 'sfir_fixed/symmetric_fir'。###使用模型的配置集sfir_fixed用于HDL代码生成参数。在模型'sfir_fixed'上运行HDL检查。开始编译模型'sfir_fixed'…###应用HDL优化模型'sfir_fixed'…您所选择的代码生成和优化选项引入了额外的管道延迟。延迟平衡功能自动插入匹配的延迟进行补偿。DUT需要初始管道设置延迟。每个输出端口都会经历这些额外的延迟。 ### Output port 1: 2 cycles. ### Output port 2: 2 cycles. ### Begin model generation. ### Model generation complete. ### Estimated critical path for design: hdlsrc\sfir_fixed\criticalPathEstimated.m ### To clear highlighting, click the following MATLAB script: hdlsrc\sfir_fixed\clearhighlighting.m ### Begin VHDL Code Generation for 'sfir_fixed'. ### Working on sfir_fixed/symmetric_fir as hdlsrc\sfir_fixed\symmetric_fir.vhd. ### Generating package file hdlsrc\sfir_fixed\symmetric_fir_pkg.vhd. ### Code Generation for 'sfir_fixed' completed. ### Generating HTML files for code generation report at sfir_fixed_codegen_rpt.html ### Creating HDL Code Generation Check Report file://C:\Users\clewis\OneDrive - MathWorks\Documents\MATLAB\Examples\hdlcoder-ex37495842\hdlsrc\sfir_fixed\symmetric_fir_report.html ### HDL check for 'sfir_fixed' complete with 0 errors, 0 warnings, and 1 messages. ### HDL code generation complete.
使用分布式流水线估计的关键路径现在是7.443 ns。
为分布式管道使用综合时序估计
为了更准确地反映组件在硬件上的功能,以便在设计中更好地分布管道,并最大化目标设备的时钟频率,请启用模型配置参数为分布式管道使用综合时间估计.
hdlset_param (“sfir_fixed”,“UseSynthesisEstimatesForDistributedPipelining”,“上”);makehdl (“sfir_fixed / symmetric_fir”,“GeneratedModelNamePrefix”,“gm3_”);open_system (“gm3_sfir_fixed / symmetric_fir”);set_param (“gm3_sfir_fixed”,“SimulationCommand”,“更新”);
###生成HDL 'sfir_fixed/symmetric_fir'。###使用模型的配置集sfir_fixed用于HDL代码生成参数。在模型'sfir_fixed'上运行HDL检查。开始编译模型'sfir_fixed'…###应用HDL优化模型'sfir_fixed'…您所选择的代码生成和优化选项引入了额外的管道延迟。延迟平衡功能自动插入匹配的延迟进行补偿。DUT需要初始管道设置延迟。每个输出端口都会经历这些额外的延迟。 ### Output port 1: 2 cycles. ### Output port 2: 2 cycles. ### Begin model generation. ### Model generation complete. ### Estimated critical path for design: hdlsrc\sfir_fixed\criticalPathEstimated.m ### To clear highlighting, click the following MATLAB script: hdlsrc\sfir_fixed\clearhighlighting.m ### Begin VHDL Code Generation for 'sfir_fixed'. ### Working on sfir_fixed/symmetric_fir as hdlsrc\sfir_fixed\symmetric_fir.vhd. ### Generating package file hdlsrc\sfir_fixed\symmetric_fir_pkg.vhd. ### Code Generation for 'sfir_fixed' completed. ### Generating HTML files for code generation report at sfir_fixed_codegen_rpt.html ### Creating HDL Code Generation Check Report file://C:\Users\clewis\OneDrive - MathWorks\Documents\MATLAB\Examples\hdlcoder-ex37495842\hdlsrc\sfir_fixed\symmetric_fir_report.html ### HDL check for 'sfir_fixed' complete with 0 errors, 0 warnings, and 1 messages. ### HDL code generation complete.
使用综合计时估计会增加函数的运行时间makehdl
,但它可以减少关键路径和增加时钟频率的设计。有关更多信息,请参见使用综合时间估计的分布式管道.
关键路径估计报告显示,关键路径现在是6.320 ns。关键路径估计是基于特定目标定时数据库估计的关键路径。如果需要目标硬件上的实际关键路径,则必须通过综合来运行模型。
有和没有综合时间估计的分布式管道综合比较
在HDL工作流顾问中,使用通用ASIC/FPGA工作流生成HDL代码并执行FPGA合成,并具有以下设置:
合成工具设置为
Xilinx Vivado
家庭的合成工具设置为
virtex7
速度的合成工具设置为
-1
目标频率(MHz)设置为
120
有关代码生成和合成步骤的详细信息,请参见基于Simulink模型的HDL代码生成和FPGA合成金宝app.
未启用分布式流水线的合成结果如下:
综合结果显示为负松弛,表明不满足时间约束。当不满足定时约束时,不计算时钟频率。
启用分布式流水线的合成结果如下:
综合结果表明,该算法的松弛度为正,时钟频率为178.05 MHz,满足时序约束,满足120 MHz的目标时钟频率。
使用综合时间估计的分布式流水线的综合结果如下:
综合结果表明,该系统的时钟频率为222.40 MHz,满足时序限制。通过对分布式流水线使用综合计时估计,时钟速度得到了提高。
跨子系统层次结构的分布式管道
因为分布式流水线是一个子系统级参数,不同层次结构级别上的不同子系统可以指定不同的流水线阶段值和不同的分布式流水线设置。默认情况下,HDL Coder只分发该子系统中指定子系统的寄存器,而不是通过较低级别的子系统。如果需要跨层次结构分布,可以设置DistributedPipelining对于较低的子系统在
并启用全局选项分层分布式管道.当本地和全局选项打开时,在分布寄存器时,将整个子系统(包括较低级别的子系统)视为单个子系统。