人人都知道文如其人,这里的“文”对程序员来说指的就是代码,从一段代码源文件能看出很多问题,比如:
1)此人所在公司版本管理是否规范,是否有统一的代码风格。
如果一个公司没有统一的代码规范,则一个大的项目基本无法维护,无法继承,往往代码的编写者离职后,继承者需要花费大量的时间来理解,甚至无法理解。连成熟的、可复用的模块都没有,谈何效率?谈何经验积累?如果作为甲方,找这样的公司作为乙方你放心吗?
2)代码作者对HDL语言的理解程度。
笔者见过很多很多人的HDL代码,还像写C语言一样编程,像下面代码片段:
always @ (posedge clk or posedge rst)beginif (rst)begin command <= command_idle; address <= 12'b0; data_to_bu61580 <= 16'h0; state <= 6'h0; state_1 <= 6'h0; rx_rd_cnt <= 0; command_word <= 16'h0; cmd_stk_pt_reg <= 16'h0; upload_cnt <= 0; int_status <= 16'h0; data_pointer <= 16'h0; DSP_INT6 <= 0; dsp_int_cnt <= 0; // chip scope trigger signals // end else if (~int_n & ~bus_to_bu_occupied_by_sar)begin case (state) 0:begin//set busy bit rx_rd_cnt <= 0; //serve_done <= 0; upload_cnt <= 0; state <= 6'h1; state_1 <= 6'h0;///// end case(state_1) 0: begin command <= write_reg; address <= config_reg1_addr; data_to_bu61580 <= 16'h8f80; // set busy bit in REG #1 if(command_ack == 1) begin command <= command_idle; state_1 <= 6'h1; end else state_1 <= 6'h0; end 1: begin if(wr_rd_state == wr_rd_idle) begin state_1 <= 6'h0; state <= 6'h1; end else state_1 <= 6'h1; end default:state_1 <= 6'h0; endcase end<span style="font-family:'sans serif', tahoma, verdana, helvetica;font-size:14px;line-height:1.5;"> </span>
上面的代码,交给你维护,你愿意吗?为什么这段代码不好?首先,阻塞赋值和非阻塞赋值的概念不清楚,按照顺序语句在编程;其次,不理解“不完整的if/case语句会引入不必要的锁存器或触发器”,浪费资源不说,时序的概念基本没有,还可以肯定的是STA肯定没做;再次,位宽不匹配,虽然这一点没有严格要求,但看着综合器给出的上十个警告,不心烦吗?!!!
像下面这段片段,是价值1W的一个源文件,你敢信?要不是有人出钱买了,反正我不信!看着那一排排的k、l、m、n及基本没有注释,是不是想哭了?
always @(posedge clk_hdlc or negedge reset)if(!reset) begin state<=0; data_s<=1; count_byte<=0; k<=0; l<=0; m<=0; n<=0; count_d<=0; clk_rd<=0; buff[4:0]<=0; empty<=0; crc_en<=0; i<=0; j<=0; end
代码风格各个公司各有各自的规定,但是一条基本原则要满足:代码是给人看的!完成功能的同时,做不到赏心悦目,但至少要有人看得懂吧!