加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

Verilog代码编写过程中容易出现的几个问题

(2007-10-30 19:50:13)
标签:

学习公社

Verilog代码编写过程中容易出现的几个问题

 

通过几次的讲课,公司的各位员工对Verilog Coding Style有了一定的了解和掌握,但最近一些时间,我还是发现了一些编码过程中的共性问题。这些问题的存在,虽然看似简单,但直接导致设计中出现综合前后模拟验证结果不一致的问题,即Modelsim或者其他软件模拟工具的Simulation结果与综合后的模拟结果、FPGA仿真验证结果的不一致。

具体总结下来,分为下述几个问题,请各位参照解决为盼。

 

1、    if…else …及其嵌套结构中的多变量赋值情形

描述要点:

·if…else …及其嵌套结构中必须做到if 和 else的配对,即:

if  (exp1)  Stm1;

else if (exp2) Stm2;

else if (exp3) Stm3;

………..

else  if (expn) Stmn;

else  Stm;

其中Stm1、Stm2…….、Stmn、Stm是一个或者一组描述语句序列。

·一个变量在一个分支中被赋值,则其在其他分支中必须被赋值;

·为了保证设计的正确性,最好在“if…else …及其嵌套结构中的多变量赋值”情形前面,对各个被赋值的变量设置一个初值。

    如果设计中前面的要求不能够满足,就会产生不必要的Latch;

 

2、    case结构中多变量赋值情形

描述要点:

        必须有default分支的描述;

        一个变量在一个case分支中被赋值,则其在其他case分支中必须被赋值;

        为了保证设计的正确性,最好在“case结构中多变量赋值情形”的前面一条语句,增加一条或多条赋值语句,对case结构中被赋值的多个变量设置初值。

如果设计中前面的要求不能够满足,就会产生不必要的Latch;

 

3、    case、if…else…及if…else、case嵌套结构中多变量赋值情形

这种情况最容易出问题,很容易被忽视的。

描述要点:

1、2点所述的必须遵循。

事例:

下面的语句块中,是“case、if…else…嵌套结构中多变量赋值情形”,变量B、C1、D1在各个分支中被赋值,并且在case语句块中,存在语句“{B, C1,D1} = 初值;”,看起来问题不大,其实不然。

 

{B, C1,D1} = 初值;

case (sel)

3’b000:  begin

         B = A +C;

         if (B > 100)

            begin

              C1 = exp1;

              D1 = exp2;

            end

end

3’b101:

begin

C1 = A +D;

if (C1 > 200)

   begin

     D1 = exp3;

     B = exp4;

   end

end

default:

    begin

     B = 16’b0;

     D1= 0;

     C1 = 0;

    end

endcase

 

需要做下述改动,以便设计正确:

{B, C1,D1} = 初值;

case (sel)

3’b000:  begin

         B = A +C;

         必须增加一条语句对B<=100的情形进行处理,如:

         { C1,D1} = C1、D1初值;

         if (B > 100)

            begin

              C1 = exp1;

              D1 = exp2;

            end

end

3’b101:

begin

C1 = A +D;

必须增加一条语句对C1<=200的情形进行处理,如:

         { D1, B} =  D1、B初值;

if (C1 > 200)

   begin

     D1 = exp3;

     B = exp4;

   end

end

default:

    begin

     B = 16’b0;

     D1= 0;

     C1 = 0;

    End

endcase

 

 

 

4、    连续的if语句对单个变量赋值的情形

很多硬件设计人员,并不了解如下述情形的“连续的if语句对单个变量赋值的情形”所隐含的硬件结构:

………

if  (exp1)  A = expA;

if  (exp2)  = expB ;

if (exp3)    A = expC;

if  (exp4)   A = expD;

其他语句结构

其实,上述描述中,

if  (exp1)  A = expA;

if  (exp2)  = expB ;

if (exp3)    A = expC;

if  (exp4)   A = expD;

等价于描述语句

if (exp4)  A =expD;

else if (exp3) A = expC;

else if (exp2) A = expB;

else if (exp1) A = expA;

其对应的硬件是级联的二选一开关结构。

这就可以看出,在“连续的if语句对单个变量赋值的情形”中,不可能对应于多选一开关结构的。

在描述过程中,必须在“连续的if语句对单个变量赋值的情形”前面,对被赋值的单个变量赋初值。否则就会产生不必要的Latch,导致问题的。

 

5、    单个变量在多个always语句块中被赋值的情形

描述要点:绝对禁止出现这种情形!!!!

 

 

6、    不好的时序逻辑描述习惯问题

大部分的硬件设计工程师为了图方便,把时序逻辑、尤其是Data Path逻辑结构统一放在一个时序描述语句块加以描述,看起来很省事,很舒服的感觉,但是这种描述习惯直接会导致设计中存在下述隐患。

1)    综合结果不会很优化,难以充分利用综合工具得到最优化的结果;

2)    隐含的Latch很难探查;因为前面的问题还可以通过Synopsys的综合工具报告出来的,这种问题很难报告。

 

7、    always语句块中的敏感表问题

组合逻辑描述中always语句块的敏感表不全,直接导致下述问题:

1)    综合前后的模拟结果不一致;

2)    在ModelSim通过的模拟验证,在使用其他模拟工具就不对了;

注意:Modelsim是一个很弱的工具,所以通过了Modelsim的验证,不能够保证设计中就没有问题,只能说是“还未发现设计问题”。

时序逻辑的敏感表不全,直接导致下述问题:

1)  异步复位变成了同步复位,这是一个严重的问题,这个问题的出现一般很难通过一般的软件模拟或者硬件FPGA仿真发现,但这个问题确实存在,大家一定要注意!!!

时序逻辑描述中出现敏感表中的信号多了,这个问题比较容易发现的。

 

 

8、    结构设计问题

   这是我一再强调的一个问题,现在大家在设计最容易急躁,硬件设计结构还没有出来或者还没有理清思路,就马上写代码,结果很辛苦把Verilog代码写好了,也验证通过了,一旦综合,发现硬件代价很高,设计根本无法使用的。

   建议:遇到设计描述问题,先搞清楚实现结构,并对结构进行优化,至少要做到以下几点:

1)  针对算法,确定算法实现的硬件结构;

2)  画出硬件结构的数据通路结构及控制通路中产生数据通路控制、选择信号的FSM结构;

3)  对数据通路、控制通路结构作优化,尽量实现硬件共享、降低设计中所需要使用的RAM、ROM;尽量将设计中存在的大容量的触发器结构变成RAM结构;

4)  在数据通路、控制通路结构图上,能够对算法所实现的各个功能进行验证;

5)  输出设计文档。

0

阅读 收藏 喜欢 打印举报/Report
前一篇:Debussy
后一篇:晶圆是什么
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有