资源描述:
《HLS中指针作为Top函数参数的处理方法》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、VivadoHLS中指针作为top函数参数的处理方法指针作为C语言精华,对于软件设计者比较好理解,但是在xilinxvivadoHLS高级语言综合的设计中,由于其综合后对应的换件元素难以用软件的概念解释,常常令程序设计者和VHLS工具使用者头痛。本文采用浅显易懂的描述方式,结合具体的c代码例子,详细描述了常用三种指针的设计类型,以及其作为顶层函数参数时,采用不同的编码风格和HLS约束策略,满足设计者对指针作为RTL接口的需求。1.基本指针类型基本指针类型指的是指针没冇运算或者没有多次的存取(读写)。指针作为top函数的参数时
2、,指针综合为wire型或者握手协议类型接口。如下例了1・1:voidpointer_basic(dio_t*d){staticdio_tacc=0;acc+二*d;*d=acc;}例子M基本类型指针作为顶层函数参数在这个例子中,只是简单的读写指针指向的变量值,并没有对指针做偏移或者指针(地址)运算,其接口综合为线型的RTL接口。2.指针运算类型。指针作为top层函数参数,并但函数中冇对指针运算时,我们称Z为指针运算类型。指针运算常常限制指针可能综合的接口类型。如下例中,指针做了偏移运算用于累加数据,从第二个值开始读出累加,并
3、将每次累加结果写入上一个地址中。voidpointer_arith(dio_t*d){staticintacc=0;inti;for(i=0;iv4;i++){acc+=*(d+i+l);*(d+i)=acc;}}例子1-2指针运算类型作为顶层函数参数下而代码例子1・3是这个指针运算类型仿真的testbencho因为函数pointer_arith内部的for循环进行数据累加,testbench通过数组d[5]分配了地址空间并对数组赋值。intmain(){dio_td[5],ref[5];inti,retval=();FIL
4、E*fp;//Createinputdatafor(i=0;i<5;i++){d[i]=i;ref[i]=i;}//Callthefunctiontooperateonthedatapointer_arith(d);//Savetheresultstoafilefp=fopen("result.dat,,,',w,');printf("DinDout",i,d);for(i=0;iv4;i++){fprintf(fp,"%dn,d[i]);printf(H%d%dn,ref[i],d[i]);}fclose(fp
5、);//Comparetheresultsfilewiththegoldenresultsretval=system(ndiff-brief・wresult.datresult.golden.dat");if(retval!=0){printf(nTestfailed!!!n);retval=1;}else{printf("Testpassed!");}//Return0ifthetestreturnretval;}例子1-3指针运算类型作为顶层函数参数的testbench在C编译环境下仿真上而例子1-3的代码,结果
6、如下:DinDout011326310Testpassed!指针运算带来的问题是,通常情况下,指针偏移是不规则的,不能按顺序存取指针数据。而Wire,握手类型或者Fifo接口类型没有办法乱序存取数据。对于wire类型接口来说,当设计本身准备好接收数据时可以读入数据,或者当数据准备好wady吋,可以写出数据。对握手和Fifo类型接口,当控制信号允许操作进行时,读入或写出数据。在上面wi©握手或者FIFO类型接口的情况下,数据从0元索开始,必须按顺序到达(写入)。在指针运算的例了1・2中,第一个数据从索引1开始读入(i从0开始,
7、0+1=1),对应于testbench+数据d[5]的第二个元素。当这种情况在硬件应用时,需要某种格式的数据索引,这种情况对于wire类型,或者握手类型还是Fifo类型来说,都不支持。像上例1-2指针运算的代码,只能综合成ap_bus接口,因为这种接口带有地址,当数据存取(读写)时,用于对应的数据索引指示。还有一种方法,代码必须修改成如下例子1・4的风格,用数据array作为接口替代指针。这种方法应用了array作为top层参数时综合成RAM接口(ap_memory)的原理,memory接口口J以用地址作为数据的索引并且口J
8、以乱序执行,不必顺序存取操作。voidarray_arith(dio_td[5]){staticintacc=0;inti;for(i=0;i<4;i++){acc+=d[i+l];d[i]=acc;}}例子1-4指针运算类型作为顶层函数参数修改为arrayWire类型、握手类型或Fifo