文档目录

5.1. 静态变量

HLS编译器支持与C和C++具有相同语义的函数范围静态变量。

函数范畴的静态变量在复位时被初始化到指定值。此外,在组件调用过程中可以看到这些变量的改变,这样也使得函数范畴的静态变量成为组件中存储状态的理想选择。但是,不同任务或组件函数不能共享函数范畴的静态变量。

要初始化静态变量,组件需要额外的逻辑,并且当该逻辑有效时,组件可能需要花费一些时间才能退出复位状态。

静态变量初始化

如果变量以存储器形式实现,则可以控制何时初始化组件中的静态变量。存储静态变量的存储器系统可以在组件上电时或组件复位时被初始化。

在组件上电时初始化静态变量类似于传统的编程模型,因为在程序开始运行后,您无法重新初始化静态变量值。

每次组件接收到reset信号后(包括上电时),在组件复位的同时初始化静态变量。但是,这种类型的静态变量初始化需要额外的逻辑。该额外逻辑会影响启动延迟和组件所需的FPGA面积。

您可以通过将以下属性添加到静态变量声明中来明确设置静态变量初始化:
hls_init_on_reset
组件复位后,静态变量值被初始化。
将此属性添加到静态变量声明中,如以下实例所示:
static char arr[128] hls_init_on_reset;

这是初始化静态变量的默认行为。您无需通过静态变量声明指定hls_init_on_reset关键字来获得该行为。

例如,以下实例中的静态变量在组件复位时被初始化:
static int arr[64];
hls_init_on_powerup
静态变量仅在上电时被初始化。该初始化使用存储器初始化文件(.mif)来初始化存储器,以此降低组件的资源利用率和启动延迟。
将此关键字添加到静态变量声明中,如以下实例所示:
static char arr[128] hls_init_on_powerup;

由于静态变量的复杂性(例如,结构体的数组),某些静态变量可能无法利用此初始化。该情况下,编译器会返回一个错误。

关于初始化静态变量的演示,请查看 <quartus_installdir>/hls/examples/tutorials/component_memories/static_var_init中的教程。

关于复位您组件的信息,请参阅复位行为