• SV-线程的使用与控制


    一.线程的使用

    创建线程有三种方式
    (1)fork…join
    (2)fork…join_any
    (3)fork…join_none
    在这里插入图片描述
    从图中可以看出

    • fork…join表示一个并行执行语句,不同与begin…end的顺序执行,在数电中理解为与的概念
    • fork…join_any表示有一个执行完成就可以,在数电中可以理解为或的概念
    • fork…join_none表示一个都不执行,在数电中可以理解为非的概念

    二.线程的控制

    1.wait

    • wait语句可以等待所有语句执行完毕才退出程序,wait语句使用时加上等待线程名称
    • fork…join_any本身是只执行一句的,如果加入了wait语句,会将三个语句全部执行完毕才会退出整个initial语句,如下代码:
    task run_threads;
    	...
    	fork
    		check_trans(tr1);
    		check_trans(tr2);
    		check_trans(tr3);
    		join_any
    		...
    		wait fork //等待三个check执行完毕再退出task
    endtask
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    2.disable

    • disable可以停止单个线程也可以停止多个线程,都需要加上停止进行的名字
      (1)结束单个进程
    • 停止单个线程,dsiable timeout_block这个语句可以停止frok…join_any中的time_out进程
    parameter TIME_OUT = 1000;
    task check_trans(Transaction tr);
    	fork
    		begin
    			fork:timeout_block
    				begin
    					wait(bus.cb.addr == tr.addr)
    					$display("@%0t:Addr match %d",$time,tr.addr);
    				end
    				#TIME_OUT $display("@%0t:Error:timeout",$time);
    			join_any
    			//停止TIME_OUT语句
    			disable timeout_block;
    		end
    	join_none
    endtask
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    (2)停止多个进程

    • 在停止多个线程时候,需要加上名字以表区别比如:disable fork_a,如果只写fork,disable会将所有的fork都停止,所以写为disable fork_a以示区分,如下:
    initial begin
       check_trans(tr0);
       	fork
       		begin
       			check_trans(tr1);
       			fork
       				check_trans(tr2);
       			join
       			//这里有两个fork,如果不指明,会将两个fork都需要停止,所以需要区分
       			#(TIME_OUT/2) disable fork; 
       		end
       	join
    end
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    (3)停止被多次调用的任务

    • disable比想象的更强大,如果你给某一个任务或者线程指明标号,那么当这个线程被调用多次以后,如果通过disable去禁止这个线程标号,所有衍生的同名线程都将被禁止。
    task wait_for_time_out(int id);
    	if(id==0)
    		fork
    			begin
    				#2
    				$display("@%0t:disable wait_for_time_out",$time);
    				disable wait_for_time_out;
    			end
    		join_none
    		fork:just_a_little
    			begin
    				$diaplay("@%0t:%m:%0d entering thread",$time,id);
    				#TIME_OUT;
    				$display("@%0t:%m:%0d done",$time,id);
    			end
    		join_none
    endtask
    
    initial begin
    	wait_for_time_out(0);//被停止
    	wait_for_time_out(1);//被停止
    	wait_for_time_out(2);//被停止
    	#(TIME_OUT*2)$display("@%0t:All done",$time);
    end
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 任务wait_for_time_out被调用了三次,从而衍生了三个线程
    • 线程0在2#延时之后禁止了该任务,而由于三个线程均是“同名”线程,因此这些线程都被禁止了,最终也都没有完成。
  • 相关阅读:
    分布式搜索引擎01
    免杀对抗-java语言-shellcode免杀-源码修改+打包exe
    使用ppt和texlive生成eps图片(高清、可插入latex论文)
    Circle
    揭秘!为什么在外面修电脑这么坑?
    飞天使-学以致用-devops知识点4-SpringBoot项目CICD实现(实验失败,了解大概流程)
    freertos信号量之互斥信号量
    渲染路径RenderingPath
    Python中的 if __name__ ==‘main‘
    如何用AB测试完善产品激励体系
  • 原文地址:https://blog.csdn.net/qq_44943193/article/details/125403276