进程之间的二三事

目录

1、@和wait在initial块中的一些奇怪的事情

2、forever中没有延时

3、fork join/any/none


1、@和wait在initial块中的一些奇怪的事情

 initial begin
     a = 0; 
     #2;
     a = 1;
 end
 initial begin
     wait(a == 1); //wait
     a = 0; 
    $display("1");
 end
 initial begin
      wait(a == 1); //wait
    $display("2");
  end
// 打印只能打印出 1;

 initial begin
     a = 0; 
     #2;
     a = 1;
 end
 initial begin
     @(posedge a ); //@
     a = 0; 
     $display("1");
 end
 initial begin
      @(posedge a );//@
     $display("2");
  end
  //打印出1和2



1、首先@是边沿触发,当检测到上升沿时就执行下面的
2、wait是电平触发,电平=1时,检测。
@的结果很容易理解,但是为什么wait,initial块应该是同时进行的,为什么好像是第一个initial块结束了才执行第二个。(打个flag)

感觉是和仿真器有关,虽然sv仿真器将initial块之间并行运行,但是在是在cpu运行过程中每条指令都依旧是串行执行,所以对于不消耗时间的initial块,他是有先后执行顺序的。仿真器会将第一个执行完毕再执行下一个。


2、forever  内部没有延时

forever  内部如果没有延时,好像会导致仿真无法结束? 


3、fork join进程

fork
    $display(1); 
    $display(2); 
    $display(3); 
join/join_any/join_none
$display(4); 

join : 1234

join_any:1423

join_none:4123

fork-join进程的一些的理解

1、fork-join内部两个进程的先后顺序

通常我们接收的观念是内部进程并行执行,那它所谓的的先后顺序指的是什么呢。

如果两个进程在同一刻仿真时间,会先执行上面的进程(和initial块的并行执行性质一样),如果在不同的仿真时刻是并行的。

module test;
bit a;
initial begin
	a = 0;
	fork
     begin
   	     a = 1;
 	     $display("a = %d",a);   
     end
         $display("a = %d",a);  
	join
end
endmodule

 看结果,两个进程是等到a = 1 ,才开启下个进程。

原因:和仿真器有关,虽然sv仿真器将initial块之间并行运行,但是在是在cpu运行过程中每条指令都依旧是串行执行,所以对于不消耗时间的initial块,他是有先后执行顺序的。仿真器会将第一个执行完毕再执行下一个。

2、program/module 内部执行到begin-end时结束的区别

program会将最后的这一刻的仿真时间的语句执行完毕就停止,注意是同时刻的仍然会执行,下一时刻的就不再运行。而module仿真不会终止。

program示例:

`timescale 1ns/1ps
program test;
  initial begin
	fork
  	  $display(1); 
      $display(2); 
      $display(3);
      #2 
      $display(5);
    join_none
	$display(4);
  end
endprogram
// join:12345
//join_any:1423,没有5哦
//join_none:4123,没有5哦

module的示例:

`timescale 1ns/1ps
module test;
  initial begin
	fork
  	  $display(1); 
      $display(2); 
      $display(3);
      #2 
      $display(5);
    join/any/none
	$display(4);
  end
endmodule
// join:12345
//join_any:14235,
//join_none:41235,
 

3、fork join内部加了begin end,begin_end的线程顺序执行。

示例2:thread1 和thread 2并行执行。

//示例1
fork begin
   
     process1

     process2

end join
示例2

fork 
    begin //thread1
   
        process1

        process2
    end 
    begin //thread2
   
        process1

        process2
    end 
join

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值