Systemverilog验证测试平台指南7.5旗语

7.5旗语

        使用旗语可以实现对同一资源的访问控制。想象一下你和你爱人共享一辆汽车的情形。显然,每次只能有一个人可以开车。为应对这种情况,你们可以约定谁持有钥匙谁开车。当你用完车以后你会让出车子以便对方使用。车钥匙就是旗语,它确保了只有一个人可以使用汽车。在操作系统的术语里,这就是大家所熟知的“互斥访问”,所以旗语可被视为一个互斥体,用于实现对同一资源的访问控制
        当测试平台中存在一个资源,如一条总线,对应着多个请求方,而实际物理设计中又只允许单一驱动时,便可使用旗语。在 System Verilog中,一个线程如果请求“钥匙”而得不到,则会一直阻塞,多个阻塞的线程会以先进先出(FIFO的方式进行排队

7.5.1旗语的操作

        旗语有三种基本操作。使用new方法可以创建一个带单个或多个钥匙的旗语,使用get可以获取一个或多个钥匙,而put则可以返回一个或多个钥匙。如果你试图获取一个旗语而希望不被阻塞,可以使用 try get()函数。它返回1表示有足够多的钥匙,而返回0则表示钥匙不够,如例7.30所示。
例7.30用旗语实现对硬件资源的访问控制

program automatic test;

semaphore sem;
initial
	begin
		sem=new(1);//分配一个钥匙
		
		fork
			sequencer();  //产生两个总线事务
			sequencer();
			
		join

	end

task sequencer;
 repeat ($urandom %10)// 随机等待0~9个周期
	#10 ;
	
	sentrans();   //执行总线事务
endtask

task sentrans;
    sem.get(1);			//获取钥匙
    #10;
    //other tsak
    sem.put(1);		//处理完成后把钥匙返回
endtask

endprogram

7.5.2带多个钥匙的旗语

        使用旗语时有两个地方需要小心。第一,你返回的钥匙可以比你取出来的多。你可能会突然间有两把钥匙而实际上只有一辆汽车。第二,当你的测试程序需要获取和返回多个钥匙时,务必谨慎。假设你剩下一把钥匙,有一个线程请求两把而被阻塞,这时第二个线程出现,它只请求一把,那么会有什么样的结果呢?在 System verilog中,第二个请求get(1)会悄悄地排到第一个请求get(2)的前面,先进先出的规则在这里会被忽略掉。
        如果有多个大小不同的请求混在一起,你可以自己编写一个类。这样你对于谁取得优先权会比较清楚

你可能感兴趣的:(Systemverilog,Systemverilog)