赞
踩
ERROR: System received a signal named SIGSEGV and the program has to stop immediately!
This signal was generated when a program tries to read or write outside the memory that is allocated for it, or to write memory that can only be read.
问题分析和可能的解决办法:
1、在顶层函数添加指令:#pragma HLS INTERFACE mode=m_axi bundle=img_i depth=__XF_DEPTH port=image_in
关键字depth,在C/RTL联合仿真时,指定测试激励文件处理的最大采样数,对于m_axi接口为必选项
2、上述#pragma语句出现关键字误写等问题,也会出现类似错误。
3、需要注意下testbench中,调用的Mat或者数组是否正常,比如图像数据调用时,为mat.data,且需要参考顶层函数的数据类型进行强制数据类型转换,比如(ap_uint<128> *) mat.data.
4、另外,如果你像我一样,主函数下最外围为一个for循环,会多次读取图像,则可能depth需要根据读取图像的数量进行设置,防止联合仿真异常。此种情况也有可能造成联合仿真直接无法结束,达到100%以上.
(// RTL Simulation : 0 / 1 [0.00%] @ "113000"
// RTL Simulation : 0 / 1 [3814.25%] @ "50000123000")。
1、地址对齐问题,当采用AXI总线宽度为128bits读取PS侧DDR数据时,需要保证数组数据首地址为16字节对齐(16*8 =128bits)。主要是因为访问DDR时,数据是按照16字节读取,且DDR地址永远为16的整数倍。(可以使用ILA抓取数据观察验证,可以看到地址是按照16的整数倍变化的)。
2、数据对齐问题,赛灵思图像库函数要求图像的列数为NPPC的整数倍。假如NPPC=8,即每个时钟处理8个像素,则图像列数需要为8的整数倍。
最终发现,是linux开辟的存储图像的空间不够。比如10000*2000行的图像,linux仅开辟了起始地址为0x7000_0000,偏移为10MB的内存空间,导致图像异常。
由于赛灵思提供的Array2Mat函数不符合实际项目要求,修改库函数。使用时一定要注意访问DDR的地址要连续或者部分连续,以便使HLS综合时能使AXI总线为突发模式,否则会造成读写速度很慢。
如果确实无法保证地址连续,可以采用修改#pragma INTERFACE指令中latency参数、num_read_outstanding参数和num_write_outstanding参数的方式,尽可能加速内存访问。
可以参考UG1399,获取详细信息。
造成这种情况的可能原因:
1、用m_axi接口时,未定义depth。定义depth后正常。
#pragma HLS INTERFACE mode=m_axi bundle=gmem0 depth=16384 port=image_in
注意,上面指令语句中,若关键字存在拼写错误。比如mode/bundle拼写错误,也会导致此问题。
2、testbench中调用HLS IP 功能函数时,数据类型定义错误,也有可能报错
3、HLS IP 功能函数在某些情况下,没有添加“#pragma HLS DATAFLOW”指令,也有能出现此问题。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。