如何写出让同事无法维护的Verilog代码?
对,你没看错,本文就是教你怎么写出让同事无法维护的代码。
命名用拼音
让他Google翻译也不知道这个单词是什么意思,(怎么可能有人定义信号用拼音,对,我见过),这只是先跟他开个玩笑,重点在后面。
assign语句尽量要写的长
assign flag = data_vld && mode_sel && enable_flag && (data_num[3:0] > 4'd7) && (ram_addr[4:0] > 4'd15) && ((cur_state != STATE_A) && (next_state == STATE_A))
|| ((cur_state != STATE_B) && (next_state == STATE_B));
类似于这样,相信我,他看代码的时候,收集覆盖率的时候都会哭的。
if里面的条件尽量写长些,else-if的分支尽量写多些
always @(*)begin
if(data_vld && mode_sel && enable_flag && (data_num[3:0] > 4'd7) && (ram_addr[4:0] > 4'd15) && ...)
else if(enable_flag && (data_num[3:0] > 4'd7) && (ram_addr[4:0] > 4'd15))...
...
效果同上
计数器不清零
在不容易被发现的计数器的部分,别给这个计数器清零,让他自己上溢,然后再从0开始计数,这样还可以在满足功能的情况下通过很多case,甚至可能到最后都不会验出错。但是冷不丁的什么时候出现问题,惊出他一身冷汗。
状态机命名没有含义
最简单的方法是,S0,S1,S2,S3。直接让他懵逼
高级一点的方法是,CAL_PRE,代表计算前一个状态,最后在这个状态把所有的计算都一干。
NORM、PROC,这两个状态本来是连续跳转的,但在NORM状态啥都别干,空等一拍出来,然后在PROC状态把NORM和PROC状态的事情通通干掉,直接让他两眼瞪直。
计数器等于常数比较判断
状态机跳转出来的使能条件为把一个计数器计数到一个固定值,比如cnt == 147,状态机跳出当前状态,相信我如果没有记录,最后不光他忘了,你也会忘记这个数是什么意思。
信号命名尽量相似
a_size,a_size_num,a_norm_size,a_special_size
cnt1,cnt2,cnt3,谁知道这几个cnt分别是干嘛的
这样一套组合拳,直接把他打趴。
制造X态不传播假象
assign data_out[5:0] = ({6{data_vld0}} & data0[5:0])
| ({6{data_vld1}} & data1[5:0]);
always @(*)begin
if(data_vld0)
data_out[5:0] = data0[5:0];
else if(data_vld1)
data_out[5:0] = data1[5:0];
else
data_out[5:0] = 6'd0;
end
第一种写法,如果data_vld0是X态,会在仿真的时候直接暴露出来,但是换第二种写法,就不一定了。是因为if-else和case不能传播不定态,有的EDA工具有X态传播选项,可以强行传播,一般也需要license,但并不是所有的EDA工具都有这个功能。所以,如果深谙这样的操作,甚至可以直接把芯片搞废,让他直接原地爆炸。
打补丁,补丁套补丁
调试代码的过程中遇到棘手的bug,反复修改了多次问题都无法收敛,千万别想着重写,采用打补丁的方式,补丁套补丁,补丁的代码甚至要多过原代码,这样他才无法继续维护。
设计文档描述
设计文档描述关键的地方一笔带过,尽量别详细。
总之
总之,我们的口号是—— *Write Everywhere, Read Nowhere*
最后
感谢那些给我们留下填不完的坑的前同事,因为有了你们我们才更加顽强!
评论区支持盖楼了,关于这个坑你还有什么好的方法挖出来的,欢迎评论区留言。