标签:
学习公社 |
Verilog代码编写过程中容易出现的几个问题
通过几次的讲课,公司的各位员工对Verilog Coding Style有了一定的了解和掌握,但最近一些时间,我还是发现了一些编码过程中的共性问题。这些问题的存在,虽然看似简单,但直接导致设计中出现综合前后模拟验证结果不一致的问题,即Modelsim或者其他软件模拟工具的Simulation结果与综合后的模拟结果、FPGA仿真验证结果的不一致。
具体总结下来,分为下述几个问题,请各位参照解决为盼。
1、
描述要点:
·if…else …及其嵌套结构中必须做到if 和 else的配对,即:
if
else if (exp2) Stm2;
else if (exp3) Stm3;
………..
else
else
其中Stm1、Stm2…….、Stmn、Stm是一个或者一组描述语句序列。
·一个变量在一个分支中被赋值,则其在其他分支中必须被赋值;
·为了保证设计的正确性,最好在“if…else …及其嵌套结构中的多变量赋值”情形前面,对各个被赋值的变量设置一个初值。
2、
描述要点:
l
l
l
如果设计中前面的要求不能够满足,就会产生不必要的Latch;
3、
这种情况最容易出问题,很容易被忽视的。
描述要点:
1、2点所述的必须遵循。
事例:
下面的语句块中,是“case、if…else…嵌套结构中多变量赋值情形”,变量B、C1、D1在各个分支中被赋值,并且在case语句块中,存在语句“{B, C1,D1} = 初值;”,看起来问题不大,其实不然。
{B, C1,D1} = 初值;
case (sel)
3’b000:
end
3’b101:
begin
C1 = A +D;
if (C1 > 200)
end
default:
endcase
需要做下述改动,以便设计正确:
{B, C1,D1} = 初值;
case (sel)
3’b000:
end
3’b101:
begin
C1 = A +D;
必须增加一条语句对C1<=200的情形进行处理,如:
if (C1 > 200)
end
default:
endcase
4、
很多硬件设计人员,并不了解如下述情形的“连续的if语句对单个变量赋值的情形”所隐含的硬件结构:
………
if
if
if (exp3)
if
其他语句结构
其实,上述描述中,
if
if
if (exp3)
if
等价于描述语句
if (exp4)
else if (exp3) A = expC;
else if (exp2) A = expB;
else if (exp1) A = expA;
其对应的硬件是级联的二选一开关结构。
这就可以看出,在“连续的if语句对单个变量赋值的情形”中,不可能对应于多选一开关结构的。
在描述过程中,必须在“连续的if语句对单个变量赋值的情形”前面,对被赋值的单个变量赋初值。否则就会产生不必要的Latch,导致问题的。
5、
描述要点:绝对禁止出现这种情形!!!!
6、
大部分的硬件设计工程师为了图方便,把时序逻辑、尤其是Data Path逻辑结构统一放在一个时序描述语句块加以描述,看起来很省事,很舒服的感觉,但是这种描述习惯直接会导致设计中存在下述隐患。
1)
2)
7、
组合逻辑描述中always语句块的敏感表不全,直接导致下述问题:
1)
2)
注意:Modelsim是一个很弱的工具,所以通过了Modelsim的验证,不能够保证设计中就没有问题,只能说是“还未发现设计问题”。
时序逻辑的敏感表不全,直接导致下述问题:
1)
时序逻辑描述中出现敏感表中的信号多了,这个问题比较容易发现的。
8、
1)
2)
3)
4)
5)