
在学习Verilog HDL语言的过程中,三种常用赋值语句常常引起学习者的困惑。其中,“=”左边是wire类型,可在定义时用“assign”连续赋值语句,例如:wire[7:0] a; input[7:0] c,d; assign a=c+d; 这样,在后面的程序中可以直接使用a来表示c+d的值,这对模块间的互联非常有用。
“=”是阻塞赋值语句,也称为串行语句,意味着所有该类赋值在所在模块内按顺序执行。例如,在一个if(ena)条件语句中,a=b; a=c; c=d; 这样的语句将按顺序执行。假设在执行前a=0,b=1,c=1,d=0,则可以这样理解执行顺序和结果:首先执行a=b,得到a=0;然后执行a=c,得到a=1;最后执行c=d,得到c=0。当该条件语句执行完时,最终得到a=1,c=0。
而“<=”是非阻塞赋值语句,相当于并行语句,当该语句所在模块结束时,所有带“<=”的语句同时执行。例如:if(ena) begin a<=c; a=b; c=d; end 若执行前,a=0,b=1,c=1,d=0,那么在条件语句执行完时,所有带“<=”的语句同时执行,得到a=c=1,c=d=0。这与阻塞赋值语句执行顺序不同,非阻塞赋值语句会在该模块执行结束时同时更新。
理解这些赋值语句的区别和用法,对编写高效、正确的Verilog代码至关重要。正确使用这些语句,可以避免许多潜在的错误,提高代码的可读性和可维护性。