在vitis中bit位赋值如何优化到一拍完成

使用vitis实现硬件代码时,经常遇到不是整拍对齐的情况,比如:

ap_uint<128> a;

ap_uint<64> b[10];

int pad,pos;

/// 计算pos,pad .....

a(pos-1,0) = b[pad](63,pos);

a(63+pos,pos) = b[pad+1];

a(127,64+pos)=b[pad+2];

上述代码要3拍才能完成,如果做到1拍需要做以下优化

ap_uint<64>& get_one_pad(ap_uint<64>& data1,ap_uint<64>& data2,int pos)

{

ap_uint<64> data;

data(63-pos,0) = data1(63,pos);

data(63,64-pos)=data2(pos-1,0);

return data;

}

///**************************************************************************************

ap_uint<128> a;

ap_uint<64> b[10];

int pad,pos;

/// 计算pos,pad .....

/// 1 这块代码的目的是将b中需要用到的数据copy出来,copy两份是为了后面赋值避免冲突

ap_uint<64> x1[3];

ap_uint<64> x2[3];

for( int i=0;i<2;i++)

{

x1[i] = b[pad];

x2[i] = b[pad];

}

/// 2这块代码的目的是将数据分别放到两个64bit区域

ap_uint<64> d[2];

d[0] = get_one_pad(x1[0],x2[1],pos);

d[1] = get_one_pad(x1[1],x2[2],pos);

/// 3最终赋值

a(63,0) = d[0];

a(127,64)=d[1];

上述代码通过三步解决了每次数据操作都是整拍的问题,这样后续即使一拍无法完成,也可以流水打拍完成,比如a如果是ram,就可以方便的流水打拍了。

ps:在实现上述功能的时候发现vitis对函数inline是在verilog层次的,就是说它先把c代码编译成verilog在inline,这样导致本来函数在从c到verilog过程中可以优化的地方无法优化了。比如:get_one_pad函数如果inline就无法一拍完成了,这种情况也不能用pipeline,只能让编译器自动生成

相关推荐
bzmK1DTbd9 小时前
Git版本控制:Java项目中的分支管理与合并策略
java·开发语言·git
Rust研习社9 小时前
为什么 Rust 没有空指针?
开发语言·后端·rust
kyriewen119 小时前
WebAssembly:前端界的“外挂”,让C++代码在浏览器里跑起来
开发语言·前端·javascript·c++·单元测试·ecmascript
其实防守也摸鱼11 小时前
CTF密码学综合教学指南--第九章
开发语言·网络·python·安全·网络安全·密码学·ctf
砚底藏山河11 小时前
Python量化开发:2026最佳实时股票数据API接口推荐与对比
开发语言·windows·python
AlunYegeer12 小时前
JAVA,以后端的视角理解前端。在全栈的路上迈出第一步。
java·开发语言·前端
hixiong12312 小时前
C# OpenvinoSharp使用DINOv2模型进行图像相似度计算
开发语言·c#
DFT计算杂谈13 小时前
自动化脚本一键绘制三元化合物相图
java·运维·服务器·开发语言·前端·python·自动化
EW Frontier13 小时前
6G ISAC新范式:基于智能漏波天线的Wi‑Fi通感一体化系统设计与实测【附MATLAB+python代码】
开发语言·python·matlab·music·isac·doa·wi‑fi
楼田莉子13 小时前
Linux网络:NAT_代理
linux·运维·服务器·开发语言·c++·后端