SV并发线程

写在前面:冲冲冲

 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.

写在后面:冲冲冲

  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

杰之行

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值