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

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)beginz1    <= 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;     endelse if (ce)beginz1    <= 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;          endassign 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.mzph.cn/web/27758.shtml

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

相关文章

专家解读 | NIST网络安全框架(3):层级配置

NIST CSF在核心部分提供了六个类别的关键功能和子功能&#xff0c;并围绕CSF的使用提供了层级&#xff08;Tier&#xff09;和配置&#xff08;Profile&#xff09;两种工具&#xff0c;使不同组织和用户更方便有效地使用CSF&#xff0c;本文将深入探讨CSF层级和配置的主要内容…

【PL理论】(24) C- 语言:有块的作用域 | 更新的语法 | 新的语义域 | 环境 vs. 内存

&#x1f4ad; 写在前面&#xff1a;我们将再次扩展之前的C语言&#xff0c;让我们向这种语言引入“作用域”的概念。 目录 0x00 C- 语言&#xff1a;有块的作用域 0x01 C- 语言&#xff1a;更新的语法 0x02 新的语义域 0x03 环境 vs. 内存 0x00 C- 语言&#xff1a;有块的…

Golang | Leetcode Golang题解之第145题二叉树的后序遍历

题目&#xff1a; 题解&#xff1a; func reverse(a []int) {for i, n : 0, len(a); i < n/2; i {a[i], a[n-1-i] a[n-1-i], a[i]} }func postorderTraversal(root *TreeNode) (res []int) {addPath : func(node *TreeNode) {resSize : len(res)for ; node ! nil; node n…

大语言模型QA

Q:关于 Yi-9B 通过 input/output cosine 来分析模型,可能文档里没有把前提说明白。该指标确实存在你们提到的不同模型大小不可比的问题。所以我们比较的是同一个模型在不同训练阶段,以及 layer 深度相同的dense models 之间的比较。除了发现yi-6B/34B 随着训练 tokens 的增加…

Polkadot <> Kusama 桥:打造无信任互操作性的开创性范例

原文&#xff1a;https://www.parity.io/blog/trustless-interoperability 作者&#xff1a;Adrian Catangiu&#xff5c;Rust 区块链核心工程师&#xff0c;Parity Technologies 编译&#xff1a;OneBlock Polkadot <> Kusama 桥是无信任互操作性的开创性范例。本文深…

TCP相关细节

1. 常用TCP参数 1.1 ReceiveBufferSize ReceiveBuffersize指定了操作系统读缓冲区的大小&#xff0c; 默认值是8192(如图5-10 所示)。在第4章的例子中,会有"假设操作系统缓冲区的长度是8" 这样的描述,可通过socket.ReceiveBufferSize 8 实现。当接收端缓冲区满了的时…

实用软件下载:XMind 2024最新安装包及详细安装教程

​XMind不仅是一款易用且功能强大的思维导图软件&#xff0c;也是一个开源项目。XMind以构建一个社区向全球提供领先的跨平台思维导图和头脑风暴软件为目标&#xff0c;以帮助用户提升效率。XMind公司是XMind开源项目的主要代码贡献者&#xff0c;与此同时&#xff0c;我们欢迎…

Stable Diffusion本地化部署详细攻略

一、硬件要求 内存&#xff1a;至少16GB 硬盘&#xff1a;至少60GB以上的磁盘空间&#xff0c;推荐SSD固态硬盘 显卡&#xff1a;推荐NVIDIA显卡 显存&#xff1a;至少4GB Stabl Diffusion因为是在本地部署&#xff0c;对显卡的要求比较高&#xff0c;如果经济能力可以的话…

AI大模型爆发,你还不学就晚了!抓住时代机遇,快速入门指南!

AI大模型风起云涌&#xff0c;你准备好乘风破浪了吗&#xff1f; 在一个阳光明媚的午后&#xff0c;小李坐在自己的工位上&#xff0c;眼前的代码如同繁星般繁多。他是一名资深的软件工程师&#xff0c;但在最近的技术浪潮中&#xff0c;他却感到了一丝不安。他的朋友圈里&…

RN6752V1 高性能AHD转MIPIDVPBT656BT601芯片方案,目前适用于车载方案居多

RN6752V1描述&#xff1a; RN6752V1是一种模拟高清晰度&#xff08;模拟高清&#xff09;视频解码器IC&#xff0c;专为汽车应用而设计。它集成了所有必要的功能块&#xff1a; AFE&#xff0c;PLL&#xff0c;解码逻辑&#xff0c;MIPI和I2C接口等&#xff0c;在一个小的5mm …

LLM资料大全:文本多模态大模型、垂直领域微调模型、STF数据集、训练微调部署框架、提示词工程等

前言 自ChatGPT为代表的大语言模型&#xff08;Large Language Model, LLM&#xff09;出现以后&#xff0c;由于其惊人的类通用人工智能&#xff08;AGI&#xff09;的能力&#xff0c;掀起了新一轮[自然语言处理]领域的研究和应用的浪潮。尤其是以ChatGLM、LLaMA等平民玩家都…

【ARM Cache 及 MMU 系列文章 6.5 -- 如何进行 Cache miss 统计?】

请阅读【ARM Cache 及 MMU/MPU 系列文章专栏导读】 及【嵌入式开发学习必备专栏】 文章目录 ARM Cache Miss 统计Cache 多层架构简介Cache 未命中的类型Cache 未命中统计Cache miss 统计代码实现Cache Miss 统计意义ARM Cache Miss 统计 在ARMv8/v9架构中,缓存未命中(Cache …

人工智能在风险管理中的创新之路

随着科技的飞速发展&#xff0c;人工智能&#xff08;AI&#xff09;已经渗透到我们生活的方方面面&#xff0c;尤其在风险管理领域&#xff0c;其展现出的巨大潜力令人瞩目。风险管理&#xff0c;作为一个涉及广泛领域的复杂系统&#xff0c;正逐渐依赖于AI技术来提升效率和准…

简单了解CPU的工作原理

目录 一、基本结构以及对应功能 &#xff08;1&#xff09;基本结构 &#xff08;2&#xff09;几个重要寄存器的详细介绍 操作码 (Opcode) 操作数 (Operands) 指令表 (Instruction Table) 第一个&#xff1a;程序计数器 (PC) 第二个&#xff1a;指令寄存器 (IR&#x…

【Arthas案例】某应用依赖两个GAV不同但包含两个相同全限定类名StaticLoggerBinder,引起log4j.Level类找不到异常

3分钟内解决问题 两个不同的GAV依赖冲突&#xff0c;包含相同全限定类名&#xff0c;引起ClassNotFoundException Maven依赖的三坐标体系GAV(G-groupId&#xff0c;A-artifactId&#xff0c;V-version) 【案例1】某应用依赖两个GAV不同的jar&#xff0c;但包含两个相同全限定类…

探索互联网寻址机制 | 揭秘互联网技术的核心,解析网络寻址

揭秘互联网技术的核心&#xff0c;解析网络寻址题 前提介绍局域网地址IP地址的分配方式动态IP分配机制内部网&#xff08;intranet&#xff09;ICANN负责IP分配DHCP协议获取IP地址 域名系统域名是什么域名工作方式hosts文件存储域名映射关系DNS分布式数据库DNS域名解析 Java进行…

Java中List流式转换为Map的终极指南

哈喽&#xff0c;大家好&#xff0c;我是木头左&#xff01; 在Java编程中&#xff0c;经常需要将一个List对象转换为另一个Map对象。这可能是因为需要根据List中的元素的某些属性来创建一个新的键值对集合。在本文中&#xff0c;我将向您展示如何使用Java 中的流式API轻松地实…

02_01_SpringMVC初识

一、回顾MVC三层架构 1、什么是MVC三层 MVC是 模型&#xff08;Model&#xff09;、视图&#xff08;View&#xff09;、控制器&#xff08;Controller&#xff09;的简写&#xff0c;是一种软件设计规范。主要作用是降低视图与业务逻辑之间的双向耦合&#xff0c;它不是一种…

Linux文本处理三剑客+正则表达式

Linux文本处理常用的3个命令&#xff0c;脚本或者文本处理任务中会用到。这里做个整理。 三者的功能都是处理文本&#xff0c;但侧重点各不相同&#xff0c;grep更适合单纯的查找或匹配文本&#xff0c;sed更适合编辑匹配到的文本&#xff0c;awk更适合格式化文本&#xff0c;对…

Elasticsearch 为时间序列数据带来存储优势

作者&#xff1a;来自 Elastic Martijn Van Groningen, Kostas Krikellas 背景 Elasticsearch 最近投资了对存储和查询时间序列数据的更好支持。存储效率一直是关注的主要领域&#xff0c;许多项目取得了巨大的成功&#xff0c;与将数据保存在标准索引中相比&#xff0c;可以节…