在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,只能让编译器自动生成

相关推荐
isyangli_blog3 小时前
OpenDayLight (Carbon 版本) 启动与组件安装
开发语言·php
vb2008113 小时前
FastAPI APIRouter
开发语言·python
Benszen3 小时前
KVM虚拟化解决方案
开发语言·perl
会编程的土豆3 小时前
Go 语言反射(Reflection)详解
开发语言·后端·golang
東雪木3 小时前
多线程与并发编程 专属复习笔记
java·开发语言·笔记·java面试
杨充3 小时前
1.3 浮点型数据设计灵魂
开发语言·python·算法
噜噜噜阿鲁~3 小时前
python学习笔记 | 11.3、面向对象高级编程-多重继承
java·开发语言
basketball6164 小时前
Go 语言从入门到进阶:4. 数组和MAP使用方法总结
开发语言·后端·golang
春生野草4 小时前
反射、Tomcat执行
java·开发语言
雪的季节5 小时前
企业级 Qt 全功能项目
开发语言·数据库·qt