此示例展示了 SoC 架构可用的不同抽象级别,以及如何通过选择正确的抽象级别来加速 SoC 模型的仿真速度。
此示例使用:SoC 模块集, 通信工具箱, 计算机视觉工具箱, 视觉 HDL 工具箱片上系统 (SoC) 设计的设计和开发涉及多个步骤,例如算法开发、架构映射和系统集成。在每个步骤中,都使用建模和仿真来验证设计。在基于模型的设计 (MBD) 方法中,从算法设计的早期阶段到完整系统集成的最后阶段,都使用和改进相同的模型。使用这种单一模型方法,根据设计阶段更改建模抽象级别很有用。SoC 模块集提供了在仿真细节级别和仿真速度之间进行权衡的能力。例如,在算法开发阶段,精确的架构仿真对于验证算法并不重要,但对于架构映射后验证系统要求却很重要。帧缓冲区块提供三种抽象级别,用于对模拟保真度不同的内存传输进行建模:- 在突发精确保真度级别,内存事务在突发事务的精确度内进行模拟。内存突发是按指定的大小和频率创建的,这些事务在模拟期间由内存控制器块进行仲裁,从而为内存事务提供更高级别的时序保真度。此级别的模拟速度相对较低。
- 在协议精确保真度级别,内存事务以接口协议精确度进行模拟,不考虑内存事务的时序精确度。此抽象级别的模拟速度为中等。
- 在行为保真度级别,内存事务在通过内存的数据传输的行为级别进行模拟,不考虑接口协议或内存事务的时序精确度。此抽象级别的模拟速度很高。
要控制内存模拟保真度,请打开帧缓冲区块掩码并找到名为“内存模拟”的属性。当选择“突发精确”(默认)时,内存以高模拟保真度进行模拟,而当其为“协议精确”时,内存以较低的模拟保真度进行模拟(对于行为选择,保真度甚至更低)。为了说明打开或关闭内存模拟时执行时间的差异,请使用“使用视频帧缓冲区进行直方图均衡”示例中的 soc_histogram_equalization_top 模型。执行以下代码以捕获内存模拟为突发精确和为协议精确时的模型模拟持续时间。两个模拟完成后,表格将显示执行持续时间和计算出的模拟加速度。open_system('soc_histogram_equalization_top');
set_param('soc_histogram_equalization_top','ReturnWorkspaceOutputs','on');
set_param('soc_histogram_equalization_top','StopTime','0.05');
set_param('soc_histogram_equalization_top/Frame Buffer','MemorySimulation','Burst accurate');
evalc('simOut = sim(''soc_histogram_equalization_top'')');
ExecutionTimeBurstAccurate = simOut.getSimulationMetadata.TimingInfo.ExecutionElapsedWallTime;
set_param('soc_histogram_equalization_top/Frame Buffer','MemorySimulation','Protocol accurate');
evalc('simOut = sim(''soc_histogram_equalization_top'')');
ExecutionTimeProtocolAccurate = simOut.getSimulationMetadata.TimingInfo.ExecutionElapsedWallTime;
ExecutionAcceleration = (ExecutionTimeBurstAccurate - ExecutionTimeProtocolAccurate) * 100/ ExecutionTimeBurstAccurate;
T = table(ExecutionTimeBurstAccurate, ExecutionTimeProtocolAccurate, ExecutionAcceleration,'VariableNames', ...
{'Burst Accurate Simulation (execution time in s)','Protocol Accurate Simulation (execution time in s)','Execution Acceleration in %'});
close_system('soc_histogram_equalization_top',0);
disp(T)
结果表明,关闭帧缓冲区块中的内存模拟可显著提高性能。任务管理器模块提供两种不同的抽象级别,用于对模拟逼真度不同的任务调度进行建模:- 在高模拟逼真度级别,任务执行根据调度程序策略进行模拟,以确定时间精度,包括其持续时间、优先级和抢占。此级别的模拟速度相对较低。
- 在低模拟逼真度级别,任务执行在行为级别进行模拟,其中任务会立即执行,而不考虑其优先级和抢占。此级别的模拟速度很高。
要控制内存模拟逼真度,请打开任务管理器模块掩码对话框并找到名为启用任务模拟的复选框属性。当选择启用任务模拟(默认)时,任务调度程序将以高逼真度进行模拟,当清除时,任务调度程序将以低逼真度进行模拟。为了说明内存仿真和任务仿真打开或关闭时的执行时间差异,请使用基于数据包的 ADS-B 收发器示例中的 soc_ADSB 模型。执行以下代码以捕获内存仿真和任务仿真打开然后关闭时模型的仿真持续时间。两个仿真完成后,表格将显示执行持续时间和计算出的仿真加速度。open_system('soc_ADSB');
set_param('soc_ADSB','ReturnWorkspaceOutputs','on');
set_param('soc_ADSB','StopTime','0.1');
set_param('soc_ADSB/AXI4-Stream to Software','MemorySimulation','Burst accurate');
set_param('soc_ADSB/Processor/Task Manager','EnableTaskSimulation','on');
evalc('simOut = sim(''soc_ADSB'')');
ExecutionTimeBurstAccurate = simOut.getSimulationMetadata.TimingInfo.ExecutionElapsedWallTime;
set_param('soc_ADSB/AXI4-Stream to Software','MemorySimulation','Protocol accurate');
set_param('soc_ADSB/Processor/Task Manager','EnableTaskSimulation','off');
evalc('simOut = sim(''soc_ADSB'')');
ExecutionTimeBehavioral = simOut.getSimulationMetadata.TimingInfo.ExecutionElapsedWallTime;
ExecutionAcceleration = (ExecutionTimeBurstAccurate - ExecutionTimeBehavioral) * 100/ ExecutionTimeBurstAccurate;
T = table(ExecutionTimeBurstAccurate, ExecutionTimeBehavioral, ExecutionAcceleration,'VariableNames', ...
{'Accurate Simulation (execution time in s)','Behavioral Simulation (execution time in s)','Execution Acceleration in %'});
close_system('soc_ADSB',0);
disp(T)
结果表明,关闭 AXI4-Stream to Software 模块中的内存模拟和任务管理器模块中的任务模拟可显著提高性能。此示例展示了如何通过选择不同的模拟抽象来加速 SoC 模型。