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

目录

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 函数签名

#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 操作步骤

常规步骤

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

使用 RTL Blackbox Wizard

3. 总结

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

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

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

相关文章

短剧分销小程序:影视产业链中的新兴力量

一、引言 在数字化浪潮的推动下&#xff0c;影视产业正迎来一场深刻的变革。短剧分销小程序作为这场变革中的新兴力量&#xff0c;正以其独特的魅力和价值&#xff0c;逐渐在影视产业链中崭露头角。本文将探讨短剧分销小程序在影视产业链中的新兴地位、其带来的变革以及未来的…

Transformer系列:图文详解Decoder解码器原理

从本节开始本系列将对Transformer的Decoder解码器进行深入分析。 内容摘要 Encoder-Decoder框架简介shifted right移位训练解码器的并行训练和串行预测解码器自注意力层和掩码解码器交互注意力层和掩码解码器输出和损失函数 Encoder-Decoder框架简介 在原论文中Transformer用…

LeetCode-2779. 数组的最大美丽值【数组 二分查找 排序 滑动窗口】

LeetCode-2779. 数组的最大美丽值【数组 二分查找 排序 滑动窗口】 题目描述&#xff1a;解题思路一&#xff1a;滑动窗口与排序解题思路二&#xff1a;0解题思路三&#xff1a;0 题目描述&#xff1a; 给你一个下标从 0 开始的整数数组 nums 和一个 非负 整数 k 。 在一步操…

【嵌入式】一种优雅的 bootloader 跳转APP 的方式

【嵌入式】一种优雅的 bootloader 跳转APP 的方式 0. 个人简介 && 授权须知1. 前言2. 干净的跳转3.程序的 noinit 段4. 利用noinit段实现优雅的跳转4.1 检查栈顶地址是否合法4.2 栈顶地址 44.3 __set_MSP 5.OTA 过后的运行逻辑 0. 个人简介 && 授权须知 &#…

MongoDB 多层级查询

多层级查询 注意&#xff1a;要注意代码顺序 查询层级数据代码放前面&#xff0c;查询条件放后面 if (StringUtils.isBlank(params.getDocType())) {params.setDocType(DOC_TDCTYPE);}String docName mapper.findByDocInfo(params.getDocType());List<ExpertApprovalOpin…

怎么把Rmvb改成mp4格式?把rmvb改成MP4格式的四种方法

怎么把Rmvb改成mp4格式&#xff1f;在当今的数字时代&#xff0c;视频文件格式的多样性给我们带来了巨大的便利&#xff0c;但也可能带来一些兼容性的问题。rmvb是一种曾经非常流行的视频文件格式&#xff0c;主要由于其较高的压缩效率和相对不错的画质。然而&#xff0c;随着技…

计算机组成原理学习 Part 1

计算机系统 组成 计算机系统 { 硬件 计算机的实体&#xff0c;如主机、外设等 软件 由具有各类特殊功能的信息&#xff08;程序&#xff09;组成 计算机系统 \begin{cases} 硬件 &\text 计算机的实体&#xff0c;如主机、外设等\\ 软件 &\text 由具有各类特殊功能的信…

把Vue项目从Window系统迁移到Mac系统的方案

不能启动vue ui 直接运行&#xff0c;会报错如下&#xff1a; failed to load config from /Users/xiaochen/IdeaProjects/ChatViewer-frontend/vite.config.tserror when starting dev server: Error: You installed esbuild for another platform than the one youre curre…

宝藏速成秘籍(6)归并排序法

一、前言 1.1、概念 归并排序&#xff08;Merge Sort&#xff09;是一种基于分治思想的排序算法。它将数组分成两个子数组&#xff0c;分别对这两个子数组进行排序&#xff0c;然后再将它们合并成一个有序的数组。归并排序是一种经典的分治算法&#xff0c;它的核心思想是将待…

探索交互设计:五大关键维度全面剖析

交互式设计是用户体验&#xff08;UX&#xff09;设计的重要组成部分。在本文中&#xff0c;我将向大家解释什么是交互设计并简要描述交互设计师通常每天都做什么。 一、什么是交互设计 交互式设计用简单的术语来理解就是用户和产品之间的交互。在大多数情况下&#xff0c;当…

详解MySQL中的PERCENT_RANK函数

目录 1. 引入1. 基本使用2&#xff1a;分组使用3&#xff1a;处理重复值4. 使用优势4.1 手动计算百分等级4.2 使用 PERCENT_RANK 的优势4.3 使用 PERCENT_RANK 5. 总结 在 MySQL 中&#xff0c;PERCENT_RANK 函数用于计算一个值在其分组中的百分等级。 它的返回值范围是从 0 …

【LLM】吴恩达『微调大模型』课程完全笔记

Finetuning Large Language Models 版权说明&#xff1a; 『Finetuning Large Language Models』是DeepLearning.AI出品的免费课程&#xff0c;版权属于DeepLearning.AI(https://www.deeplearning.ai/)。 本文是对该课程内容的翻译整理&#xff0c;只作为教育用途&#xff0c;不…

会声会影封面图怎么设置 会声会影渲染封面如何固定 会声会影视频剪辑软件制作教程

使用会声会影剪辑完成过后&#xff0c;通常我们需要给我们的视频设置封面&#xff0c;渲染封面又需要进行固定。本文将围绕会声会影封面图怎么设置和会声会影渲染封面如何固定来进行介绍。 一、会声会影封面图怎么设置 会声会影不能随意自定义设置封面&#xff0c;默认情况下…

中国姓名学十大权威专家颜廷利:全国排名第一的起名大师

颜廷利教授,是济南市历城区唐王镇的名人,位居2023年中国当代十大国学大师排行榜之首。全国排名第一的起名大师颜廷利教授以其深厚的学术造诣和卓越的贡献赢得了名誉和尊重,成为当代国学界的翘楚。他从事国学研究已有数十年,对经史子集的研究融会贯通,展现出了非凡的学术造诣。中…

Navicate操作某一张表后,卡主,无法加载,也无法编辑,更无法读取

说明 Navicate操作某一张表后&#xff0c;卡主&#xff0c;无法加载&#xff0c;也无法编辑&#xff0c;更无法读取&#xff0c;遇到这种情况&#xff0c;一般是因为表被锁住了 解决方案 右击数据库&#xff0c;打开命令号界面 查看进程列表 SHOW PROCESSLIST;mysql> …

FreeRTOS:4.内存管理

FreeRTOS内存管理 目录 FreeRTOS内存管理1. 为什么不直接使用C库函数的malloc和free函数2. FreeRTOS的五种内存管理方式3. heap4源码分析3.1 堆内存池3.2 内存块的链表数据结构3.3 堆的初始化3.4 堆的内存分配3.5 堆的内存释放 4. 总结 1. 为什么不直接使用C库函数的malloc和fr…

LIMS(实验室)信息管理系统源码、有哪些应用领域?采用C# ASP.NET dotnet 3.5 开发的一套实验室信息系统源码

LIMS&#xff08;实验室&#xff09;信息管理系统源码、有哪些应用领域&#xff1f;采用C# ASP.NET dotnet 3.5 开发的一套实验室信息系统源码 LIMS实验室信息管理系统&#xff0c;是一种基于计算机硬件和数据库技术&#xff0c;集多个功能模块为一体的信息管理系统。该系统主…

利用钉钉机器人和PHP开发一款免费的网站可用性检测工具,单节点版

前言 手里有几套系统正在运维&#xff0c;需要保障正常运行&#xff0c;所以可用性检测就必不可少啦&#xff0c; 以前本来是用的阿里官方的云监控&#xff0c;但现在价格感觉太贵了&#xff0c;不划算 那就自己手搓一个简易版的监控吧。 成品效果展示 代码展示 <?php …

2024年哪4种编程语言最值得学习?看JetBrains报告

六个月前,编程工具界的大牛JetBrains发布了他们的全球开发者年度报告。 小吾从这份报告中挑出了关于全球程序员过去一年使用编程语言的情况和未来的采纳趋势,总结出2024年最值得学习的四种编程语言。一起来看看吧。 JetBrains在2023年中开始,就向全球的编程达人们发出了问卷…

海豚调度异常处理: 使用 arthas 在内存中删除启动失败的工作流

&#x1f4a1; 本系列文章是 DolphinScheduler 由浅入深的教程&#xff0c;涵盖搭建、二开迭代、核心原理解读、运维和管理等一系列内容。适用于想对 DolphinScheduler了解或想要加深理解的读者。祝开卷有益。大数据学习指南 大家好&#xff0c;我是小陶&#xff0c;DolphinSch…