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

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

ap_uint<128> a;

ap_uint<64> b10;

int pad,pos;

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

a(pos-1,0) = bpad(63,pos);

a(63+pos,pos) = bpad+1;

a(127,64+pos)=bpad+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> b10;

int pad,pos;

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

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

ap_uint<64> x13;

ap_uint<64> x23;

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

{

x1i = bpad;

x2i = bpad;

}

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

ap_uint<64> d2;

d0 = get_one_pad(x10,x21,pos);

d1 = get_one_pad(x11,x22,pos);

/// 3最终赋值

a(63,0) = d0;

a(127,64)=d1;

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

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

相关推荐
Zenova EdgeOS25 分钟前
C++ 工业边缘 Boost.Asio 高级实战
开发语言·c++·边缘计算·工业网关
mqiqe29 分钟前
AgentScope Java 2.0 技能仓库(Skill Repository)完全实战指南
java·开发语言·elasticsearch
人工干智能30 分钟前
科普:Python中的生成器——带`yield`的函数
开发语言·python
whcyhhh31 分钟前
头歌实践教学平台:数据科学与大数据技术导论(十四)
大数据·开发语言·python
淼澄研学44 分钟前
GPT-4o及mini模型参数解析与Python API调用实操
开发语言·python
独立开发之道1 小时前
【three.js教程】Three.js 材质详解:从“不反光“到“物理级真实“怎么选
开发语言·javascript·材质
Highcharts.js1 小时前
Highcharts for Python 一套 Python 可视化图表生成库
开发语言·python·highcharts·可视化图表
这是程序猿2 小时前
深入剖析Java HashMap:底层原理、数据结构与核心机制全解析
java·开发语言·数据结构
nike0good2 小时前
CF 126B(Password-z algorithm/exkmp)
开发语言·c++·算法
huaweichenai2 小时前
PHP实现对接MQTT协议
开发语言·php