对于IT相关从业人员来说,看别人代码是必不可少的磨难。在学习阶段,我们经常需要从书上看别人的代码以吸取宝贵经验,这是相当枯燥无趣的过程,也时常无法领会作者的意图。在实际工作中,不可避免的出现需要接手做到一半的项目或是团队合作的项目,这时候就必须看以前的工程师的代码。如果说看书上的代码用痛苦来形容的话,那么这种情况时遇到代码不够规范或者设计不合理,简直就是苦不堪言。还有一些神一般的选手,设计者在编写代码时的“灵机一动”,其结果只有他自己和上帝才看得懂。这些代码能看得你觉得生不如死,甚至开始怀疑人生:到底是代码写得混乱or我水平不行?!你以为这是最痛苦的吗?NO!还有一种情况足以令你看得生不如死,甚至开始怀疑人生。那就是遇到运行不正常的代码,对问题排查错误花的时间和精力还不如重新写一遍,这时你的内心完全是崩溃的! 有一件事非常无奈,我们不可能要求别人的代码都非常规范。所以,正确的学习方法和思维方式尤为重要。怎样看他人代码才是正确的方式?看代码之前应该做些什么准备工作?看代码用正向思维还是逆向思维?如何判断代码中哪些地方是否值得借鉴?由此,掌握到一种通用的去看懂别人代码的技巧显得非常重要。下面我们就来谈谈这方面。 我们知道,实现功能可能有很多种方法,所以不同的人写出的代码不相同。通过看代码去知道它要实现的是什么功能是一件很困难的事情。有些初学者会想到采取 仿真一下、看 电路图、流程图、时序图、注释等等方法,都是不可取的,通过这些你还是无法知道它的功能,以及有没有错误。 那么正确的方法是什么呢?我们采取一种可称之为“反推法”或是“逆向法”的方式,这个问题就迎刃而解了。要知道,代码的目的是实现功能。无论你用那种代码,有一点完全相同的就是“实现功能”这个最终结果。了解到这一点,我们就可以通过结果(功能)去反推过程(代码),代码的思路、流程、用途就抽丝剥茧清晰的显露出来。好的,下面我们举个实例来说明怎么通过反推法有步骤的去看懂别人的代码。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 | //------------------------------------------- //帧率采样计算 reg fps_state; reg [7:0] fps_data; always@(posedge iCLK or negedge iRST_N) begin if(!iRST_N) begin fps_data <= 0; fps_state <= 0; CMOS_FPS_DATA <= 0; end else if(Frame_valid) begin case(fps_state) 0: begin CMOS_FPS_DATA <= CMOS_FPS_DATA; if(delay_2s == 0) begin fps_state <= 0; if(CMOS_VSYNC_over == 1'b1) //VS上升沿,1帧写入完毕 fps_data <= fps_data + 1'b1; end else fps_state <= 1; end 1: begin fps_state <= 0; fps_data <= 0; CMOS_FPS_DATA <= fps_data >>1; end endcase end else begin fps_data <= 0; fps_state <= 0; CMOS_FPS_DATA <= 0; end end endmodule |
详细分析见附件
|