基于HLS工具的进阶实战学习笔记1——卷积单元

这里写自定义目录标题

笔记——学习HLS:卷积单元

void Conv(ap_uint<16> CHin,ap_uint<16> Hin,ap_uint<16> Win,ap_uint<16> CHout,
ap_uint<8> Kx,ap_uint<8> Ky,ap_uint<8> Sx,ap_uint<8> Sy,ap_uint<1> mode,ap_uint<1> relu_en,
dtype_bus feature_in[],ap_uint<4> feature_in_precision,
dtype_bus W[],ap_uint<4> W_precision,
dtype_bus feature_out[],ap_uint<4> feature_out_precision
)//mode: 0:VALID, 1:SAME

Conv是做卷积运算,其中的feature_in是输入特征,feature_out是输出特征,W是卷积核参数,这几个参数都是指向内存中数据的首地址,因此在综合之前,必须进行约束,否则会报如下错误:“unsupported memory access on variable ‘feature_out.V’ which is (or contains) an array with unknown size at compile time.”
AXI4 master interface默认开始所有的读写操作都是从0x0地址开始的。如果想设置读写地址偏移,需要用到offset选项。主要解释一下offset = slave的时候,表示在接口处添加一个32位寄存器表示offset的值。设置了offset之后,HLS模块读取或者写出数据的时候会直接添加上偏移,来读取任意位置的数据。
在这里插入图片描述上图为feature_in、feature_out、W的设置,其中depth的设置是为了C/RTL联合仿真。
进行综合之后,在报告文件中看到如下信息:
在这里插入图片描述这是因为,代码中for循环的次数是变量,综合工具无法给出Latency。需要进行约束。当有多层循环时,给每个循环加个标号是有必要的,便于阅读。例如:
LOOP_i:for(int i=0;i<Hout;i++)
给每个循环加上标号后,接下来设置循环次数的约束
在这里插入图片描述feature_out[(cout/K)WoutHout+i*Wout+j].range((cout%K)*16+15,(cout%K)*16)=res如何优化,feature_out是指向内存的指针,这行代码是否导致两次访问内存?可以通过Co-Simulation仿真时序图去检查:
在这里插入图片描述从时序图可以发现,这行代码被综合成先读内存,然后写内存,如果大规模循环时,会浪费很多时钟周期,需要改成只写一次内存。改成:
dtype_bus out_tp=0;
dtype_dat res_16=res;
out_tp.range((cout%K)*16+15,(cout%K)16)=res;sum=0;
feature_out[(cout/K)WoutHout+i
Wout+j]=out_tp;out_tp=0;

多层循环中应该尽量实现Loop Flattening。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值