取消
显示结果 
显示  仅  | 搜索替代 
您的意思是: 
Yi_keil
Contributor
Contributor
415 次查看
注册日期: ‎01-08-2021

在Vitis HLS中如何指定URAM的存储方式?

目前我有一个数据格式为std::complex<ap_fix<32,16>>的数组,其实部和虚部分别的位宽为32bit。

现在我想把该数组存入URAM中,一个URAM深度为4K(4×1024),宽度为72bit。

我本想的是,一个URAM能存储两个32bit位宽的数组元素,这样一块URAM就能存储4*1024*2个数组元素,而在我使用了HLS BIND_STORAGE指令将该数组存储到URAM中后,综合报告显示每个URAM的小单元只存储了一个数组元素,也就是说72bit的宽度只用到了其中的32bit。

我的问题是,是否有什么办法能让URAM的利用率更高,使得一个URAM单元存储2个32bit的数?

有人问过相同的问题:https://forums.xilinx.com/t5/High-Level-Synthesis-HLS/UltraRAM-utilization-in-Vivado-HLS/td-p/1182708 (但是没有人回答)

 

 

0 项奖励
7 回复数
Yi_keil
Contributor
Contributor
351 次查看
注册日期: ‎01-08-2021

有人能看看吗(´;︵;`)

0 项奖励
wenchen
Moderator
Moderator
339 次查看
注册日期: ‎05-27-2018

Hi @Yi_keil ,

请上传一个附件工程,给我一个复现问题的testcase吧

Thanks,

Wen

-------------------------------------------------------------------------
Don’t forget to reply, kudo, and accept as solution.


**~ Got a minute? Answer our Vitis HLS survey here! ~**


-------------------------------------------------------------------------
如果提供的信息能解决您的问题,请标记为“接受为解决方案”。
如果您认为帖子有帮助,请点击“奖励”。谢谢!
-------------------------------------------------------------------------------------------------
0 项奖励
Yi_keil
Contributor
Contributor
258 次查看
注册日期: ‎01-08-2021

您好,附件中是我的工程复现,工程中使用了Vitis_Libraries中的FFT库,在工程中我将FFT library的路径添加在了include中,在您的电脑中路径可能会不一样,如果报错找不到“vt_fft_hpp”头文件,请修改include路径。

针对这个工程,我想针对性地复述一遍我的问题:

本工程中的range_profile[SIZE3][SIZE2][SIZE1](即[8][512][256])就是我想存入URAM中的复数数组,该数组在后续的处理中会被用到。

该数组的数据类型为cmpxDataIn,实部和虚部分别占32bit,即:

 

typedef std::complex<<ap_fixed<32,16>>> cmpxDataIn ;
cmpxDataIn range_profile[8][512][256];

 

在我的设想中,一个URAM的大小为288K,深度为4K(4×1024),位宽为72bit,一个URAM的最小单元可以存储两个range_profile的实部(32bit+32bit<72bit),因此一个URAM总共可以存储4*1024*2个range_profile的元素实部或虚部,总共需要的URAM数量=(8*512*256*2)/(4*1024*2)=256个

而在综合报告中,使用的URAM数量为512个。QQ截图20210325141625.jpg

 

0 项奖励
Yi_keil
Contributor
Contributor
207 次查看
注册日期: ‎01-08-2021

顶顶

0 项奖励
Yi_keil
Contributor
Contributor
172 次查看
注册日期: ‎01-08-2021

Any response will be helpful.

我觉得没有必要为这个问题再创建一个新的话题,所以继续在这个问题下追问了……

如果URAM确实存储不下该数组,请问还有什么办法储存该数组呢?

0 项奖励
wenchen
Moderator
Moderator
159 次查看
注册日期: ‎05-27-2018

Hi @Yi_keil .

我修改完头文件跑你的工程的时候遇到了以下error,使用的2020.2 Vitis HLS

ERROR: [XFORM 203-103] Cannot partition array 'fftOutData_local2._M_real.V' (C:/Users/wenchen/Desktop/traing/Vitis/Vitis_Libraries-master/dsp/L1/include/hw/vitis_fft/fixed/vitis_fft/hls_ssr_fft.hpp:853): variable is not an array.
ERROR: [HLS 200-70] Pre-synthesis failed.

你用的是什么版本?有这个问题吗?

Wen

 

-------------------------------------------------------------------------
Don’t forget to reply, kudo, and accept as solution.


**~ Got a minute? Answer our Vitis HLS survey here! ~**


-------------------------------------------------------------------------
如果提供的信息能解决您的问题,请标记为“接受为解决方案”。
如果您认为帖子有帮助,请点击“奖励”。谢谢!
-------------------------------------------------------------------------------------------------
0 项奖励
Yi_keil
Contributor
Contributor
147 次查看
注册日期: ‎01-08-2021

您好,我之前用2020.2的HLS的时候也遇到了这个问题。。所以我将其降级为2020.1的版本了,2020.1可以跑通。

不过这其中的FFT运算并不是必须的,我只是想表示我需要存储一个range_profile[8][512][256]这么大的数组,也许您可以用数组相加或别的操作代替FFT算法。

例如将

xf::dsp::fft::fft<fftParams1, 1>(FFT1_tmpin, FFT1_tmpout);

 替换为:

 computeloop:
 for(int t = 0; t < SIZE1 / SSR1; ++t)
		for (int r = 0; r < SSR1; ++r)
		{
			FFT1_tmpout[r][t] = cmpxDataOut(FFT1_tmpin[r][t].real(),FFT1_tmpin[r][t].imag());
		}

一样能够体现这个问题的核心点

0 项奖励