原则3:用always块描述组合逻辑时,应采用阻塞赋值语句。
在Verilog中可以使用多种方法来描述组合逻辑,但是当用always块来描述组合逻辑时,应该用阻塞赋值。
如果always块中只有一条赋值语句,使用阻塞赋值或非阻塞赋值语句都可以。但是为了养成良好的编程习惯,应该尽量使用阻塞赋值语句来描述组合逻辑。
使用没有延时的非阻塞赋值可能导致仿真结果不对,有时需要在 always 块的入口附加敏感事件参数,才能使仿真正确,因而从仿真的时间效率角度看也不合算。
module ao4(a, b, c, d, y);
output y;
input a, b, c, d;
reg y, temp1, temp2;
always@(a or b or c or d) begin
temp1 <= a & b;
temp2 <= c & d;
y <= temp1 | temp2;
end
endmodule
module ao5(a, b, c, d, y);
output y;
input a, b, c, d;
reg y, temp1, temp2;
always@(a or b or c or d or temp1 or temp2) begin
temp1 <= a & b;
temp2 <= c & d;
y <= temp1 | temp2;
end
endmodule
2.2和2.1节相比,其唯一区别是:temp1和temp2加入了敏感列表中。如前所描述,当非阻塞赋值的LSH数值更新时,always块将自动触发并用最新计算出的temp1核temp2值更新输出y的值。
因此,将temp1和temp2加入到敏感列表后,现在输出y的值是正确的。
问题:
一个always块中有多次参数传递,由此降低了仿真器的性能,只有在没有其他合理方法的情况下才考虑这样做。
module ao2(a, b, c, d, y);
output y;
input a, b, c, d;
reg y, temp1, temp2;
always@(a or b or c or d) begin
temp1 = a & b;
temp2 = c & d;
y = temp1 | temp2;
end
endmodule
2.3与2.1小节的唯一区别是:用阻塞赋值替代了非阻塞赋值。这样做,既保证了仿真时经一次数据传递输出y的值是正确的,又提高了仿真效率。