仅对英特尔可见 — GUID: ewa1466529352404
Ixiasoft
仅对英特尔可见 — GUID: ewa1466529352404
Ixiasoft
4.5.2. Agent存储器
- 主机接口只有一个单端口。如果组件有多个加载-存储站点,则该端口上的仲裁可能会创建可停顿的逻辑。
- 取决于实例化组件的系统,其它主机可能会在组件运行时使用存储器总线,并在总线上创建不必要的停顿。
由于agent存储器位于组件内部,因此HLS编译器可以创建针对组件访问模式而优化的存储器架构,例如创建banked存储器或者合并存储器访问。
Agent存储器不同于组件存储器,因为它们可以从位于组件外的 Avalon® MM Host进行访问。组件存储器由组件的定义限制,并且无法从组件外部进行访问。
您可以通过将存储器属性应用于agent存储器变量声明来明确控制您的agent存储器结构。
一个组件可以有多个agent存储器接口。不同于CSR agent接口中被分组到一起的agent寄存器参数,每个代理存储器都有一个单独的接口和单独的数据总线。Agent存储器接口数据总线宽度由agent类型的宽度决定。如果对存储器的内部访问已经被合并,则agent存储器接口数据总线宽度可能是agent类型宽度的倍数。
您可以将组件存储器属性应用于组件中的agent存储器,以自定义存储器架构并降低组件的FPGA面积利用率。有关详细信息,请参阅组件存储器属性。
component float myComponent( hls_avalon_agent_memory(64) float *a, hls_avalon_agent_memory(64) float *b) { return a[0]+b[0]; }
仅当您的组件未执行时,才能从组件外部对agent存储器进行读取和写入,除非您使用volatile关键字标记agent存储器自变量。如果无volatile关键字,那么在HLS组件执行时如果外部Avalon MM Host访问组件agent存储器,就可能会遇到未定义的组件行为。即使外部访问的是HLS组件不访问的存储器地址,也可能会出现未定义的行为。
易失性Agent存储器
将volatile关键字添加到agent存储器内存自变量,以允许Avalon MM Host在组件执行时访问存储器。编译器构建一个存储器系统,即使在组件运行时从组件外部修改存储器,也能确保功能正确性。
然而,允许具有volatile关键字的并发存储器访问,可能会阻止编译器在组件上执行某些优化。请仔细考虑设计中的这一权衡。
根据从组件内部访问agent存储器的方式,编译器可能会推断外部存储器访问和内部存储器访问之间的仲裁逻辑。该情况下,相比于内部访问,外部访问始终具有仲裁优先级。当每个周期外部请求到达时,该优先级可能会阻止处理组件中的数据流。您无法验证仿真期间并发组件存储器访问的行为。要测试该行为,必须构建一个Verilog测试台来与您的组件交互。您可以在以下教程中查看Verilog测试台的实例及其使用方法:
<quartus_installdir>/hls/examples/tutorials/interfaces/mm_agents_CSR_volatile
Avalon® MM Host访问控制
- 使用hls_readwrite_mode("readonly")指示外部 Avalon® MM Host接口仅从agent存储器读取。如果指定该宏,则不会创建从组件外部的写入端口。
- 使用hls_readwrite_mode("writeonly")指示外部 Avalon® MM Host接口仅写入agent存储器。如果指定该宏,则不会创建从组件外部的读取端口。
如果不指定此宏,则编译器将假设外部 Avalon® MM Host接口可以读取或写入agent存储器。
您可以使用宏来帮助编译器创建更高效的存储器系统并潜在地节省 FPGA面积。
您可以将hls_readwrite_mode宏用于易失性和非易失性agent存储器。
component void foo(hls_avalon_agent_memory_argument(128*sizeof(int)) hls_readwrite_mode(“writeonly”) int *A)
Agent存储器组件宏
组件宏 | 描述 |
---|---|
hls_avalon_agent_memory_argument | 在片上存储器块中实现该参数,可以通过专用agent接口读取或写入。 |
hls_readwrite_mode | 向编译器指示代理存储器接口如何被外部 Avalon® 存储器映射(MM)主机访问。 |