SV中线程之间的通信可以让验证组件之间更好的传递transaction。

SV对verilog建模方式的扩展:1) fork.....join 必须等到块内的所有线程都执行结束后,才能继续执行块后的语句。(所以使用的很少)

2) fork.....join_none 先执行块后的线程,而后再执行块内的线程。不会产生块后的线程必须等块内线程的情形。

3) fork.....join_any 只要块内的线程有一个执行结束,就执行块之后的线程。

需要说明一下,begin.....end之间的顺序操作,只要先前的进程已经开始执行,那之后的进程就会开始执行。在2例中a = b线程先于c = a线程执行,但俩者都是在

零时刻执行,因为阻塞赋值都是一个仿真时间区域,所以最后的结果是c = b;如果改成a <= b;因为同一个仿真时刻,阻塞赋值在非阻塞赋值之前,所

以最后的结果是c = a; a <= b; (未仿真检测)

在例1中,0时刻a = b线程被#2阻塞,c=a线程因为a = b还未执行结束也阻塞。2个仿真单位之后,a=b线程结束,开始c = a线程,被#3阻塞,又

过3个仿真单位后,执行结束。

begin                                       begin

#2  a = b;                                a = b;

#3  c = a;                                c = a;

end                                          end

线程中的自动变量:两种用法,#0会阻塞$display任务,而让for循环在仿真时刻0时,就先于$display执行好。

initial  begin                                                   initial  begin

for(int j=0;j<3;j++)                                      for(int j=0;j<3;j++)   begin

fork                                                                  int k = j;

automatic  int k = j;                                           fork

$write(k);                                                             $write(k);

join_none                                                              join_none   end

#0$display;                                                  #0$display;

end                                                              end

停止一个线程:

task  check_trans(Transaction  tr);

fork    begin

fork:time_out

begin

wait(bus.cb.addr == tr.addr);

$display("@%0t:Address Match", $time);

end

#TIME_OUT $display("@%0t:Error", $time);

join

join_any

disable time_out               //进程块名

endtask

事件通信:1)同verilog一样的,@, ->操作符,边沿阻塞。因为event是零脉冲,所以这种方式,当->在@之前时,同一个event不能被发现触发。

->>在nonblocking的区域执行触发

2)SV扩展的电平检测triggered()函数。wait(e1.triggered()),在当前时间的最后执行,保证如果当前时间有触发,则不会引起阻塞

在验证经常将event参数放在类的new的参数列表中,同mailbox一样,之后会说到。这样方便直接在顶层通过event或mailbox连接构件。

旗语互斥访问:semaphore来创建,new函数构建,put获得一个,get得到一个,得不到或放不进时,阻塞进程。try_get(),同get但是不会被阻塞。

邮箱通信:mailbox来创建,new函数来构建,put移出数据,get移入数据,peek对FIFO数据的copy不会移入移出。mailbox内存放的是句柄不会是对象。

    mailbox默认都是typeless的,这样在producer和consumer之间,可能会出现类型出错的情况,这样只能在run_time中发现错误;

    使用参数化的mailbox,可以在compile的时候,就发现在这个问题;

    local static mailbox #(uvm_phase) m_phase_hopper = new();  只接受phase类型的指针;

    mailbox内自定义的函数,num(),put()/try,get/try()

class Generator;                                                                         class Driver;

Transactin tr;                                                                              Transactin tr;

mailbox mbx;                                                                              mailbox mbx;

function new(mailbox mbx)                                                          function new(mailbox mbx)

this.mbx = mbx;                                                                           this.mbx = mbx;

endfunction                                                                                 endfunction

task run(int count);                                                                      task run(int count);

repeat(count)  begin                                                                   repeat(count)  begin

tr = new();                                                                      mbx.get(tr);

assert(tr.randomize);                                                        ........

mbx.put(tr);                                                                     ..........

end

endtask

endclass                                                                                     endclass

program automatic mailbox_example(arbif......)

'include "Generator.sv"

'include "Driver.sv"

'include "Transaction.sv"

mailbox  mbx;

Generator   gen;

Driver    drv;

int  count;

initial  begin

count = $urandom_range(50);

mbx = new();

gen = new(mbx);         //gen与drv同一个mailbox来传递transaction

drv = new(mbx);

......................

end

SV中的线程的更多相关文章

  1. android中的线程池学习笔记

    阅读书籍: Android开发艺术探索 Android开发进阶从小工到专家 对线程池原理的简单理解: 创建多个线程并且进行管理,提交的任务会被线程池指派给其中的线程进行执行,通过线程池的统一调度和管理 ...

  2. rxjava源码中的线程知识

    rxjava源码中的线程知识 rx的最精简的总结就是:异步 这里说一下以下的五个类 1.Future2.ConcurrentLinkedQueue3.volatile关键字4.AtomicRefere ...

  3. C#中的线程(一)入门

    文章系参考转载,英文原文网址请参考:http://www.albahari.com/threading/ 作者 Joseph Albahari,  翻译 Swanky Wu 中文翻译作者把原文放在了& ...

  4. C#中的线程四(System.Threading.Thread)

    C#中的线程四(System.Threading.Thread) 1.最简单的多线程调用 System.Threading.Thread类构造方法接受一个ThreadStart委托,改委托不带参数,无 ...

  5. C#中的线程三 (结合ProgressBar学习Control.BeginInvoke)

    C#中的线程三(结合ProgressBar学习Control.BeginInvoke) 本篇继上篇转载的关于Control.BeginInvoke的论述之后,再结合一个实例来说明Cotrol.Begi ...

  6. C#中的线程二(Cotrol.BeginInvoke和Control.Invoke)

    C#中的线程二(Cotrol.BeginInvoke和Control.Invoke) 原文地址:http://www.cnblogs.com/whssunboy/archive/2007/06/07/ ...

  7. C#中的线程一(委托中的异步)

    C#中的线程一(委托中的异步) 一.同步委托 我们平时所用的委托以同步居多,我们编写一个方法和相关委托进行演示: publicdelegatevoid DoSomethingDelegate(stri ...

  8. 浅谈Excel开发:十 Excel 开发中与线程相关的若干问题

    采用VSTO或者Shared Add-in等技术开发Excel插件,其实是在与Excel提供的API在打交道,Excel本身的组件大多数都是COM组件,也就是说通过Excel PIA来与COM进行交互 ...

  9. COM中的线程模式

      Choosing the threading model for an object depends on the object's function. An object that does e ...

随机推荐

  1. web开发之Cookie使用

    做过web开发的小伙伴对于Cookie一定不陌生,当用户登录后将用户的账号保存到本地,密码保存时,建议使用MD5进行加密,以防止用户个人信息的泄露.今天和大家简单聊聊关于Jquer Cookie的使用 ...

  2. mac设置文件权限问题

    在使用mac时,经常我们遇到相关文件不能使用的情况,其实大多数情况都是,文件权限问题. 文件或目录的访问权限分为只读,只写和可执行三种.以文件为例,只读权限表示只允许读其内容,而禁止对其做任何的更改操 ...

  3. Thinkphp框架下设置session的过期时间

    打开项目中的配置文件,添加session的过期配置,如下: 'SESSION_OPTIONS' => array( 'name' => 'BJYSESSION', //设置session名 ...

  4. idea正则表达式查找代码的方法

    find: 1. 该正则表达式: initEcharts *:{1} *\{{1} 匹配: initEcharts : { 其中冒号两边允许无限个空格: 2.#[a-zA-Z]*#匹配:两边以井号结束 ...

  5. PAT天梯赛L2-003 月饼【贪心】

    L2-003. 月饼 时间限制 100 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 月饼是中国人在中秋佳节时吃的一种传统食品,不同地区有许多不 ...

  6. 使用cv::invert()求解Mat矩阵的逆矩阵

    opencv中cv::invert()可直接用来求解矩阵的逆矩阵 函数原型如下: double cv::invert(InputArray  src, OutputArray dst, int  fl ...

  7. OpenCV学习笔记之课后习题练习2-5

    5.对练习4中的代码进行修改,参考例2-3,给程序加入滚动条,使得用户可以动态调节缩放比例,缩放比例的取值为2-8之间.可以跳过写入磁盘操作,但是必须将变换结果显示在窗口中. 参考博文:blog.cs ...

  8. 推荐系统之最小二乘法ALS的Spark实现

    1.ALS算法流程: 初始化数据集和Spark环境----> 切分测试机和检验集------> 训练ALS模型------------> 验证结果-----------------& ...

  9. 线程池和进程池的通用写法 ProcessPoolExecutor 和 ThreadPoolExecutor

    import time from comcurrent.futures import ThreadPoolExecutor,ProcessPoolExccoutor#这个方法可以用进程池或者线程池 d ...

  10. android udev

    http://www.freesoftwaremagazine.com/articles/drivers_linux http://blog.csdn.net/jianchi88/article/de ...