写在前面:冲冲冲
Verilog典型的并发语句集合
- initial语句:在整个仿真时间内只执行一次, initial语句都是并发的
- always语句:可以对组合电路和时序电路进行建模, always语句都是并发的
- assign语句:可以对组合电路进行建模, assign语句都是并发的
- begin···end:语句从上往下,顺序执行
- fork···join:语句并行执行,与语句顺序无关
SV新增下列处理并发进程的能力
- fork…join并发结构
- 通过 mailbox实现进程间的通信
- 通过 semaphore实现进程互斥和仲栽。
- 通过 event实现进程之间的同步。
并发线程thread
- fork…join
◆当所有的子线程执行完成后,父线程才会继续执行
◆在fork…join语句块中,可以使用 begin…end语句块封装一个独立的线程,该线程中的所有语句从上往下顺序执行
-
fork… join_any
◆当 fork…join_any语句块中的任何个子线程完成之后,父线程继续执行
- fork…join_none
◆父线程与for语句块中的子线程是并行执行的
◆当父线程执行一个阻塞语句后,子线程才开始执行
实例:fork——join
//E课网
//fork_join_process.sv
module fork_join_process();
task automatic print_value;
input [7:0] value;
input [7:0] delay;
begin
#(delay) $display("@%g Passed Value %d Delay %d",$time,value,delay);
end
endtask:print_value
initial begin
fork
#1 print_value(10,7);
#1 print_value(8,5);
#1 print_value(4,2);
join
$display("@%g Came out of fork-join",$time);
#20 $finish;
end
endmodule
仿真结果:
@3 Passed Value 4 Delay 2
@6 Passed Value 8 Delay 5
@8 Passed Value 10 Delay 7
@8 Came out of fork-join
实例:fork-join_none
//E课网
//fork_join_any_process.sv
module fork_join_any_process();
task automatic print_value;
input [7:0] value;
input [7:0] delay;
begin
#(delay) $display("@%g Passed Value %d Delay %d",$time,value,delay);
end
endtask:print_value
initial begin
fork
#1 print_value(10,7);
#1 print_value(8,5);
#1 print_value(4,2);
join_any
$display("@%g Came out of fork-join_any",$time);
#20 $finish;
end
endmodule
仿真结果:
@3 Passed Value 4 Delay 2
@3 Came out of fork-join_any
@6 Passed Value 8 Delay 5
@8 Passed Value 10 Delay 7
并发线程控制
-
wait fork
◆等待所有的fork并发进程执行完成
◆在执行父线程之前,确保所有的fork并发子线程执行完成
◆等待所有的fork并发子线程全部执行完成
-
disable fork
◆停止fork所有并发子线程的执行
实例:fork_join_disable_process.sv
//E课网
//fork_join_disable_process.sv
module fork_join_disable_process();
task automatic print_value;
input [7:0] value;
input [7:0] delay;
begin
#(delay) $display("@%g Passed Value %d Delay %d",$time,value,delay);
end
endtask:print_value
initial begin
fork
#1 print_value(10,7);
#1 print_value(8,5);
#1 print_value(4,2);
join_any
$display("@%g Came out of fork-join_any",$time);
//terminate all the theads
disable fork;
$display("@%g All threads are disabled",$time);
#20 $finish;
end
endmodule
仿真结果如下:
@3 Passed Value 4 Delay 2
@3 Came out of fork-join_any
@3 All threads are disabled
实例:fork_join_wait_process.sv
//E课网
//fork_join_wait_process.sv
module fork_join_wait_process();
task automatic print_value;
input [7:0] value;
input [7:0] delay;
begin
#(delay) $display("@%g Passed Value %d Delay %d",$time,value,delay);
end
endtask:print_value
initial begin
fork
#1 print_value(10,7);
#1 print_value(8,5);
#1 print_value(4,2);
join_none
#10;
fork
#1 print_value(1,1);
#1 print_value(2,2);
#1 print_value(3,3);
join_any
$display("@%g Came out of fork-join",$time);
//wait till all the forks (theads are completed their execution)
wait fork;
$display("@%g All threads completed execution",$time);
#20 $finish;
end
endmodule
仿真结果如下:
@3 Passed Value 4 Delay 2
@6 Passed Value 8 Delay 5
@8 Passed Value 10 Delay 7
@12 Passed Value 1 Delay 1
@12 Came out of fork-join
@13 Passed Value 2 Delay 2
@14 Passed Value 3 Delay 3
@14 All threads completed execution
$finish called from file "fork_join_wait_process.sv", line 29.
写在后面:冲冲冲