Vitis HLS 学习笔记--ap_int.h / ap_fixed.h(2)-深度探究

目录

1. 前文回顾

1.1 简单背后的复杂

1.2 复杂性的来源

2. 关键代码

2.1 功能概述

2.2 关系梳理

2.3 理解构造函数二

2.4 理解HLS_CONSTEXPR

2.5 理解const volatile

3. 探究ap_int<8>  c;经历了什么

4. 在调试中查看


1. 前文回顾

在《Vitis HLS 学习笔记--ap_int.h / ap_fixed.h(1)》一篇中,我已经对ap_int.h / ap_fixed.h中定义的数据类型、用法示例以及它们的重要性和基本应用进行了初步的讲解。继此基础上,本文将深入分析和探索这些数据类型的实现机制。

1.1 简单背后的复杂

ap_int数据类型,虽然在其实现功能上非常简单——即定义FPGA中某个变量的大小所占的位宽——但其基于C++的实现和应用背后蕴含着高效和灵活的设计理念。这种数据类型是为了满足硬件设计中对精确位宽控制的需求而设计的,特别是在使用高级综合工具(如Vitis HLS)进行FPGA开发时,精确的位宽控制可以显著影响生成硬件的性能和资源利用率。

为了实现精确的位宽控制和高效的硬件映射,ap_int.h和ap_fixed.h在其实现代码中确实展现了相当的复杂性。

1.2 复杂性的来源

ap_int.h / ap_fixed.h之所以复杂,主要是因为它们需要在提供强大功能的同时,确保能够有效地映射到硬件实现:

任意位宽的支持:支持从1位到几千位的任意位宽,这在标准的C++数据类型中是无法实现的。

高效的硬件操作:提供了一系列优化的运算符和函数,以确保生成的硬件既高效又节省资源。

精确的资源控制:允许开发者精确控制硬件实现的资源使用情况,对于满足严格的资源约束条件非常关键。

模拟和综合的兼容性:确保代码在模拟(软件仿真)和综合(硬件实现)时都能正确工作,涉及到复杂的底层实现细节。

这篇文章的目的,正是要揭开ap_int.h和ap_fixed.h这两个强大工具的神秘面纱,更好地理解其背后的原理和应用方式。

2. 关键代码

2.1 功能概述

template <int _AP_W>
struct ap_int : ap_int_base<_AP_W, true>
{
  typedef ap_int_base<_AP_W, true> Base; //重命名,方便后续引用

  INLINE ap_int() {} // 构造函数一:参数为空,执行为空

  template <int _AP_W2>
  HLS_CONSTEXPR INLINE ap_int(const ap_int<_AP_W2>& op): Base((ap_int_base<_AP_W2, true>)op)
  {
    op.checkOverflowCsim(_AP_W, true);
    Base::V = op.V;
  }

  template <int _AP_W2>
  INLINE ap_int(const volatile ap_int<_AP_W2>& op) 
  {
    const_cast<const ap_int<_AP_W2>& >(op).checkOverflowCsim(_AP_W, true);
    Base::V = op.V;
  }
…

这段代码是ap_int结构体的一部分,展示了其构造函数的定义。ap_int是一个模板结构体,用于表示固定宽度的整数类型,其中模板参数_AP_W指定了整数的位宽。这个结构体继承自ap_int_base,后者提供了整数类型的基本操作和属性。

2.2 关系梳理

  • 在调用构造函数时,编译器会根据传递给它的参数类型自动选择合适的构造函数。
  • 如果传递一个 const ap_int<_AP_W2>&             类型的参数,编译器将调用第二个构造函数。
  • 如果传递一个 const volatile ap_int<_AP_W2>& 类型的参数,编译器将调用第三个构造函数。
  • 通过这种方式,编译器可以根据不同的参数类型自动选择正确的构造函数。

2.3 理解构造函数二

HLS_CONSTEXPR INLINE ap_int(const ap_int<_AP_W2>& op)  :  Base((ap_int_base<_AP_W2, true>)op)

这里的冒号是 C++ 中的构造函数初始化列表语法,表示在构造函数中先初始化基类 Base,再执行构造函数的函数体。
在该语句中,构造函数初始化列表的部分为 Base((ap_int_base<_AP_W2, true>)op),表示调用 Base 的构造函数,并将 (ap_int_base<_AP_W2, true>)op 强制转换为 _AP_W2 位宽的有符号整数类型作为参数传递给该构造函数,从而实现了将 op 转换为当前对象的初始化过程。
该构造函数初始化列表中的语句执行完成后,才会执行构造函数的函数体。

2.4 理解HLS_CONSTEXPR

它是一个 C++ 关键字,表示在编译时可以计算的常量表达式。
表明该构造函数ap_int可以在编译时进行计算,并且返回的结果是常量,不会在运行时进行计算。
使用 HLS_CONSTEXPR 关键字提可以帮助编译器对代码进行更好的优化,提高程序的执行效率。
HLS_CONSTEXPR 关键字只能用于满足特定条件的函数和变量,函数只包含常量表达式、仅依赖于常量等条件,否则会导致编译错误。

2.5 理解const volatile

INLINE ap_int(const volatile ap_int<_AP_W2>& op) //参数op在函数内部不会被修改,但在外部可能会被修改。
  • const 修饰常量引用,修饰后的对象op在函数内部不会被修改。
  • volatile 修饰易变对象,它可能在函数外被其他代码(如中断服务程序)修改。编译器不应优化访问该对象的代码,以防止在读取它时获取过时的值。volatile 关键字通常用于处理硬件寄存器和多线程编程中的共享变量。

3. 探究ap_int<8>  c;经历了什么

废话不多说,直接上关系图:

详解:

  • 在文件<ap_int.h>中,找到ap_int最顶层的调用
  • 顺藤摸瓜,找到ap_int的基类实现,<ap_int_base.h>中的ap_int_base
  • ap_int_base又是继承自_AP_ROOT_TYPE
  • <ap_common.h>中,宏定义#define _AP_ROOT_TYPE ssdm_int_sim表明两者等效
  • 通过ssdm_int_sim,可以找到class ap_private;为其成员变量
  • ap_private为“最基本”的类,在<ap_private.h>中

注:ssdm_int_sim, System-Level Synthesis Design and Modeling Integer Simulation

4. 在调试中查看

ap_int.h / ap_fixed.h中定义的结构体非常复杂,可以在单步调试中查看某个变量的数值。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于springboot实现厨艺交流平台系统项目【项目源码+论文说明】

基于SpringBoot实现厨艺交流平台系统演示 摘要 使用旧方法对厨艺交流信息进行系统化管理已经不再让人们信赖了&#xff0c;把现在的网络信息技术运用在厨艺交流信息的管理上面可以解决许多信息管理上面的难题&#xff0c;比如处理数据时间很长&#xff0c;数据存在错误不能及时…

[算法] 动态规划

对这个算法的原有印象就是非常难理解&#xff0c;而且怎么都感觉这个算法名称有些误导&#xff1b;或者是要引申着看&#xff1f;因为里面的动态是怎么个动态&#xff1f; 这里的动态是指每一次的计算结果会影响下一次&#xff0c;或者再次的运算效率&#xff0c;也就是说下一次…

瀑布流组件(vue2)

文档连接&#xff1a;clz 加载状态、行数 可以自行控制&#xff0c;目前只支持vue2 实现效果&#xff1a;

华为手机无法弹出wifi上网认证页面处理

华为手机无法弹出wifi上网认证页面 连wifi后跳到上图界面卡住&#xff0c;不跳转到单位的上网认证界面。 打开手机的设置应用&#xff0c;点击上面的WLAN选项。 点击上面的更多WLAN设置选项。 关闭WLAN安全检测就可以正常弹出上网认证界面&#xff0c; 正常弹出上网认证界面&a…

【RAR技巧】rar压缩包的三种加密方法

文件压缩成rar压缩包后&#xff0c;想要保护文件内容不被他人随意解压&#xff0c;我们可以给rar压缩包设置加密&#xff0c;今天分享3种方法设置rar文件加密方法。 方法一&#xff1a;加密 最简单的加密方法&#xff0c;就是在加密文件时输入想要设置的密码&#xff0c;完成…

栈和队列-介绍与实现(超级详解-C语言)

栈 栈的介绍 栈的概念 栈&#xff1a;一种特殊的线性表&#xff0c;其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端 称为栈顶&#xff0c;另一端称为栈底。栈中的数据元素遵守后进先出LIFO&#xff08;Last In First Out&#xff09;的原则。 压栈…

Mac中隐私安全性设置-打开任何来源

文章目录 **Mac中隐私安全性设置-打开任何来源**一、目的二、打开方式 Mac中隐私安全性设置-打开任何来源 一、目的 从外部下载的软件频繁打不开&#xff0c;需要从隐私安全性中重新选择一下&#xff1b;默认Mac隐藏了任何来源 二、打开方式 打开终端&#xff0c;输入一下命…

配置BFD

目录 原理概述 实验目的 实验内容 实验拓扑 1.基本配置 2.配置OSPF路由协议 3.配置VRRP协议 4.配置BFD 原理概述 为了减小设备故障对网络业务造成的影响&#xff0c;提高网络的可用性&#xff0c;网络设备需要能够尽快检测到与相邻设备之间的通信故障&#xff0c;以便及…

详解运算符重载——探索运算符重载的应用

前言:运算符重载是面向对象的一个重要的知识点。我们都知道内置类型可以进行一般的运算符的运算。但是如果是一个自定义类型&#xff0c; 这些运算符就无法使用了。那么为了解决这个问题&#xff0c; 我们的祖师爷就在c中添加了运算符重载的概念。 本篇主要通过实例的实现来讲述…

短视频批量采集提取软件|视频下载工具

短视频批量采集提取软件&#xff1a;高效获取视频资源 一、开发背景 在日常业务中&#xff0c;我们经常需要获取大量的短视频资源&#xff0c;以支持各种需求&#xff0c;但传统的获取方式过于繁琐&#xff0c;一一复制链接下载效率低下。基于此需求&#xff0c;我们开发了一…

rocketmq-dashboard打包测试报错

rocketmq-dashboard运行的时候没问题&#xff0c;但是打包执行测试的时候就是报错 这时候跳过测试就可以成功 报错为 There are test failures. Please refer to D:\CodeEn\rocketmq-dashboard\target\surefire-reports for the individual test results. 你只需要跳过测试就…

Wpf 使用 Prism 实战开发Day20

备忘录功能页面完善以及优化 备忘录功能基本跟前一章节的待办事项差不多一至&#xff0c;就不再做过多的笔述了 一.备忘录功能完整页面源码 MemoView.xaml <UserControl x:Class"MyToDo.Views.MemoView"xmlns"http://schemas.microsoft.com/winfx/2006/xam…

用html写一个搜索页面

<!DOCTYPE html> <html lang"en" > <head><meta charset"UTF-8"><title>搜索框设计</title><link rel"stylesheet" href"./style.css"> </head> <body> <div class"se…

TypeScript基础入门(一、常用类型)

目录 第一章 前言 1.1 介绍TypeScript 1.2 TypeScript相比Js的优势 1.3 使用TypeScript的准备工作 第二章 TypeScript的数据类型 2.1 TypeScript的常用类型 2.1.1 概述 2.1.2 TS使用JS基本数据类型 2.1.2.1 number 2.1.2.2 string 2.1.3.3 boolean 2.1.2.4 null 2…

Pytorch DistributedDataParallel(DDP)教程一:快速入门理论篇

Pytorch DistributedDataParallel&#xff08;DDP&#xff09;教程一&#xff1a;快速入门理论篇 目录 一、 写在前面二、什么是分布式并行训练1. 并行训练2. 数据并行 三、DDP的基本原理1. DDP的训练过程2. Ring-All-Reduce算法 四、如何搭建一个Pytorch DDP代码框架1. 与DDP有…

二次元AI绘画生成器免费:教你生成精美图片

二次元AI绘画生成器&#xff0c;无疑是现代技术与艺术完美结合的典范。这些工具不仅将复杂的绘画过程简化&#xff0c;更让每一个艺术爱好者的创意得以充分展现。这些生成器能够精准捕捉大家的创意精髓&#xff0c;将其转化为细腻、独特的二次元画作。无论是角色设计、场景描绘…

OpenHarmony UI动画-box2d

简介 用于游戏开发&#xff0c;使物体的运动更加真实&#xff0c;让游戏场景看起来更具交互性&#xff0c;比如愤怒的小鸟 效果展示 下载安装 ohpm install ohos/box2dOpenHarmony ohpm环境配置等更多内容&#xff0c;请参考 如何安装OpenHarmony ohpm包 使用说明 import * …

OCR图片转化为Excel文件功能在哪些平台和设备上能实现?

在现今数字化时代&#xff0c;将图片转化为Excel文件已成为许多工作者和研究者的重要需求。这种转换功能在多个平台和设备上均能实现&#xff0c;为用户提供了极大的便利。 首先&#xff0c;我们来看看在线平台方面。目前&#xff0c;市面上有许多在线工具可以将图片转换为Exc…

MoJoCo 入门教程(七)XML 参考

系列文章目录 前言 表格第二列中的符号含义如下&#xff1a; ! 必填元素&#xff0c;只能出现一次 ? 可选元素&#xff0c;只能出现一次 * 可选元素&#xff0c;可多次出现 R 可选元素&#xff0c;可递归出现多次 一、简介 本章是 MuJoCo 中使用的 MJCF 建模语言的参考手册。…

【云计算】安全组和网络ACL的区别

安全组和网络ACL的区别 ACL&#xff08;Access Control List&#xff09;和 安全组&#xff08;Security Group&#xff09;是两种不同的网络安全控制机制&#xff0c;通常用于管理云计算平台中的网络访问权限。它们在功能和实现上有一些显著的区别&#xff1a; 辨析 范围不同&…