Vitis HLS 学习笔记--资源绑定-使用URAM(1)

目录

1. 简介

2. 代码分析

2.1 存储器代码

2.2 Implementation报告

2.3 存储器类型指定

2.4 存储器初始化

3. 总结


1. 简介

在博文《Vitis HLS 学习笔记--资源绑定-使用URAM-CSDN博客》中,介绍了如何在Vitis HLS环境下设计一个简易的存储器模型。

通过以下编译器指令:

static data_t buffer[NWORDS];
#pragma HLS DEPENDENCE variable = buffer inter WAR false
#pragma HLS BIND_STORAGE variable = buffer type = ram_2p impl = uram

我们成功创建了一个既能读又能写的存储器,并且明确使用了 UltraRAM(URAM)作为其存储媒介。

本文旨在深入探讨该实现的内部机制,通过研究 HLS 工具所生成的 RTL 代码,解析该存储器模型的构建过程和工作原理。

2. 代码分析

2.1 存储器代码

在以下路径,我们可以发现,生成了两个 verilog 文件:

其中 example.v 是顶层文件,而example_buffer_V_RAM_2P_URAM_1R1W.v 则是定义储存器的文件。

打开后,其内容如下:

`timescale 1 ns / 1 ps
module example_buffer_V_RAM_2P_URAM_1R1W (address0, ce0, q0, address1, ce1, d1, we1,  reset,clk);parameter DataWidth = 128;
parameter AddressWidth = 14;
parameter AddressRange = 16384;input[AddressWidth-1:0] address0;
input ce0;
output reg[DataWidth-1:0] q0;
input[AddressWidth-1:0] address1;
input ce1;
input[DataWidth-1:0] d1;
input we1;
input reset;
input clk;(* ram_style = "hls_ultra", cascade_height = 1 *)reg [DataWidth-1:0] ram[0:AddressRange-1];initial begin$readmemh("./example_buffer_V_RAM_2P_URAM_1R1W.dat", ram);
endalways @(posedge clk)  
begin if (ce0) beginq0 <= ram[address0];end
endalways @(posedge clk)  
begin if (ce1) beginif (we1) ram[address1] <= d1; end
endendmodule

其实代码逻辑功能很简单,创建一个具有两个端口(一个用于读取,一个用于写入)的RAM缓冲区。

2.2 Implementation报告

要查看IMPL 报告,需要运行“Run Implementation”:

 我们关注报告中如下内容:

================================================================
== RTL Synthesis Resources
================================================================
+-------------------------+-----+----+-----+------+------+-----+--------+------+---------+----------+----------------+
| Name                    | LUT | FF | DSP | BRAM | URAM | SRL | Pragma | Impl | Latency | Variable | Source         |
+-------------------------+-----+----+-----+------+------+-----+--------+------+---------+----------+----------------+
| inst                    | 136 | 4  |     |      | 8    |     |        |      |         |          |                |
|   (inst)                | 2   | 2  |     |      |      |     |        |      |         |          |                |
|   buffer_V_U            | 134 | 2  |     |      | 8    |     |        |      |         |          |                |
|     bind_storage ram_2p |     |    |     |      |      |     | pragma | uram | 1       | buffer_V | example.cpp:16 |
+-------------------------+-----+----+-----+------+------+-----+--------+------+---------+----------+----------------+

 可见,该存储器使用了8个 URAM来实现的,没有用到 BRAM。

2.3 存储器类型指定

(* ram_style = "hls_ultra", cascade_height = 1 *)reg [DataWidth-1:0] ram[0:AddressRange-1];

ram_style = "hls_ultra",指定RAM类型。

cascade_height = 1,限制级联的深度或高度。在构建所需的存储器时,综合工具应尽量限制使用级联内存块的深度或高度为1。这可以理解为尽量不要让多个RAM块在垂直方向上连接形成更深的存储结构。

2.4 存储器初始化

initial begin$readmemh("./example_buffer_V_RAM_2P_URAM_1R1W.dat", ram);
end

需要特别注意,在大多数情况下,initial块通常被视为仅用于仿真目的,用于在仿真开始时执行一次性操作,而不是用于硬件实现。在此代码段中,initial块通过$readmemh系统任务从指定的文件 "./example_buffer_V_RAM_2P_URAM_1R1W.dat")中读取数据,并将这些数据初始化到URAM(超级RAM)的ram数组中。

然而,在Vitis HLS中,$readmemh,可以被识别并转化为硬件实现的一部分,实现硬件中预加载存储器内容。这一点我们可以在 Package IP 中确认。

3. 总结

通过本文深入探讨了在Vitis HLS环境下设计的存储器模型的内部机制。通过分析生成的RTL代码和IMPL报告,我们了解到该存储器模型利用URAM实现,具有读写功能,并且限制了级联深度为1。特别地,我们注意到存储器的初始化操作在Vitis HLS中被转化为硬件实现的一部分,这为预加载存储器内容提供了便利。总的来说,本文为使用Vitis HLS设计存储器提供了实用的指导,加深了对存储器设计原理的理解。

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

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

相关文章

贝努利贝叶斯算法

基本用法 完整代码&#xff1a; from sklearn.naive_bayes import BernoulliNB from sklearn.datasets import make_blobs from sklearn.model_selection import train_test_split# 生成数据 X, y make_blobs(n_samples500, centers5, random_state8) X_train, X_test, y_tr…

企业或者个体户为什么会经营异常?

在复杂多变的市场经济环境中&#xff0c;无论是企业还是个体工商户&#xff0c;都可能遭遇经营异常的情况。及时识别这些预警信号并采取有效措施&#xff0c;对于避免潜在风险、保持健康发展至关重要。本文将深入探讨企业与个体户常见的经营异常类型、识别方法以及应对策略&…

MongoDB的安装和配置

简介 MongoDB 是一个开源的、面向文档的、非关系型数据库管理系统&#xff08;NoSQL&#xff09;。它使用JSON-like&#xff08;BSON&#xff09;文档来存储数据&#xff0c;使得数据结构更加灵活&#xff0c;易于理解和操作&#xff0c;特别适合处理大量的、半结构化或非结构…

智慧校园是教育信息化的首要目标

教育一词不止说的是学龄阶段的人&#xff0c;所有人的一生都离不开教育二字&#xff0c;从出世时分辩国际的颜色到学年到学校上学&#xff0c;再到走上社会作业后的各种训练&#xff0c;这些都离不开教育&#xff0c;仅仅不同阶段学习的办法有所不同。 其间&#xff0c;学龄时期…

Python代码:十、字符串连接

1、题目 小明有两个最好的朋友&#xff0c;他们的名字分别用input读入记录在两个字符串中&#xff0c;请使用字符串连接&#xff08;&#xff09;帮助牛牛将两个朋友的名字依次连接在一个字符串中输出。 2、代码 import sysstr1 input() str2 input() str3 str1 str2 pr…

2024做安全测试必须要知道的几种方法!

前言 安全性测试(Security Testing)是指有关验证应用程序的安全等级和识别潜在安全性缺陷的过程&#xff0c;其主要目的是查找软件自身程序设计中存在的安全隐患&#xff0c;并检查应用程序对非法侵入的防范能力&#xff0c;安全指标不同&#xff0c;测试策略也不同。 但安全…

打包conda环境的两种方法:conda env export和Conda-Pack

打包conda环境的两种方法&#xff1a;conda env export和Conda-Pack 搭建项目环境可能是整个开发过程中最让人头疼的部分了。如何把我们辛辛苦苦搭建的环境打包起来&#xff0c;万一环境崩了还能迅速恢复&#xff0c;或者让别人能轻松地复制同样的设置呢&#xff1f; 今天&am…

微软中国 AI 团队搬至美国?可解决家属签证

多位网友爆料称&#xff0c;微软中国数百名员工收到公司邮件&#xff0c;询问是否愿意迁移至美国、澳大利亚、爱尔兰等国家工作。公司将负责亲属签证问题&#xff0c;以Azure云平台的AI团队为主&#xff0c;员工需要在6月7日前给出答复。 有微软员工表示情况属实&#xff0c;这…

超声波清洗机哪家好一点?四款超一流超声波清洗机大盘点

在追求极致清洁和维护精密工具、设备及珍贵物品的时代&#xff0c;超声波清洗机显得尤为重要。不仅因其高效、快速的清洁效果&#xff0c;更因其能够触及传统手工清洁所不能及的微小缝隙。无论你是珠宝设计师、机械工程师、还是热爱生活的普通家庭用户&#xff0c;超声波清洗机…

GO语言核心30讲 实战与应用 (io包,bufio包,os包,网络服务,http,性能分析)

原站地址&#xff1a;Go语言核心36讲_Golang_Go语言-极客时间 一、io包中的接口和工具 1. strings.Builder、strings.Reader 和 bytes.Buffer 这些类型实现了 io 包的很多接口&#xff0c;目的是什么&#xff1f; 是为了提高不同程序实体之间的互操作性。 程序实体是指比如网…

43. 字符串相乘

题目 给定两个以字符串形式表示的非负整数 num1 和 num2&#xff0c;返回 num1 和 num2 的乘积&#xff0c;它们的乘积也表示为字符串形式。 **注意&#xff1a;**不能使用任何内置的 BigInteger 库或直接将输入转换为整数。 示例 1: 输入: num1 "2", num2 &qu…

python:functools.partial和functools.wraps使用

python&#xff1a;functools.partial和functools.wraps使用 1 前言 python内置的functools模块&#xff0c;提供了一些非常好用的类或者方法&#xff0c;其中functools.partial和functools.wraps的使用频率较高&#xff0c;本文将针对其分析使用。 2 使用 2.1 functools.p…