2.1 时序逻辑电路中,对寄存器用非阻塞赋值。
时序电路中使用非阻塞赋值可以有效消除竞争与冒险。
比如下面代码描述,由于无法确定 a 与 b 阻塞赋值的操作顺序,也就是实际延迟时间未知,就有可能带来竞争冒险。
always @(posedge clk)
begin
a = b ;
//阻塞赋值,关键词“ = ”
b = a ;
//阻塞赋值,关键词“ = ”
end
如果使用非阻塞赋值,两个赋值操作是同时进行的,因此就不会带来竞争冒险。例:
always @(posedge clk) begin
a <= b ;
//非阻塞赋值,关键词“ <= ”
b <= a ;
//非阻塞赋值,关键词“ <= ”
end
2.2 组合逻辑电路中,对寄存器用阻塞赋值。
设计实现 C = A&B, F=C&D 的组合逻辑功能,也就是 F= A&B&D,用非阻塞赋值语句设计如下。
always @(*)
begin
C <= A & B ; //非阻塞赋值,关键词“ <= ”
F <= C & D ; //非阻塞赋值,关键词“ <= ”
end
两条赋值语句同时赋值,F <= C & D 中使用的是信号 C 的旧值,因此导致此时的逻辑是错误的,F 的逻辑值不等于 A&B&D。
而且,此时要求信号 C 具有存储功能,但不是时钟驱动,所以 C 可能会被综合成锁存器(latch),导致竞争冒险。
对代码进行如下修改,F = C & D 的操作一定是在 C = A & B 之后,此时 F 的逻辑值等于 A&B&D,符合设计。
always @(*)
begin
C = A & B ; //阻塞赋值,关键词“ = ”
F = C & D ; //阻塞赋值,关键词“ = ”
end