• SystemVerilog学习-09-进程间同步、通信和虚方法


    简介

    测试平台中的所有线程都需要同步并交换数据。
    —个线程等待另外一个,例如验证环境需要等待所有激励结束、比较结束才可以结束仿真。
    比如监测器需要将监测到的数据发送至比较器,比较器又需要从不同的缓存获取数据进行比较。

    事件event

    可以通过event来声明一个命名event变量,并且去触发它。这个命名event可以用来控制进程的执行。可以通过->来触发事件。其它等待该事件的进程可以通过@操作符或者wait()来检查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 ;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    旗语(semaphore)

    旗语从概念上讲,是一个容器。在创建旗语的时候,会为其分配固定的钥匙数量。·使用旗语的进程必须先获得其钥匙,才可以继续执行。旗语的钥匙数量可以有多个,等待旗语钥匙的进程也可同时有多个。旗语通常用于互斥,对共享资源的访问控制,以及基本的同步。

    创建旗语,并为其分配钥匙的方式如下:

    semaphore sm;
    sm = new ();
    
    • 1
    • 2

    创建一个具有固定钥匙数量的旗语: 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) ;
    
    • 1

    默认情况下,如果不传入参数,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) ;
    
    • 1
    • 2

    put()会将信息按照FIFO的顺序写入到信箱中,如果信箱此时已满,则put()任务会挂起,直到信箱有新的空间可以容纳消息。try_put()也会按照FIFO顺序写入信箱,不会发生阻塞。如果信箱已满,则写入失败,返回0;如果信箱未满,则写入成功,返回1。

    mailbox ::{get(), try_get()}

    task get( ref singular message ) ;
    function int try_get( ref singular message ) ;
    
    • 1
    • 2

    get()会将信息从信箱中取出,如果信箱此时为空,则get()任务会挂起,直到信箱中有消息可以读取,任务才会返回。该方法会将读取到的消息从信箱中移除。

    try_get()也会将信息从信箱中取出,只是该函数不会发生阻塞。如果信箱为空,则读取失败,返回0;如果信箱不为空,则读取成功,返回1。该方法也会将读取到的消息从信箱中移除。

    mailbox: :{peek(), try_peek()}

    task peek ( ref singular message ) ;
    function int try_peek ( ref singular message );
    
    • 1
    • 2

    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"
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    虚方法

    类的成员方法可加以修饰词virtual(虚方法)。虚方法是一种基本的多态(polymorphic)结构。一个虚方法可以覆盖基类的同名方法。在父类和子类中声明的虚方法,其方法名、参数名、参数方向等都应该保持一致。在调用虚方法时,它将调用句柄指向对象的方法,而不受句柄类型的影响。

    reference

    1. 西电路科验证PPT
  • 相关阅读:
    一致性哈希的简单认识
    I2C协议
    核桃派walnutpi添加红外遥控器键盘映射(其他的linux板子同理)ir-keytable
    LeetCode217——存在重复元素
    Python-FiPy有限体积安装
    [cpu出错心得]
    实验报告3:《RHEL7+服务器安装与配置》
    OpenCV实现求解单目相机位姿
    axios
    5.SpringMVC
  • 原文地址:https://blog.csdn.net/weixin_41445387/article/details/125544242