systemverilog学习 ---- event

event

event 类

event时systemverilog内建的一个类,我们可以用event声明一个句柄,该句柄称为named event。event是一个静态对象,用于进程之间的同步。event操作一般分为两个阶段的操作组成,一个进程用来触发event,另一个进程用来等待event。
正是由于句柄的存在,它不同于如时钟上升沿事件,named event需要我们显示指定何时触发和等待。提供如下操作符处理event的触发和等待:

  • -> 触发named event,触发事件之后会解锁所有等待该事件的进程
  • ->> 触发非阻塞事件,使用该操作符语句执行不会阻塞即等待,会创建一个非阻塞赋值更新事件
  • @ 该操作符会阻塞进程,知道给定的event触发。若要实现不阻塞进程的触发,就先需要执行@statement,然后触发进程在执行->
  • wait 如果同时发生事件触发和等待,使用@操作符可能会错过检测事件的触发,而使用wait则可以检测事件的触发。
  • wait_order 这个方法会阻塞进程直到所有指定的事件在给定的顺序(从左到右)触发,如果顺序不对,同样不会解锁进程。
  • 当一个event变量赋值给另一个,两个event就会合并,执行->,任一事件变量都会影响进程执行。

例子

module event_ex;

    event ev_1;         //declaring event ev_1

    initial begin
        fork
            //process-1,triggers the event
            begin
                #40;
                $display($time, "\t Triggering The event");
                ->ev_1;
            end

            //process-2,wait for the event to trigger
            begin
                $display($time, "\t Waiting for the event to trigger");
                @(ev_1.triggered);
                $display($time, "\t Event triggered");
            end
        join
    end

endmodule

示例中,fork-join有两个进程,第一个begin-end块经过40个时间单位触发事件ev_1,第二个begin-end块等待ev_1触发,然后打印输出.执行结果,可见,实质上是通过event控制进程的执行进度,提供了一个进程影响另一个的机制
在这里插入图片描述

module event_ex;

    event ev_1;                 //delaring event ev_1

    initial begin
        fork
            //process-1,triggers the event
            begin
                #40;
                $display($time, "\t Triggering The event");
                ->ev_1;
            end
            //process-2,wait for the event to trigger
            begin
                $display($time, "\t Waiting for the event to trigger");
                #60;
                @(ev_1.triggered);
                $display($time, "\t Event triggered");
            end
        join
    end

    initial begin
        #100;
        $display($time, "\t Ending the simulation");
        $finish;
    end

endmodule

由上面例子看出,即使是触发先发生,等待触发后发生。但是由于等待触发更晚一些,因此后面的语句将会呗堵塞,不会被执行。执行结果如下:
在这里插入图片描述

module events_ex;
  event ev_1; //declaring event ev_1

  initial begin
    fork
      //process-1, triggers the event
      begin
         $display($time,"\tTriggering The Event");
        ->ev_1;
      end
   
      //process-2, wait for the event to trigger
      begin
        $display($time,"\tWaiting for the Event to trigger");
        wait(ev_1.triggered);
        $display($time,"\tEvent triggered");
      end
    join
  end
endmodule

执行结果如下,可见当等待在触发前执行,或者同时出现,等待方是可以察觉触发的
在这里插入图片描述
对上面的例子进行修改,将进程2的wait换成@
在这里插入图片描述
执行结果,可见使用@操作符,等待方检测不到触发
在这里插入图片描述

module events_ex;
  event ev_1; //declaring event ev_1
  event ev_2; //declaring event ev_2
  event ev_3; //declaring event ev_3
  
  initial begin
    fork
      //process-1, triggers the event ev_1
      begin
        #6;
        $display($time,"\tTriggering The Event ev_1");
        ->ev_1;
      end
      //process-2, triggers the event ev_2
      begin
        #2;
        $display($time,"\tTriggering The Event ev_2");
        ->ev_2;
      end
      //process-3, triggers the event ev_3
      begin
        #8;
        $display($time,"\tTriggering The Event ev_3");
        ->ev_3;
      end
      //process-4, wait for the events to trigger in order of ev_2,ev_1 and ev_3
      begin
        $display($time,"\tWaiting for the Event's to trigger");
        wait_order(ev_2,ev_1,ev_3)
          $display($time,"\tEvent's triggered Inorder");
        else
          $display($time,"\tEvent's triggered Out-Of-Order");
      end
    join
  end
endmodule

由上面例子可以看出,是先触发事件2,再触发事件1,最后触发事件3.再wait_order是按照顺序触发的,因此wait_order后面的语句是可以被执行的。其输出结果如下:
在这里插入图片描述

module event_ex;

    event ev_1;             //declaring event ev_1
    event ev_2;             //declaring event ev_2
    event ev_3;             //declaring event ev_3

    initial begin
        fork
            //process-1,triggers the event ev_1
            begin
                #6;
                $display($time, "\t Triggering the event ev_1");
                ->ev_1;
            end

            //process-2,triggers the event ev_2
            begin
                #2;
                $display($time, "\t Triggering the event ev_2");
                ->ev_2;
            end

            //process-3,triggers the event ev_3
            begin
                #1;
                $display($time, "\t Triggering the event ev_3");
                ->ev_3;
            end

            //process-4.wait for the events to trigger in order of ev_2,ev_2,ev_3
            begin
                $display($time, "\t Waiting for the event to trigger");
                wait_order(ev_2,ev_1,ev_3);
                    $display($time, "\t Event's triggered Inorder");
                else
                    $display($time, "\t Event's triggered out-of-order");
            end
        join
    end

endmodule

上面例子中的触发顺序是先触发ev_3随着是ev_2,ev_1。进程4的等待顺序却是等待ev_2,ev_1,ev_3的顺序,因此是乱序的,其输出结果如下所示:
在这里插入图片描述

event regions

简要谈谈sv元素之间的交互和行为,类似verilog仿真事件队列。IEEE1800-2015标准,将sv的时间戳time slot分成17个有序区域。9个区域用于执行sv的语句,8个区域用于执行PLI(programming language interface,编程语言接口)代码。规定这些,是为了design和testbench在预料中交互
在这里插入图片描述

  • 2
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: SystemVerilog讲座-PDF教程是一本关于Verilog和SystemVerilog语言的详细介绍和使用手册。该教程适合想要学习Verilog和SystemVerilog语言的初学者和工程师。 该教程覆盖了Verilog和SystemVerilog语言的基础知识,包括数据类型和运算符、模块和端口、决策和循环语句、函数和任务、时序建模、测试和调试等。此外,该教程还介绍了使用SystemVerilog进行OVM/UVM验证和设计模式。 该教程包含了大量的示例程序和练习题,帮助读者深入理解Verilog和SystemVerilog语言的使用和应用。通过学习该教程,读者可以掌握系统级设计和验证流程,并在工作中使用SystemVerilog语言进行设计和验证。 值得注意的是,学习Verilog和SystemVerilog语言需要具备一定的数字电路设计和计算机编程基础。因此,初学者可以先学习电路设计和计算机编程基础,再进一步学习Verilog和SystemVerilog语言。 ### 回答2: SystemVerilog是基于Verilog的扩展语言,它是一种高级硬件描述语言,具有强大的设计与验证功能。SystemVerilog极大地拓展了Verilog的能力,增强了硬件设计的复杂性,使得对于SystemVerilog熟练掌握的工程师来说,能够更快速、更有效地完成硬件的设计与验证工作。 针对学习SystemVerilog的人们,提供了一些SystemVerilog讲座和PDF教程,这些资源非常有用。讲座中的专家们详细介绍了SystemVerilog的特性和用法,通过讲解实例,让学习者深入了解SystemVerilog的基本结构、体系架构、语法等方方面面。而PDF教程则提供了更加系统化、深入的学习材料,非常适合有一定编程基础的学习者使用。 在SystemVerilog讲座和PDF教程的学习中,学习者需要逐步掌握SystemVerilog的语言规则和特性。首先要掌握数据类型、运算符、模块定义、分层设计、控制流等基本概念。通过这些基础的学习和实践,可以逐渐提升自己的编程技能和系统设计能力。 总之,SystemVerilog讲座和PDF教程是学习SystemVerilog的重要资源,对于想要深入了解硬件设计与验证的工程师和学生而言,这些资源将是非常有用的学习资料,也有利于其提升自己的技能和能力,为将来的工作或学习做好准备。 ### 回答3: SystemVerilog讲座-PDF教程是一种与计算机领域相关的教学材料,旨在向学生和专业人士介绍SystemVerilog的基本概念和用法。SystemVerilog是一种现代的硬件描述语言,它在硬件设计领域和系统级开发中得到了广泛应用。 SystemVerilog讲座-PDF教程的内容丰富多样,包括SystemVerilog的基本语法和数据类型、控制流语句、模块化设计、仿真和调试等方面的内容。通过这些学习材料的使用,学生可以掌握SystemVerilog的核心概念,不仅能够编写规范的硬件描述代码,同时也能够使用SystemVerilog实现复杂的硬件系统。 SystemVerilog讲座-PDF教程还提供了大量的实例和案例,帮助学生更好地理解SystemVerilog的各种应用场景。此外,在教程中还提供了大量的练习题,帮助学生巩固自己的学习成果。 总之,SystemVerilog讲座-PDF教程是一种非常实用的教学资源,它为学生和专业人士提供了非常有价值的SystemVerilog学习资料,帮助大家快速掌握这种重要的硬件描述语言。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值