并行块
并行块由关键字fork-join声明,主要特点:
- 并行块内的语句并发执行;
- 语句执行的顺序是由各自的语句内延迟或事件控制决定的;
- 语句中的延迟或事件控制是相对于块语句开始执行的时刻而言的。
注:(1)并行块中的语句同时开始执行,语句之间的先后顺序是无关紧要的;
(2)并行块内仿真0时刻开始执行,但实际的执行顺序是未知的;
(3)在使用并行块时需要注意,如果两条语句在同一时刻对同一个变量产生影响,那么将会引起隐含的竞争,这种情况是需要避免的。
程序
module exa0510(
x,y,z,w
);
input x;
input y;
output z;
output w;
reg [1:0]z;
reg [1:0]w;
always @(*) begin
z={x,y};
w={y,x};
end
endmodule
仿真程序
module tb();
reg x;
reg y;
wire z;
wire w;
exa0510 uut(
.x (x),
.y (y),
.w (a),
.z (b)
);
initial//并块1
fork
x=1'b0;
y=1'b1;
join
initial//并行块2
fork
#5 x=1'b1;
y=1'b0;
join
initial//并行块3
fork
#10 x=1'b0;
#15 y=1'b1;
join
endmodule
仿真结果分析
(1)并行块1与并行块2存在隐含的竞争,所以y值是不知道结果是什么的,只是可以从仿真的结果看出在0仿真时刻y=0。
(2)在并行块3中可以看出并行块的特点,并发执行,时间也符合设置时间。
可以与顺序块进行对比