当前位置:   article > 正文

【随时更新】vitis HLS使用问题总结记录_vitis hls 仿真的时间准吗

vitis hls 仿真的时间准吗

一、C/RTL 联合仿真SIGSEGV错误

        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")。

 二、HLS处理中的数据对齐问题

        1、地址对齐问题,当采用AXI总线宽度为128bits读取PS侧DDR数据时,需要保证数组数据首地址为16字节对齐(16*8 =128bits)。主要是因为访问DDR时,数据是按照16字节读取,且DDR地址永远为16的整数倍。(可以使用ILA抓取数据观察验证,可以看到地址是按照16的整数倍变化的)。

        2、数据对齐问题,赛灵思图像库函数要求图像的列数为NPPC的整数倍。假如NPPC=8,即每个时钟处理8个像素,则图像列数需要为8的整数倍。

三、vitis HLS中仿真结果和联合仿真结果均正确,但是在板上测试图像结果不正确,且图像下半部分疑似重复上半部分的图像内容。

    最终发现,是linux开辟的存储图像的空间不够。比如10000*2000行的图像,linux仅开辟了起始地址为0x7000_0000,偏移为10MB的内存空间,导致图像异常。

 四、AXI总线突发问题

        由于赛灵思提供的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”指令,也有能出现此问题。

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop】
推荐阅读
相关标签
  

闽ICP备14008679号