Vitis HLS 学习笔记--初始化与复位

目录

1. 简介

2. 控制初始化与复位

2.1 初始化

2.2 复位

2.3 全局复位选项

2.4 复位排除

3. 阵列初始化和复位

3.1 不使用 static 限定符

3.2 使用 static 限定符

3.3 BRAM 和 URAM

4. 总结


1. 简介

本文对比分析两个方面的初始化和复位:阵列和控制(也即块级)

阵列的初始化和复位

  • 阵列初始化:初始化是在编译时(或上电时)为变量(包括阵列)赋予初始值的过程。对于 C/C++ ,全局变量和静态变量默认初始化为0,但也可以给它们指定初始值。对于硬件逻辑,阵列会被实现为存储器(例如RAM),并且在上电或编程 FPGA 时,这些存储器会被预加载指定的初始值。
  • 阵列复位:在运行时,通过复位信号将变量(包括阵列)恢复到其初始状态的过程。不同于初始化,复位是一个动态过程,可以在程序执行期间任何时刻发生。如果选择将变量复位到其初始状态,这会导致设计中增加额外的逻辑和存储器资源。

控制的初始化与复位

  • 控制初始化:初始化行为主要关注变量(包括阵列和寄存器)在编译时或上电时的状态。
  • 控制复位:在 kernel 端口添加复位信号,当用复位信号使能,立即将连接到复位端口的寄存器和 BRAM 还原为初始值。通常 RTL 配置中最重要的操作即选择复位行为。

2. 控制初始化与复位

2.1 初始化

默认情况下,C/C++ 中以 static 变量全局变量都初始化为 0,也可由用户赋予特定初始值。

在 Vitis HLS 工具中,需要注意:

  • 在 RTL 仿真期间,为这些变量设置的初始值与 C/C++ 语言代码中相同。
  • 在用于对 FPGA 进行编程的比特流中,也会对这些变量进行初始化。当器件上电时,变量将以其初始状态启动。

在 RTL 中,虽然变量启动时使用的初始值与 C/C++ 语言代码相同,但无法强制该变量返回至此初始状态。要复原初始状态,必须通过复位信号来实现。

2.2 复位

复位端口在 FPGA 中用于在应用复位信号时,立即将连接到复位端口的寄存器和块 RAM 还原为初始值。通常 RTL 配置中最重要的操作即选择复位行为。

* TOP LEVEL CONTROL
+-----------+---------------+-----------+
| Interface | Type          | Ports     |
+-----------+---------------+-----------+
| ap_clk    | clock         | ap_clk    |
| ap_rst_n  | reset         | ap_rst_n  |
| interrupt | interrupt     | interrupt |
| ap_ctrl   | ap_ctrl_chain |           |
+-----------+---------------+-----------+

对于复位行为,重要的是理解初始化与复位之间的差异。

2.3 全局复位选项

复位选项包含:

  • 复位极性(reset_level)
  • 同步复位/异步复位(reset_async)
  • 最重要的,通过“reset”选项来控制应用复位信号时要复位的寄存器。

“reset”选项包含 4 项设置:

  • “none”:在设计中不添加复位。
  • “control”:这是默认设置,将所有控制寄存器复位。控制寄存器即状态机中使用的寄存器,用于生成 I/O 协议信号。此设置可确保 kernel 可立即启动其操作状态。
  •  “state”:在“control”设置基础上,添加衍生自 C/C++ 语言代码中的静态变量和全局变量的任意寄存器或存储器添加复位。此设置可确保应用复位后,C/C++ 语言代码中初始化的静态变量和全局变量均复位为其初始值。
  • “all”:为 kernel 中的所有寄存器和存储器添加复位。

2.4 复位排除

通过 RESET 编译指示或指令可提供更精细的复位控制。静态变量和全局变量均可通过 RESET 指令来添加复位。还可使用 RESET 指令的 off 选项从复位的变量中移除变量。

示例一:

void foo(int in[3], char a, char b, char c, int out[3]) {
#pragma HLS reset variable=a

此示例会为 foo 函数中的 a 变量添加复位,即使全局复位设置为 none 或 control 也是如此。 

示例二: 

void foo(int in[3], char a, char b, char c, int out[3]) {
#pragma HLS reset variable=a off

从 foo 函数中的 a 变量移除复位,即使全局复位设置为 state 或 all 也是如此。

3. 阵列初始化和复位

对于阵列,推荐使用含 static 限定符的存储器来实现。这不仅可确保 HLS 工具以存储器来实现阵列,还允许使用“static”(静态)类型的默认初始化行为。

最为对比,我们设定两种情况:

3.1 不使用 static 限定符

int coeff[8] = {-2, 8, -4, 10, 14, 10, -4, 8};

每次执行函数时,都会为 coeff 阵列分配这些值。综合后,每次执行 kernel 时,用于实现 coeff 的 RAM 都会随这些值一起加载。

如果使用单端口 RAM,此操作耗时 8 个时钟周期。对于 1024 阵列,当然也就需要 1024 个时钟周期,在此期间无法执行任何依赖于 coeff 的运算。

3.2 使用 static 限定符

static int coeff[8] = {-2, 8, -4, 10, 14, 10, -4, 8, -2};

该阵列开始执行时会使用指定的值进行初始化。每次执行该函数时,coeff 阵列都会保留上次执行的值。静态阵列在 C/C++ 语言代码中的行为与 RTL 中的存储器行为相同。

如果变量包含 static 限定符,那么 Vitis HLS 会对 RTL 设计和 FPGA 比特流中的变量进行初始化。因此,无需经历多个时钟周期来初始化存储器,并且可确保大型存储器初始化不会产生任何运算开销。

3.3 BRAM 和 URAM

在不同的硬件平台上,比如 UltraScale+ 或 Versal,内存块(BRAM)和超大型RAM(URAM)的启动和重置方式可能会有所不同。简单来说,Vitis HLS 工具支持两种重置方式:

  • 上电初始化:就像设备刚通电时自动设置好的状态。这种情况下,所有平台的 BRAM 和 Versal 的 URAM 都会被设置成预先定义的初始值。
  • 运行时重置:当设备正在运行中,如果我们发送一个 RESET 信号,BRAM 和 URAM 会被重置到初始状态,就像重新启动一样。

如果读取/写入阵列,则保留“initial value array”(初始值阵列,ROM)和“run time array”(运行时阵列,RAM)。此行为适用于 BRAM 和 URAM,对应于器件执行期间的硬件 RESET 信号。

4. 总结

本文讨论了初始化和复位在硬件设计中的不同方面。阵列的初始化是在编译时或上电时为变量赋予初始值,而复位是在运行时将变量恢复到其初始状态。控制的初始化和复位也是关键,通过复位信号可以在 kernel 端口添加复位行为。对于阵列,使用 static 限定符的存储器可以实现默认初始化行为,避免运算开销。此外,BRAM 和 URAM 的启动和重置方式也需要根据硬件平台进行考虑。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/849936.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java采取擦除式泛型到底兼容了什么场景?

在开始前刚好我有一些资料,是我根据网友给的问题精心整理了一份「 Java的资料从专业入门到高级教程」, 点个关注在评论区回复“888”之后私信回复“888”,全部无偿共享给大家!!!Java擦除式泛型是一个妥协,…

美颜相机「BeautyCam」v12.0.80 祛广告解索会员版(美妆相机功能,展现女神魅力)

软件介绍 美颜相机,一款由知名移动互联网企业Meitu Inc.开发的移动设备照片编辑与美化应用,起初主要针对娱乐消费市场,随后集成了商业营销功能。目前,它已跻身全球最受欢迎的手机摄影应用程序之列。在中国,美颜相机和…

JAVA高级-反射与动态代理(十五)

观看尚硅谷视频做的视频笔记 一、高级-反射与动态代理(十四) 1、反射概述 1)java程序中,所有的对象都有两种类型:编译时类型,运行时类型,而很多时候对象的编译类型和运行时类型不一致。 此处…

workerman error 2 send buffer full and drop package

来源 报错信息:workerman error 2 send buffer full and drop package 定时发送数据的时候,本地偶尔出现这种情况 线上第一条数据发出去就报错了,数据改小一点可以发,不过一会还是会出现这种情况。 解决 根据我的经验&#xf…

SAP HCM OPT函数作用

导读 INTRODUCTION OPT函数:SAP HCM工资核算是很多函数的汇总集,原有有兴趣问过SAP的人为什么SCHEMA需要这样设计,SAP的人说是用汇编的逻辑设计的,当时是尽可能用机器语言加速速度读取,每个函数都有对应的业务逻辑代码…

React实战(一)初始化项目、配置router、redux、axios

(一)初始化项目 1.安装项目 npx create-react-app 项目名 编译报错: 解决办法:安装最新的babel-preset-react-app npm install babel-preset-react-applatest 2.配置项目 (1)配置文件目录 (2)使用craco配置webpack.config npm install craco/crac…

Coze入门指南:创建Bot时,如何写好人设与回复逻辑(Persona Prompt)

文章目录 📖 介绍 📖🏡 演示环境 🏡📒 Coze Bot 📒📝 Persona & Prompt🌟 # Character🌟 ## Skills🌟 # Overall Rules to follow🌟 ## Workflow🌟 ## Constraints📝 通用写法与模板📝 示例🌟技巧和注意事项⚓️ 相关链接 ⚓️📖 介绍 📖…

免费使用GPT-4生成图片的方法

写在前言 hello,大家好,我是一点,喜欢编程,目前持续在关注AI领域的发展,希望可以结交一些有意思的朋友。 大家可以关注我的公号:【一点sir】,了解更多文章,希望可以和你们成为朋友…

OpenCompass 大模型评测平台C-Eval 基准任务评估实战

1. 引言 在人工智能迅速发展的今天,大型语言模型(LLMs)在多个领域展现出了巨大的潜力和应用价值。然而,如何评价这些模型的性能,了解它们的优缺点,成为了一个重要课题。OpenCompass,一个由上海…

使用Cython编译Python源码加密加速,有这一篇就够了!

0 前言 python是一门脚本语言,运行时由python虚拟机解释执行。当我们使用python设计好算法给第三方使用时只能提供源码,任何运行我们算法的人都可以看到源码以及对应的算法思路。因此,需要一定手动保护源码。 最简单的保护方式是使用代码混…

高光谱图像聚类的像素-超像素对比学习与伪标签校正

Pixel-Superpixel Contrastive Learning and Pseudo-Label Correction for Hyperspectral Image Clustering 文章目录 Pixel-Superpixel Contrastive Learning and Pseudo-Label Correction for Hyperspectral Image Clustering摘要引言相关方法对比学习 方法超像素对比学习像素…

【嵌入式】智能系统优化:【C++】驱动的【机器学习】与【数据挖掘】技术

目录 一、嵌入式系统简介 二、C在嵌入式系统中的优势 三、机器学习在嵌入式系统中的挑战 四、C实现机器学习模型的基本步骤 五、实例分析:使用C在嵌入式系统中实现手写数字识别 1. 数据准备 2. 模型训练与压缩 3. 模型部署 六、优化与分析 1. 模型优化 模…

什么时候用C而不用C++?

做接口只用C,千万别要C。C是编译器敏感的,一旦导出的接口里有 std::string这些东西,以及类,注定了要为各个编译器的各个版本准备独立的库。 刚好我有一些资料,是我根据网友给的问题精心整理了一份「C的资料从专业入门…

Gitlab---添加描述模版

0 Preface/Foreword Gitlab是代码托管平台,DevOps。因其免费,被广泛使用。GitLab不但可以管理代码,也可以管理issue,创建milestone等等。针对issue管理,支持描述模版功能,即对于新建的issue,可…

深度网络学习笔记(二)——Transformer架构详解(包括多头自注意力机制)

Transformer架构详解 前言Transformer的整体架构多头注意力机制(Multi-Head Attention)具体步骤1. 步骤12. 步骤23. 步骤34. 步骤4 Self-Attention应用与比较Self-Attention用于图像处理Self-Attention vs. CNNSelf-Attention vs. RNN Transformer架构详…

【第11章】SpringBoot实战篇之文章(下)含条件分页

文章目录 前言一、文章列表查询1. ArticleController2. ArticleService 二 、文章查询1. ArticleController2. ArticleService 三、文章更新1. ArticleController2. ArticleService 四、文章删除1. ArticleController2. ArticleService 五、文章列表查询(条件分页)1.ArticleCon…

医疗器械网络安全风险管理的基本步骤

医疗器械网络安全风险管理是一个复杂的过程,涉及到多个环节和步骤。以下是一些基本的步骤和关键点: 风险识别:首先需要对医疗器械的软件、网络连接和通信协议等进行漏洞分析,识别潜在的安全漏洞和弱点。这可能涉及对设备的渗透测…

MbedTLS源码跨平台编译(window/macos/linux)

1.window平台编译: 克隆: git clone --recursive https://github.com/Mbed-TLS/mbedtls.git 克隆成功 添加OpenSSL环境变量 验证环境 使用cmake编译 cmake ../生成配置时出错 出现上面原因是克隆下来的library与programs及tests目录少文件了,直接下载zip包替换library目录

docker pull image 报错 dial tcp 31.13.88.169:443: i/o timeout

一、错误重现 error pulling image configuration: download failed after attempts6: dial tcp 31.13.88.169:443: i/o timeout 在执行docker build构建镜像,拉取镜像时报错 或者直接docker pull镜像时报错 实质都是拉取镜像源超时报错,那么就是镜像源…

Java sql中 >、<、≥、≤ 等的转义字符 代替符号

Java中写sql会遇到一些 >、<、≥、≤ 符号转化问题&#xff0c;导致sql语句无法运行。 替代方法如下&#xff1a; 第一种方法&#xff1a; < &#xff1a; < < &#xff1a; < > &#xff1a; > > &#xff1a; > sql示例如下&#x…