可综合的C++类和模板(一)

张开发
2026/6/16 19:11:20 15 分钟阅读
可综合的C++类和模板(一)
一、c类和模板1.hls高层次综合工具是支持对c类进行综合的2.但是你设计的顶层函数没必要玩得很花老老实实用c语言中最普通的函数3.不要对顶层函数只用为c类或者c类的成员函数或者函数模板不好意思不可综合4.如果你想对类成员函数进行综合直接在顶层函数中对类进行实例化然后调用即可二、顶层函数设计#include cpp_FIR.h// Top-level function with class instantiateddata_t cpp_FIR(data_t x){static CFircoef_t, data_t, acc_t fir1;cout fir1;return fir1(x);}三、核心类代码设计#include fstream#include iostream#include iomanip#include cstdlibusing namespace std;#define N 85typedef int coef_t;typedef int data_t;typedef int acc_t;// Class CFir definitiontemplateclass coef_T, class data_T, class acc_Tclass CFir {protected:static const coef_T c[N];data_T shift_reg[N-1];private:public:data_T operator()(data_T x);templateclass coef_TT, class data_TT, class acc_TTfriend ostreamoperator(ostream o, const CFircoef_TT, data_TT, acc_TT f);};// Load FIR coefficientstemplateclass coef_T, class data_T, class acc_Tconst coef_T CFircoef_T, data_T, acc_T::c[N] {#include cpp_FIR.h};// FIR main algorithmtemplateclass coef_T, class data_T, class acc_Tdata_T CFircoef_T, data_T, acc_T::operator()(data_T x) {int i;acc_t acc 0;data_t m;loop: for (i N-1; i 0; i--) {if (i 0) {m x;shift_reg[0] x;} else {m shift_reg[i-1];if (i ! (N-1))shift_reg[i] shift_reg[i - 1];}acc m * c[i];}return acc;}// Operator for displaying resultstemplateclass coef_T, class data_T, class acc_Tostream operator(ostream o, const CFircoef_T, data_T, acc_T f) {for (int i 0; i (sizeof(f.shift_reg)/sizeof(data_T)); i) {o shift_reg[ i ] f.shift_reg[i] endl;}o ______________ endl;return o;}data_t cpp_FIR(data_t x);四、TB设计#include cpp_FIR.hint main() {ofstream result;data_t output;int retval0;// Open a file to saves the resultsresult.open(result.dat);// Apply stimuli, call the top-level function and saves the resultsfor (int i 0; i 250; i){output cpp_FIR(i);result setw(10) i;result setw(20) output;result endl;}result.close();// Compare the results file with the golden resultsretval system(diff --brief -w result.dat result.golden.dat);if (retval ! 0) {printf(Test failed !!!\n);retval1;} else {printf(Test passed !\n);}// Return 0 if the testreturn retval;}五、支持的c和不支持可综合的C1.支持的部分类的构造函数和析构函数可以综合支持对虚拟函数进行综合--必须可以静态判断细化期间的函数支持对抽象函数进行综合--必须可以静态判断细化期间的函数2.不支持的部分如果虚拟函数在多层继承类的层级中定义但是仅仅含单一继承的层级就不可支持综合如果在if-else或者for循环中使用类指针是不可综合的STL容器包含对象指针那么也不可综合STL容器中调用多态函数那么也不可综合。不可综合案例一vectorbase * base_ptrs(10);//Push_back some base ptrs to vector.for (int i 0; i base_ptrs.size(); i) {//Static elaboration cannot resolve base_ptrs[i] to actual data type.base_ptrs[i]-virtual_function();}不可综合案例二Vivado HLS 不支持基本对象指针为全局变量的情况Base *base_ptr;void func(){...base_prt-virtual_function();...}不可综合案例三基本对象指针不能作为类定义中的成员变量// Static elaboration cannot bind base object pointer with correct datatype.class A{...Base *base_ptr;void set_base(Base *base_ptr);void some_func();...};void A::set_base(Base *ptr){this.base_ptr ptr;}void A::some_func(){â¦.base_ptr-virtual_function();â¦.}

更多文章