阻塞赋值是一种在Verilog或VHDL设计语言中,用于描述组合逻辑电路的赋值方式。与非阻塞赋值(non-blocking assignment)不同,阻塞赋值(blocking assignment)意味着按照赋值语句的顺序,一个语句执行完后再执行下一个语句。
在代码中阻塞赋值通常用"="表示,如 a = b + c; 就是一个典型的阻塞赋值语句。而非阻塞赋值则使用"<<=
"表示,例如 a <<= 1;。
在Verilog或VHDL中,用阻塞赋值实现的代码比用非阻塞赋值实现的代码更容易理解和调试,但是阻塞赋值在电路运行时需要消耗更多的时间和资源,影响电路的速度。因此,一般情况下,阻塞赋值和非阻塞赋值都会被用到,需要根据具体情况选择。
举个例子,下面两个语句:
a = b + c;d <<= 1;
使用阻塞赋值实现时,当第一个语句执行时,a变量会被直接赋值为b+c的结果,然后在执行完该语句后,再去执行第二个语句,将d变量左移一位。而非阻塞赋值则会同时执行这两个语句。
阻塞赋值通常用于组合逻辑电路中。在时序逻辑电路中,非阻塞赋值更为常见,因为在时序电路中,各个时钟周期中的信号值需要保持一致,采用非阻塞赋值能够更好地实现这种功能。
在大型Verilog门级电路描述时,经常会使用连续赋值(continuous assignment)的语法实现寄存器和门级电路的组合。连续赋值类似于一种特殊的非阻塞赋值,在门级电路的描述中较为常用。
在编写硬件描述语言(HDL)代码时,阻塞赋值和非阻塞赋值都有其作用和用处,需要在不同的情况下进行选择。简单来说,阻塞赋值适用于在模块内部处理各种数据,并保证数据按代码编写的顺序进行处理。非阻塞赋值通常适用于其它需要同步处理时间的情况。
总的来说,对于刚开始做电路设计的同学,阻塞赋值更容易理解和掌握。而高级设计人员在实际设计中,一般都是两种赋值都要用到,需要根据自己的经验和实际情况选择。