186、NPU的编译器开发:形式化验证方法
NPU的编译器开发:形式化验证方法昨晚又熬到凌晨三点。盯着屏幕上那条诡异的指令调度错误,我几乎想把显示器砸了——NPU编译器生成的代码在仿真器上跑得好好的,一上FPGA就随机死机。这种问题最折磨人,因为它不是每次都复现,像幽灵一样飘在系统里。后来用形式化验证工具跑了一轮,十分钟就揪出了那个藏在循环展开逻辑里的边界条件错误。那一刻我就在想,如果早半年引入形式化方法,能少掉多少头发。那个让我失眠三天的bug先说说这个bug长什么样。我们的NPU有一个专用的数据搬运引擎,负责把外部DDR的数据搬到片上SRAM。编译器在生成搬运指令时,需要计算地址对齐和突发长度。代码逻辑大概是这样的:// 计算突发传输次数,这里踩过坑:burst_len必须是2的幂intcalc_burst_times(inttotal_size,intburst_len)