双口RAM和单口RAM的综合设计
方案一:这种设计情况,ap_memory才是会设计为双口RAM的接口
void xxx_top
(
hls::stream< >& src,
hls::stream< >& dst,
ap_uint<32> cfg_mem[1024]
){
//#pragma HLS ARRAY_PARTITION variable=cfg_mem block factor=2 dim=1
//#pragma HLS INTERFACE bram port=cfg_mem
//#pragma HLS ARRAY_PARTITION variable=cfg_mem complete dim=1
//#pragma HLS INTERFACE ap_stable port=cfg_mem
#pragma HLS RESOURCE variable=cfg_mem core=RAM_T2P_BRAM
#pragma HLS INTERFACE axis register both port=src
#pragma HLS INTERFACE axis register both port=dst
//#pragma HLS INTERFACE ap_ctrl_none port=return
#pragma HLS INTERFACE s_axilite port=return bundle=CONTROL_BUS
//#pragma HLS INTERFACE s_axilite port=cfg_mem bundle=CONTROL_BUS
static struct ccc_param_S ccc_param;
#pragma HLS ARRAY_PARTITION variable=ccc_param_S.ccc_param cyclic factor=2 dim=1
#pragma HLS RESOURCE variable=ccc_param_S.ccc_param core=RAM_2P_LUTRAM
for(ap_uint<16> k=0;k<N;k=k+2){
#pragma HLS PIPELINE II=1
ccc_param_S.ccc_param[k] = cfg_mem[k];
ccc_param_S.ccc_param[k+1] = cfg_mem[k + 1];
}
}
方案二:下面代码的设计方案,综合工具只会将你的设计综合为单口RAM
void xxx_top
(
hls::stream< >& src,
hls::stream< >& dst,
ap_uint<32> cfg_mem[1024]
){
//#pragma HLS ARRAY_PARTITION variable=cfg_mem block factor=2 dim=1
//#pragma HLS INTERFACE bram port=cfg_mem
//#pragma HLS ARRAY_PARTITION variable=cfg_mem complete dim=1
//#pragma HLS INTERFACE ap_stable port=cfg_mem
#pragma HLS RESOURCE variable=cfg_mem core=RAM_T2P_BRAM
#pragma HLS INTERFACE axis register both port=src
#pragma HLS INTERFACE axis register both port=dst
//#pragma HLS INTERFACE ap_ctrl_none port=return
#pragma HLS INTERFACE s_axilite port=return bundle=CONTROL_BUS
//#pragma HLS INTERFACE s_axilite port=cfg_mem bundle=CONTROL_BUS
static struct ccc_param_S ccc_param;
#pragma HLS ARRAY_PARTITION variable=ccc_param_S.ccc_param cyclic factor=2 dim=1
#pragma HLS RESOURCE variable=ccc_param_S.ccc_param core=RAM_2P_LUTRAM
for(ap_uint<16> k=0;k<N;k=k+1){
#pragma HLS PIPELINE II=1
ccc_param_S.ccc_param[k] = cfg_mem[k];
}
}
方案二的核心代码不变的情况下,你对顶层接口怎么优化,都是端口RAM,因为你的优化并不会被综合工具采纳。
综合工具认为,你这要求的双口RAM没啥用啊,你在上面for循环中赋值,这种顺序的方式进行赋值,就是当单口RAM用啊,
你却让我综合为双口RAM,不好意思啊,我不按照你的搞了,忽略你的综合指令。
总结:
综合工具并不总是按照用户的方式进行综合和会有,你的优化指令只是指导和告知综合工具的作用,至于综合工具会不会
按照你的要求进行优化,它自己是有一套判断逻辑的。
