在做芯片设计写硬件描述语言时,对于初学者必然面对的一个问题是,该如何使用阻塞赋值和非阻塞赋值。对于个问题,首先要理解什么是阻塞赋值?什么是非阻塞赋值?
阻塞赋值
从形式上来看,阻塞赋值用等号(=)表示。从字面意思上来看,赋值时被阻塞了。比如a=b,意思是把b值赋给a,从表达上来看a永远和b的值是相等的。但是如果b是一个表达式,比如b=c+d+e,或者其他复杂表达形式,那么要想让b值赋到a上,那么b必须完成c+d+e计算。那么这样a被赋值是有一个阻塞的过程。
非阻塞赋值
从形式上来看,非阻塞赋值用小于等于号(<=)表示。同样从字面意思上来看,赋值过程是没有阻塞的。为什么没有阻塞呢?因为非阻塞赋值用于时序电路,综合出来的是寄存器。对于a<=b,可以看作2个过程(1)在赋值开始时,计算非阻塞赋值b;(2)在赋值结束时,把a更新为b。
实际使用
在实际使用中,对于可综合电路,只要记住一点,组合电路要使用阻塞赋值,时序电路使用非阻塞赋值。
对于组合电路,需要注意,1.always块的触发条件要写全,或者用always @(*);2. always块中的if else要匹配全。只有if 而没有else与其匹配。或者if ... else if ... 没有else了。