​​Vitis HLS 学习笔记--添加 RTL 黑盒函数

news2024/7/2 21:04:33

目录

1. 简介

2. 用法详解

2.1 需要的文件

2.1.1 RTL 函数签名

2.1.2 黑盒 JSON 描述文件

2.1.3 RTL IP 文件

2.2 操作步骤

3. 总结


1. 简介

Vitis HLS 工具可以将现有的 Verilog RTL IP(即硬件描述语言编写的模块)集成到 C/C++ HLS 项目中。通过这种方式,Vitis HLS 能够将 RTL 代码与 C/C++ 代码一起综合,形成最终的硬件设计。

RTL 黑盒允许设计者在 HLS 设计中的特定区域(如顺序区域、流水线区域或数据流区域)内使用 Verilog 或 VHDL 编写的 RTL IP。这样做的好处是可以重用现有的硬件模块,同时利用 HLS 的优势来加速整个设计和开发过程。

简单的说,如果你有一个用 Verilog 编写的性能优化好的 IP,可以将其作为黑盒插入到 HLS 项目中,而不需要将其重新用 C/C++ 实现。这样可以节省时间,并确保硬件设计的高效性和可靠性。

2. 用法详解

2.1 需要的文件

2.1.1 RTL 函数签名

RTL 代码的 C 语言函数签名,是指用于代表RTL模块的C函数的声明。这个签名定义了函数的名称、输入参数和返回类型,这样C代码就可以调用它,就像调用任何其他C函数一样。这个签名通常放在一个头文件(.h)中,以便在整个项目中使用。

#include "ap_int.h"

//--------------------------------------------------------
//RTL 代码的 C 语言函数签名
//--------------------------------------------------------
void rtl_model(ap_int<10>  a1, ap_int<10>  a2, ap_int<10>  a3, ap_int<10>  a4,
               ap_int<10>  b1, ap_int<10>  b2, ap_int<10>  b3, ap_int<10>  b4,
               ap_int<10>& z1, ap_int<10>& z2, ap_int<10>& z3, ap_int<10>& z4);

//--------------------------------------------------------
void example(ap_int<10> a1, ap_int<10> a2, ap_int<10> a3, ap_int<10> a4,
             ap_int<10> b1, ap_int<10> b2, ap_int<10> b3, ap_int<10> b4,
             ap_int<10>& sigma) {

    ap_int<10> tmp1, tmp2, tmp3, tmp4;

    rtl_model(a1, a2, a3, a4, b1, b2, b3, b4, tmp1, tmp2, tmp3, tmp4);
    sigma = tmp1 + tmp2 + tmp3 + tmp4;
}

2.1.2 黑盒 JSON 描述文件

{
"c_function_name"     : "rtl_model",
"rtl_top_module_name" : "rtl_model",
"c_files" : [{ 
              "c_file" : "rtl_model.cpp",
              "cflag" : ""
            }],
"rtl_files" : [
                "rtl_model.v"
              ],
"c_parameters" : [{
                   "c_name" : "a1",
                   "c_port_direction" : "in",
                   "rtl_ports" : {
                                  "data_read_in" : "a1"
                                 }
                  },
                  {
                   "c_name" : "a2",
                   "c_port_direction" : "in",
                   "rtl_ports" : {
                                  "data_read_in" : "a2"
                                 }
                  },
                  {
                   "c_name" : "a3",
                   "c_port_direction" : "in",
                   "rtl_ports" : {
                                  "data_read_in" : "a3"
                                 }
                  },
                  {
                   "c_name" : "a4",
                   "c_port_direction" : "in",
                   "rtl_ports" : {
                                  "data_read_in" : "a4"
                                 }
                  },{
                   "c_name" : "b1",
                   "c_port_direction" : "in",
                   "rtl_ports" : {
                                  "data_read_in" : "b1"
                                 }
                  },
                  {
                   "c_name" : "b2",
                   "c_port_direction" : "in",
                   "rtl_ports" : {
                                  "data_read_in" : "b2"
                                 }
                  },
                  {
                   "c_name" : "b3",
                   "c_port_direction" : "in",
                   "rtl_ports" : {
                                  "data_read_in" : "b3"
                                 }
                  },
                  {
                   "c_name" : "b4",
                   "c_port_direction" : "in",
                   "rtl_ports" : {
                                  "data_read_in" : "b4"
                                 }
                  },
                  {
                   "c_name" : "z1",
                   "c_port_direction" : "out",
                   "rtl_ports" : {
                                  "data_write_out"   : "z1",
		                  "data_write_valid" : "z1_ap_vld"
                                 }
                  },
                  {
                   "c_name" : "z2",
                   "c_port_direction" : "out",
                   "rtl_ports" : {
                                  "data_write_out"   : "z2",
	                          "data_write_valid" : "z2_ap_vld"
                                 }
                  },
                  {
                   "c_name" : "z3",
                   "c_port_direction" : "out",
                   "rtl_ports" : {
                                  "data_write_out"   : "z3",
	                          "data_write_valid" : "z3_ap_vld"
                                 }
                  },
                  {
                   "c_name" : "z4",
                   "c_port_direction" : "out",
                   "rtl_ports" : {
                                  "data_write_out"   : "z4",
	                          "data_write_valid" : "z4_ap_vld"
                                 }
                  }],
"rtl_common_signal" : {
                        "module_clock"                    : "ap_clk",
                        "module_reset"                    : "ap_rst",
                        "module_clock_enable"             : "ap_ce",
                        "ap_ctrl_chain_protocol_idle"     : "ap_idle",
                        "ap_ctrl_chain_protocol_start"    : "ap_start",
                        "ap_ctrl_chain_protocol_ready"    : "ap_ready",
                        "ap_ctrl_chain_protocol_done"     : "ap_done",
                        "ap_ctrl_chain_protocol_continue" : "ap_continue"
                      },
"rtl_performance" : {
                     "latency" : "2",
                     "II"      : "1"
                    },
"rtl_resource_usage" : {
                        "FF"   :   "0",
                        "LUT"  :   "0",
                        "BRAM" :   "0",
                        "URAM" :   "0",
                        "DSP"  :   "1"
                       }
}

2.1.3 RTL IP 文件

`timescale 100ps/100ps

(* use_dsp = "simd" *)
(* dont_touch = "1" *)  
module rtl_model (input            ap_clk, ap_rst, ap_ce, ap_start, ap_continue,
                  input [9:0]      a1, a2, a3, a4, b1, b2, b3, b4,
                  output           ap_idle, ap_done, ap_ready,
                  output           z1_ap_vld, z2_ap_vld, z3_ap_vld, z4_ap_vld,
                  output reg [9:0] z1,        z2,        z3,        z4);

   wire ce = ap_ce;
   
   reg [9:0] areg1, areg2, areg3, areg4;
   reg [9:0] breg1, breg2, breg3, breg4;
   reg       dly1, dly2;
   
   always @ (posedge ap_clk)
     if (ap_rst)
       begin
          z1    <= 0;
          z2    <= 0;
          z3    <= 0;
          z4    <= 0;
          areg1 <= 0;
          areg2 <= 0;
          areg3 <= 0;
          areg4 <= 0;
          breg1 <= 0;
          breg2 <= 0;
          breg3 <= 0;
          breg4 <= 0;
          dly1  <= 0;
          dly2  <= 0;     
       end
     else if (ce)
       begin
          z1    <= areg1 + breg1;
          z2    <= areg2 + breg2;
          z3    <= areg3 + breg3;
          z4    <= areg4 + breg4;
          areg1 <= a1;
          areg2 <= a2;
          areg3 <= a3;
          areg4 <= a4;
          breg1 <= b1;
          breg2 <= b2;
          breg3 <= b3;
          breg4 <= b4;
          dly1  <= ap_start;
          dly2  <= dly1;          
       end

   assign z1_ap_vld = dly2;
   assign z2_ap_vld = dly2;
   assign z3_ap_vld = dly2;
   assign z4_ap_vld = dly2;
   assign ap_ready  = dly2;
   assign ap_done   = dly2;
   assign ap_idle   = ~ap_start;
      
endmodule // rtl_model

2.2 使用 RTL 黑盒向导

整体步骤和常规的 Vitis HLS 步骤一致,特殊点在于多了一个 JSON 文件需要配置:

  • 从顶层函数内或者从 Vitis HLS 工程的子函数内调用 C 语言函数签名。
  • 在 Vitis HLS IDE 中使用“Add Files”(添加文件),将黑盒 JSON 描述文件添加到 HLS 工程中。
  • 运行 Vitis HLS 设计文件照常进行仿真、综合和协同仿真。

使用 RTL 黑盒向导操作步骤:

在导航到工程中,打开 RTL 黑盒向导:

 

3. 总结

Vitis HLS 的引入为硬件设计师提供了一种灵活高效的设计途径,通过允许 RTL 黑盒的使用,设计师可以在不牺牲性能的前提下,重用现有的硬件模块,同时利用 HLS 的高层次抽象和快速迭代能力来加速设计和开发过程。这种方法既节省了将硬件模块重新用 C/C++ 实现的时间,也保持了设计的高效性和可靠性。通过简化操作步骤和提供直观的工具,如 RTL Blackbox Wizard,Vitis HLS 降低了硬件设计的复杂性,使得开发者能够更加专注于创新和优化。

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

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

相关文章

【AI实践】Dify调用本地和在线模型服务

背景 Ollama可以本地部署模型&#xff0c;如何集成私有数据、如何外部应用程序对接&#xff0c;因此需要有一个应用开发框架 Dify功能介绍 欢迎使用 Dify | 中文 | Dify 下文将把dify部署在PC上&#xff0c;windows环境&#xff1b; 安装部署 安装dify及docker jacobJacobs…

Android面试题 之 网络通信基础 面试题

本文首发于公众号“AntDream”&#xff0c;欢迎微信搜索“AntDream”或扫描文章底部二维码关注&#xff0c;和我一起每天进步一点点 序列化 判断标准 序列化后的码流大小性能跨语言 Serializable方式 码流偏大性能较低 XML方式 人机可读性好文件格式复杂、占带宽 JSON …

SpringBoot自定义Starter及原理分析

目录 1.前言2.环境3.准备Starter项目4.准备AutoConfigure项目4.1 准备类HelloProperties4.2 准备类HelloService4.3 准备类HelloServiceAutoConfiguration4.4 创建spring.factories文件并引用配置类HelloServiceAutoConfiguration4.5 安装到maven仓库 5.在其他项目中引入自定义…

Stable Diffusion3 开源!一文教你玩转 Stable Diffusion3

节前&#xff0c;我们组织了一场算法岗技术&面试讨论会&#xff0c;邀请了一些互联网大厂朋友、今年参加社招和校招面试的同学。 针对大模型技术趋势、大模型落地项目经验分享、新手如何入门算法岗、该如何准备面试攻略、面试常考点等热门话题进行了深入的讨论。 汇总合集…

企业化运维(4)_tomcat

###1.配置tomcat### 可以将tomcat部署在server2主机&#xff0c;与nginx主服务器分开&#xff0c;便于进行交互存储。 下载安装jdk与tomcat&#xff0c;并开启服务&#xff0c;便可以在浏览器进行访问。 [rootserver3 ~]# rpm -ivh jdk-8u121-linux-x64.rpm [rootserver3 ~]#…

window安装miniconda

下载 https://mirrors.tuna.tsinghua.edu.cn/anaconda/miniconda/ 安装 双击安装 配置环境变量 添加&#xff1a;PYTHONUSERBASE你的安装路径 添加Path&#xff1a; cmd执行&#xff1a; python -m site将USER_SITE添加进Path 还需要将如下添加进环境变量 D:\Miniconda…

Python学习笔记13 -- API的说明及使用

一、API说明 1、API&#xff1a;Application Programming Interface -- 接口 2、Restful API&#xff1a;基于网页的API 3、JSON&#xff1a;JavaScript objection Notation 4、很多数据都可以找到公用API 二、安装requests模块 在终端输入&#xff1a; 可以保证使用当前…

会声会影色彩校正在哪里 会声会影色彩素材栏在哪 会声会影中文免费版下载

会声会影是一款功能强大的视频编辑软件&#xff0c;它可以帮助用户轻松地编辑和制作视频。在进行视频编辑时&#xff0c;色彩校正是一个重要的步骤&#xff0c;它可以调整视频的色调、亮度和对比度等参数&#xff0c;使视频更加生动和鲜明。在会声会影中&#xff0c;色彩校正功…

MySQL数据库初识

目录 一.数据库相关概述 1.数据库概念 数据&#xff08;Data&#xff09; 表 数据库&#xff08;database&#xff09; 数据库管理系统&#xff08;DBMS&#xff09; 数据库系统 2.数据库系统发展史 3.数据库分类 3.1.关系数据库 3.2.非关系型数据库 二.MySQL数据库…

C语言适不适合新手学习?

C 语言&#xff0c;尽管从整体上看相对较为简单&#xff0c;但在实际编写 C 程序的过程中&#xff0c;会涉及到诸如指针等一些细节方面&#xff0c;这确实可能会给新手带来一定程度的困扰和挑战。不过&#xff0c;我们需要明确的是&#xff0c;这种挑战从某种意义上来说是具有积…

JavaScript算法实现dfs查找省市区路径

需求 存在如下数组&#xff0c;实现一个算法通过输入区名&#xff0c;返回省->市->区格式的路径&#xff0c;例如输入西湖区&#xff0c;返回浙江省->杭州市->西湖区。 // 定义省市区的嵌套数组 const data [{name: "浙江省",children: [{name: "…

线程池ThreadPoolExecutor源码分析

一、线程池基本概念和线程池前置知识 1.1 Java中创建线程的方式有哪些 传统答案&#xff1a; 继承Thread类 通过继承Thread类并重写其run方法来创建线程。具体步骤包括定义Thread类的子类&#xff0c;在子类中重写run方法以实现线程的具体逻辑&#xff0c;然后创建子类的实例…

docker和docker compose 部署

一. 将微服务运行在docker上&#xff1a; 1.新建一个空文件夹docker-demo&#xff0c;在里面再新建文件夹app&#xff0c;在app目录下新建一个名为Dockerfile的文件。 2.编写Dockerfile文件 3.构建镜像 4.启动镜像 5.可以访问了。 二使用Dockerfile构建微服务镜像 1.将j…

GET POST

GET&& POST 一 : 使用场景二: 请求如何构造的???2.1: GET 请求2.2 : POST 请求 三 : GET 和 POST 的区别四 : 常见易错点 一 : 使用场景 网络上的大部分请求 都是 GET , 通过 query string 告诉服务器要搜索什么, 服务器返回搜索结果的完整网页. POST 使用场景比较…

MySQL数据操作与查询- 连接查询

一、引入 1、为什么需要使用连接查询&#xff1f; 查询信息的来源如果来自多张表&#xff0c;则必须对这些表进行连接查询。 2、连接查询的分类 内连接和外连接。 二、内连接 1、概述 将两张表的记录组合在一起&#xff0c;产生一个新的结果。 &#xff08;1&#xff09…

【JS重点17】原型链(面试重点)

一&#xff1a;原型链底层原理 以下面一段代码为例&#xff0c;基于原型对象&#xff08;Star构造函数的原型对象&#xff09;的继承使得不同构造函数的原型对象关联在一起&#xff08;此处是最大的构造函数Object原型对象&#xff09;&#xff0c;并且这种关联的关系是一种链…

【JS重点17】原型继承

目录 一&#xff1a;什么是原型继承 二&#xff1a;通过赋值方式实现原型继承 三&#xff1a;通过构造函数实现原型继承 四&#xff1a;如何赚钱 一&#xff1a;什么是原型继承 通过往构造函数上的原型对象添加属性和方法&#xff0c;再new一个实例对象&#xff0c;从而实例…

生信技能48 - 如何获取基因的SNP及RefSeq参考序列命名规则

1. SNP概念 SNP 是指基因组水平上由单个核苷酸的变异所引起的DNA 序列多态性,在群体中的发生频率不小于1 %,包括单个碱基的转换、颠换、插入和缺失等。每核苷酸发生突变的概率大约为10 -9 , 由于压力选择,SNP在单个基因和基因组以及动物不同种群间分布是不均匀的,在非编码…

有趣的傅里叶变换与小波变换对比(Python)

不严谨的说&#xff0c;时域和频域分析就是在不同的空间看待问题的&#xff0c;不同空间所对应的原子(基函数)是不同的。你想一下时域空间的基函数是什么&#xff1f;频域空间的基函数是什么&#xff1f;一般的时-频联合域空间的基函数是什么&#xff1f;小波域空间的基函数是什…

深度学习Day-20:DenseNet算法实战 乳腺癌识别

&#x1f368; 本文为&#xff1a;[&#x1f517;365天深度学习训练营] 中的学习记录博客 &#x1f356; 原作者&#xff1a;[K同学啊 | 接辅导、项目定制] 一、 基础配置 语言环境&#xff1a;Python3.8编译器选择&#xff1a;Pycharm深度学习环境&#xff1a; torch1.12.1c…