数据类型限定符在高层次综合中应用(volatile const static global)

张开发
2026/4/24 17:14:59 15 分钟阅读

分享文章

数据类型限定符在高层次综合中应用(volatile  const  static  global)
一、说明1.类型限定符是可以直接影响高层次综合工具来创建硬件的2.类型限定符是通过可预测的方式来进行综合结果的影响的二、常见的限定符1.volatile2.const3.static4.global三、volatile1.如果在函数接口上多次访问指针的同一个地址或者索引如果你不用volatile修饰综合工具默认你只是进行一次访问后续你多次访问都被认为访问一次。如果你想的是多次访问拿到的是地址中最新的数据那么你要使用volatile这个和操作系统的访问类似。2.关于volatile, volatile 限定符的影响主要常见于顶层接口的讨论中.3.任意精度类型不支持使用易变 (volatile) 限定符执行算术运算。对于使用 volatile 限定符的所有任意精度数据类型必须将其指定为非易变数据类型才可在算术表达式中使用。也就是说ap_uint类型你使用volatile修饰如果你要做算术运算需要使用非volatile进行暂存然后使用这个暂存的数据进行在表达式中应用。四、static1.static修饰的变量在多次调用函数的时候第一次调用和第二次调用是保留值的。这个在硬件设计中等效为除法器或者内粗单元。如果你设计时候要求变量是静态类型的那么最终综合为RTL设计时候它肯定是寄存器的。2.并不是只有的static修饰的变量才会被综合为寄存器即使你没有使用static修饰vivado hls综合工具有时候也会依据需要自行判断是否该把某个变量综合为寄存器。3.如果必须在多个周期内保持变量赋值不变则即使 C 语言函数中的原始变量不是静态类型Vivado HLS 也会创建一个寄存器来保存该值。4.注意static修饰变量的初始化情况static 变量在 RTL 代码和 FPGA 比特流中初始化。也就是所谓的上电加载初始化。这个和复位初始化不太一样static应该来说是上电复位初始化而不是一般复位初始化。也就说这并不意味着每次ap_rstn复位信号时都会重新初始化该变量。五、const1.const来修饰的类型是用于只读的read only或者not change或者unupdate的类型也就是值初始化后不再改变。用于只读是无法写入的。这个是不需要进行任何初始化的。也就是rtl设计中大部分情况是综合为常量。2.对数组使用const修饰综合为RTL的ROM来实现。3.使用 const 限定符指定的数组与静态限定符一样在 RTL 和 FPGA 比特流中进行初始化。也就是上电复位初始化。六、数组和ROM1.在某些情况下即便是你不使用static和const修饰数组vivado hls工具也会综合为ROM的情况。#include array_ROM.hdout_t array_ROM(din1_t inval, din2_t idx){din1_t lookup_table[256];dint_t i;for (i 0; i 256; i) {lookup_table[i] 256 * (i - 128);}return (dout_t)inval * (dout_t)lookup_table[idx];}2.上述案例表明限定符是影响vivado hls的综合工具的综合但是不会去支配综合工具工作。七、global全局变量1.全局变量是可综合的默认情况下不会将全局变量在RTL的端口中公开。2.全局变量作为IO端口公开使用 expose_global 选项来将其作为 I/O 端口予以公开。接口配置中的 expose_global 选项可将所有全局变量作为 RTL 接口上的端口予以公开。使用接口配置公开全局变量时设计中的所有全局变量都作为 I/O 端口公开包括仅在设计内部访问的全局变量。3.虽然 Vivado HLS 支持对全局变量进行综合但赛灵思不建议广泛使用全局变量的编码样式。4.static修饰全局变量设计中无法将static修饰的全局变量综合为IO端口。

更多文章