Felix

技术源于积累,成功始于执着!

关于在同一个always块中对同一个变量赋值的讨论

2
阅读(112) 评论(0)

首先感谢某FPGA讨论群(123035845)的大佬(ID:~尼奥~,277075738)批评指正!

为什么写这边文章呢?一来是总结一下收获,与大家分享;二来是向给我指正的大佬致敬。

好了,下面计入正题,首先是有一个群友提出了一个问题,如下图:

QQ图片20171204124523.png

图中的意思是,第一段的代码存在问题(不规范),建议改写为第二段代码。正好我前一段时间看了一本书(不过书有点老了,九几年的,应该是基于Verilog-95标准的),书中也提到了不予许这样写(不过,遗憾地是一时想不起来是哪本书了);还有就是之前看过的某个公司的Verilog Coding规范,该规范中也明确提出了,不允许在一个顺序块中对同一个reg进行非阻塞赋值。

然后,……,哈哈哈,我就一直认为这种写法是有问题的,甚至异想天开地想到PAR和亚稳态去了,惭愧!不过,还好有群内大佬及时指正,哈哈哈

俗话说,实践出真知。那么我们今天就来仔细地验证和讨论一下。开始之前,首先提出几个问题:

  • 第一,如果是按照第一种写法,综合工具是否会报错,或者是是否会有警告信息?

  • 第二,以上的两种写法综合结果是否完全一致?

  • 第三,如果在第一段程序中的两条语句后面,再次对q赋值,如q <= {q[1:0],ai,q[3]};或是什么结果?

  • 第四,如果是阻塞赋值呢?

下面来依次验证这些问题,我们选用目前FPGA开发中,应用最为广泛的Synopsys的Synplify Pro(版本为2016.09)最为本次的验证工具。综合结果如下:

1.png

注:因为两者结果完全一致,所以只贴了一张图。

经验证,采用以上两种设计获得结果完全一致,且并无错误或警告产生,甚至连提示信息都没有,也就是说,从语法的角度来说,以上两种写法完全一致。

那么对于第三个问题呢?我们知道,同步设计中的非阻塞赋值实际上是同步执行的(从语法上是这样的),但是综合之后的结果为:

2.png

也就是说,只有q <= {q[1:0],ai,q[3]};生效了,而前面的两句(q <= q << 1; q[0] <= ai;)并未在综合结果中有所体现。重点是,Synplify Pro并未给出任何的错误或者警告,甚至连相关信息都没有!结论显然是,这种情况下,目前的综合工具会用后面的逻辑之前覆盖前面的逻辑!

注:实际上在IEEE Verilog规范中也明确说明了,此种情况下后面的逻辑会覆盖前面的逻辑!详见本文最后的参考阅读 IEEE Std 1364-2005_Verilog.pdf 的11.4.1 Determinism章节!

印象中,之前的那本书里,关于这个问题的说法是,有的综合工具会报错,因为其认为这样的语法是不正确的;有的综合工具不会报错,但是综合得到的结果可能与预期的不一致(如,上面的结果所示)。

为了进一步验证猜想,再采用LSE对同样的代码综合一遍,获得的结果为:

3.png

这个结果显然更加离谱。

关于对上面的三个问题的验证也解释了,为什么有的公司会在编程规范里面禁止使用这种写法了。对于特定的例子(如本文开始提出的问题,即第一张图),这种写法(在一个顺序块中对同一个reg进行非阻塞赋值)没有问题,但是我们还是不建议这样写。一方面是,这样写可能会有潜在的问题;另外一方面是,这样写的代码不是很清晰明了,不便于他人阅读。更为重要的一点是,如果你这样写了,综合工具不会给你任何的提示!error,warning,information都没有!一旦发生问题,非常不利于debug。比如:

4.png

假设这是一个其他人设计的Code,我拿到之后(假设代码较长,还没有来得及透彻地弄明白),因为需要插入了红色框框中的代码,然后综合之后,出问题了……

当然,也不是说一定不能这样用,如果在特定的条件下,的确需要这样使用,且设计者明白其中的潜在问题,自然可以这么写,只是设计者有职责详细的注释一下这段代码。

好了,再回到开始的第四个问题上,假设是阻塞赋值呢?再开始验证这个问题之前,需要明白另一个规范(注意是很多公司自己的规范,而不是IEEE Verilog的语法规范),时序逻辑中均采用非阻塞赋值,且不允许在同一个always块中,同时采用阻塞赋值和非阻塞赋值。

注:如果是对一个reg同时进行阻塞赋值和非阻塞赋值,则是一个语法错误,使用Synplify Pro也综合时会报错。

修改为阻塞赋值之后的代码如下:

6.png

这个视乎很好理解,阻塞赋值嘛,肯定是一条一条地一次执行了,但是不要忘了另外一个潜在的问题:组合路径环!所以以上程序综合出来的结果,肯定是存在问题的……

注:关于组合路径环,可以参考一下我前几天推荐的那本书:

http://blog.chinaaet.com/justlxy/p/5100052625


参考阅读:

Nonblocking Assignments in Verilog Synthesis, Coding Styles That Kill! .pdf

Verilog HDL Coding(Freescale).pdf

IEEE Std 1364-2005_Verilog.pdf