仅对英特尔可见 — GUID: ewb1508937330025
Ixiasoft
7.3.1. 实例:从深度范畴合并存储器
使用hls_merge("<mem_name>","depth") 属性强制 Intel® HLS Compiler Pro Edition在同一存储系统中实现变量,从深度合并存储器。
将hls_merge属性中设置了同一<mem_name>标签的所有变量进行合并。
请参考如下组件代码:
component int depth_manual(bool use_a, int raddr, int waddr, int wdata) { int a[128]; int b[128]; int rdata; // mutually exclusive write if (use_a) { a[waddr] = wdata; } else { b[waddr] = wdata; } // mutually exclusive read if (use_a) { rdata = a[raddr]; } else { rdata = b[raddr]; } return rdata; }
代码指示 Intel® HLS Compiler Pro Edition将局部存储器a和b 实现为两个片上存储块,每个块都有自己的加载和存储指令。
图 36. 实现组件depth_manual的局部存储器
由于本地存储器a和b的加载和存储指令互斥,因而可以合并访问,如以下实例代码所示。合并存储器访问可将加载和存储指令的数量,和片上存储器块的数量减少一半。
component int depth_manual(bool use_a, int raddr, int waddr, int wdata) { int a[128] hls_merge("mem","depth"); int b[128] hls_merge("mem","depth"); int rdata; // mutually exclusive write if (use_a) { a[waddr] = wdata; } else { b[waddr] = wdata; } // mutually exclusive read if (use_a) { rdata = a[raddr]; } else { rdata = b[raddr]; } return rdata; }
图 37. 从深度范畴合并组件depth_manual的局部存储器
某些情况下,就深度合并局部存储器可能会降低存储器访问效率。在决定是否就深度合并局部存储器之前,请参阅HLD报告( <result>.prj/reports/report.html)确保生成具有预期数量加载和存储指令的预期存储配置。以下实例中, Intel® HLS Compiler Pro Edition不应将访问合并为局部存储器a和b,因为每个存储器的加载和存储指令并不互斥。
component int depth_manual(bool use_a, int raddr, int waddr, int wdata) { int a[128] hls_merge("mem","depth"); int b[128] hls_merge("mem","depth"); int rdata; // NOT mutually exclusive write a[waddr] = wdata; b[waddr] = wdata; // NOT mutually exclusive read rdata = a[raddr]; rdata += b[raddr]; return rdata; }
该情况下, Intel® HLS Compiler Pro Edition可能会double pump存储系统为所有访问提供足够端口。否则,访问必须共享端口,从而阻止无停机访问。
图 38. 具有非互斥访问的组件depth_manual的局部存储器