作者:龚黎明
链接:https://www.zhihu.com/question/22508677/answer/171948755
来源:知乎
最近项目逼紧,老同事有一个bug始终解决不了,拖了半个月了,老大就把我给派过去协助。
我们做的是用C语言生成硬件代码(更低层的verilog,verilog是一门硬件编程语言),懂这个的知道这个叫做HLS开发(高层次综合)。
HLS算得上是比较新的东西,因为传统上设计硬件,都是直接coding 硬件设计代码。几十年都是如此,直到最近几年HLS开始慢慢有了应用。
他那段代码并不是很复杂,总共30多行,我反复阅读了代码,逻辑功能没有问题,仿真也没有问题。纯C语言仿真可以实现想要的功能。
综合成底层的verilog代码的过程中也没有报错。
但是综合得到的verilog代码,跟C代码的功能却不一致。
也就是说工具并没有成功的从C语言转换到我们需要的verilog语言。
我们初步断定是coding style的问题,因为HLS对C语言的写法有要求,如果写的不好,要不综合得到的硬件性能不好面积太大,还有可能综合的不对。
因为肉眼看不出来,所以暴力的方法,就是重新写一个。换一种写法,说不定运气好能过。
所以我试了另外一种写法,用了一种高级的数据类型,代码只有10行。
综合结果也不对。
我把其中的部分代码一行一行删掉,最后只剩下4行,终于对了。
所以我判定另外6行有问题。
我对另外6行再次改写,把一些常变量换成固定数值,发现固定数值就没有问题。
看到了一点曙光。
于是我开始怀疑是一个常量的数据类型错了。
原代码里面常量采用了constant int的类型,当我将其改成ac_int<32,true>的时候,终于对了。
所以你看,我们搞了一个星期,到最后发现就是一个变量类型定义不对。
总代码数非常少,也就是十几行,修改的地方也就几个字符。
但是为了得到这个结果,我们试了十几种方法,换了各种各样的coding style。
编程难的地方的就是这里。写的时候很爽,觉得自己思路清晰,写完了,全是bug。
bug多了,就觉得没意思了。
现在的编程,说是高级语言,其实还是人在理解机器。
为什么Class复制之后只是指针复制了?别的变量复制之后整体都被复制了?
这些都是为了机器的方便,为了少点开销,对人只会造成混淆。
机器不具有容错能力,机器一遇到bug只会撒手,说白了还是我们的机器不行。
我们仍然处于编程历史的初级阶段。