阻塞语句 =

阻塞语句 = 必须在顺序块中跟随其后的语句执行之前执行。

在下面的示例中,第一时间要执行的语句是 a = b

1
2
3
┃ a = b;
┃ out_d = 0;
▼ {carry, sum} = in + sum_in;

非阻塞语句 <=

非阻塞语句 <= 使您可以调度作业而不会阻塞过程流。

每当您想在同一时间步内进行多个寄存器分配而无需考虑顺序或相互依赖性时,都可以使用非阻塞过程语句。

这意味着非阻塞语句比阻塞分配更类似于实际硬件。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
module block_nonblock();
reg a, b, c, d , e, f ;

// 阻塞赋值
initial begin
a = #10 1'b1; // 模拟时,模拟器将在 10 时刻把 1 赋给 a
b = #20 1'b0; // 模拟时,模拟器将在 30 时刻把 0 赋给 b
c = #40 1'b1; // 模拟时,模拟器将在 70 时刻把 1 赋给 c
end

// 非阻塞赋值
initial begin
d <= #10 1'b1; // 模拟时,模拟器将在 10 时刻把 1 赋给 a
e <= #20 1'b0; // 模拟时,模拟器将在 20 时刻把 1 赋给 b
f <= #40 1'b1; // 模拟时,模拟器将在 40 时刻把 1 赋给 c
end

endmodule

例子 - 阻塞

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
module blocking (clk,a,c);
input clk;
input a;
output c;

wire clk;
wire a;
reg c;
reg b;

always @ (posedge clk ) begin
b = a;
c = b;
end

endmodule

综合后的输出

综合后的输出

例子 - 非阻塞

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
module nonblocking (clk,a,c);
input clk;
input a;
output c;

wire clk;
wire a;
reg c;
reg b;

always @ (posedge clk ) begin
b <= a;
c <= b;
end

endmodule

综合后的输出

综合后的输出

原文

http://www.asic-world.com/tidbits/blocking.html