app开发者平台在数字化时代的重要性与发展趋势解析
890
2022-11-16
SystemVerilog学习-09-进程间同步、通信和虚方法
简介
测试平台中的所有线程都需要同步并交换数据。 —个线程等待另外一个,例如验证环境需要等待所有激励结束、比较结束才可以结束仿真。 比如监测器需要将监测到的数据发送至比较器,比较器又需要从不同的缓存获取数据进行比较。
事件event
wait_order()
wait_order可以使得进程保持等待,直到在参数列表中的事件event按照顺序从左到右依次完成。如果参数列表中的事件被触发但是没有按照要求的顺序,那么会使得等待操作失败。
wait_order (a,b,c);wait_order (a,b,c) else $display ( "Error: eventsout of order" );bit success;wait_order(a,b,c) success = 1; else success = 0 ;
旗语(semaphore)
旗语从概念上讲,是一个容器。在创建旗语的时候,会为其分配固定的钥匙数量。·使用旗语的进程必须先获得其钥匙,才可以继续执行。旗语的钥匙数量可以有多个,等待旗语钥匙的进程也可同时有多个。旗语通常用于互斥,对共享资源的访问控制,以及基本的同步。
创建旗语,并为其分配钥匙的方式如下:
semaphore sm;sm = new ();
创建一个具有固定钥匙数量的旗语: new (N = 0)。
从旗语那里获取一个或多个钥匙(阻塞型) : get (N = 1)。
将一个或多个钥匙返回到旗语中: put (N = 1)。
尝试获取一个或多个钥匙而不会阻塞(非阻塞型) : try_get (N = 1)。
semaphore: :new()
new ()的原型如下:function new (int keycount = 0) ;
keycount指定最初分配给旗语的钥匙数目。当更多钥匙放入旗语时,钥匙数目可以超出初始时的keycount数量,而不是删除。
keycount的默认值为0。new ()函数返回旗语的句柄。
semaphore: : put()
put ()方法用于将钥匙数量返回给旗语。
put ()的原型如下:function void put (int keycount = 1) ;
keyCount指定返回到旗语的钥匙数量。默认值为1。调用semaphore.put()函数时,指定数量的钥匙将返回到旗语。如果其它进程已经在等待旗语,则该进程应在有足够数量钥匙的情况下返回。
semaphore: :get()
get ()方法用于从旗语中获取指定数量的钥匙。
get ()的原型如下: task get (int keycount = 1) ;
keyCount指定从旗语获取所需的钥匙数,默认值为1。如果指定数量的钥匙可用,则该方法返回并继续执行。如果指定数量的钥匙不足,进程将阻塞,直到钥匙数目充足。旗语的等待队列是先进先出(FIFO),即先排队等待旗语的将优先得到钥匙。
semaphore::try _get()
try get ()方法用于从信号量中获取指定数量的钥匙,但不会被阻塞。 try get ()的原型如下:function int try_get (int keycount = 1) ;
keyCount指定从旗语处获取所需的钥匙数目,默认值为1。如果指定数量的钥匙可用,则该方法返回正数并继续执行。如果指定数量的钥匙不足,则该方法返回0。
信箱mailbox
信箱mailbox可以使得进程之间的信息得以交换,数据可以由一个进程写入信箱,再由另外一个进程获得。信箱在创建时可以限制其容量,或者不限制。当信箱容量写满时,后续再写入的动作会被挂起,直到信箱的数据从中读取,使得信箱有空间以后才可以继续写入。不限制容量的信箱则不会挂起写入信箱的动作。
信箱的内建方法
创建信箱: new()。将信息写入信箱: put()。试着写入信箱但不会阻塞: try_put()。获取信息: get()同时会取出数据,peek()不会取出数据。试着从信箱取出数据但不会阻塞: try _get()/try_peek()。获取信箱信息的数目: num()。
mailbox::new()
可以在创建信箱的时候限定或者不限定其大小。
function new (int bound = 0) ;
默认情况下,如果不传入参数,bound默认值为0,表示不限定信箱大小,如果传入的数值大于0,那么表示信箱的最大容量。bound应为正数,如果未负数的话,系统会提示警告和出现无法预期的行为。
mailbox::num()
num()会返回信箱目前的消息数目。
可以结合num()与get()或者put(),防止get()/put()方法在信箱为空或者为满的时候被阻塞。
mailbox: :{put(), try_put()}
task put( singular message) ;function int try_put( singular message) ;
put()会将信息按照FIFO的顺序写入到信箱中,如果信箱此时已满,则put()任务会挂起,直到信箱有新的空间可以容纳消息。try_put()也会按照FIFO顺序写入信箱,不会发生阻塞。如果信箱已满,则写入失败,返回0;如果信箱未满,则写入成功,返回1。
mailbox ::{get(), try_get()}
task get( ref singular message ) ;function int try_get( ref singular message ) ;
get()会将信息从信箱中取出,如果信箱此时为空,则get()任务会挂起,直到信箱中有消息可以读取,任务才会返回。该方法会将读取到的消息从信箱中移除。
try_get()也会将信息从信箱中取出,只是该函数不会发生阻塞。如果信箱为空,则读取失败,返回0;如果信箱不为空,则读取成功,返回1。该方法也会将读取到的消息从信箱中移除。
mailbox: :{peek(), try_peek()}
task peek ( ref singular message ) ;function int try_peek ( ref singular message );
peek()会将信息从信箱中拷贝,如果信箱此时为空,则peek()任务会挂起,直到信箱中有消息可以拷贝,任务才会返回。该方法不会将读取到的消息从信箱中移除。
try_peek()也会将信息从信箱中拷贝,只是该函数不会发生阻塞。如果信箱为空,则拷贝失败,返回0;如果信箱不为空,则拷贝成功,返回1。该方法也不会将拷贝到的消息从信箱中移除。
参数化信箱
这种参数化信箱的方式可以使得在编译时就能够检查出类型不匹配的情况。
typedef mailbox #(string) s_mbox;s _mbox sm = new ;string s;sm.put ("he1lo");...sm.get( s ); // s <- "he1lo"
虚方法
reference
西电路科验证PPT
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~