SV中的线程
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中的线程的更多相关文章
- android中的线程池学习笔记
阅读书籍: Android开发艺术探索 Android开发进阶从小工到专家 对线程池原理的简单理解: 创建多个线程并且进行管理,提交的任务会被线程池指派给其中的线程进行执行,通过线程池的统一调度和管理 ...
- rxjava源码中的线程知识
rxjava源码中的线程知识 rx的最精简的总结就是:异步 这里说一下以下的五个类 1.Future2.ConcurrentLinkedQueue3.volatile关键字4.AtomicRefere ...
- C#中的线程(一)入门
文章系参考转载,英文原文网址请参考:http://www.albahari.com/threading/ 作者 Joseph Albahari, 翻译 Swanky Wu 中文翻译作者把原文放在了& ...
- C#中的线程四(System.Threading.Thread)
C#中的线程四(System.Threading.Thread) 1.最简单的多线程调用 System.Threading.Thread类构造方法接受一个ThreadStart委托,改委托不带参数,无 ...
- C#中的线程三 (结合ProgressBar学习Control.BeginInvoke)
C#中的线程三(结合ProgressBar学习Control.BeginInvoke) 本篇继上篇转载的关于Control.BeginInvoke的论述之后,再结合一个实例来说明Cotrol.Begi ...
- C#中的线程二(Cotrol.BeginInvoke和Control.Invoke)
C#中的线程二(Cotrol.BeginInvoke和Control.Invoke) 原文地址:http://www.cnblogs.com/whssunboy/archive/2007/06/07/ ...
- C#中的线程一(委托中的异步)
C#中的线程一(委托中的异步) 一.同步委托 我们平时所用的委托以同步居多,我们编写一个方法和相关委托进行演示: publicdelegatevoid DoSomethingDelegate(stri ...
- 浅谈Excel开发:十 Excel 开发中与线程相关的若干问题
采用VSTO或者Shared Add-in等技术开发Excel插件,其实是在与Excel提供的API在打交道,Excel本身的组件大多数都是COM组件,也就是说通过Excel PIA来与COM进行交互 ...
- COM中的线程模式
Choosing the threading model for an object depends on the object's function. An object that does e ...
随机推荐
- 【黑金原创教程】【FPGA那些事儿-驱动篇I 】实验十四:储存模块
实验十四比起动手笔者更加注重原理,因为实验十四要讨论的东西,不是其它而是低级建模II之一的模块类,即储存模块.接触顺序语言之际,“储存”不禁让人联想到变量或者数组,结果它们好比数据的暂存空间. . i ...
- VS NuGet加载本地程序包
NuGet是VS中非常实用的一个工具,我们可以通过它在线安装想要的程序包,只要右键点击解决方案中的项目的引用,在弹出的菜单中选择“管理NuGet程序包”,然后就可以通过在线搜索找到想要添加的程序包,下 ...
- 关于virgo-tomcat-server-3.6.0.RELEASE配置文件修改说明
Virgo项目Web服务器是EclipseRT项目的一部分,是一个完全模块化的Java运行时. Virgo自身就是设计为在标准OSGi框架实现(Equinox)之上的一个OSGi bundle集合. ...
- Yii---使用事物
YII使用事物的时候,遇到的一些小问题总结:开始事物,后要进行事物提交,才能操作数据库(折腾了一天)具体使用: yii事物的定义:是指作为单个逻辑工作单元执行的一系列操作,要么完全地执行,要么完全地不 ...
- Elasticsearch 不同的搜索类型之间的区别
1.match 轻量级搜索 GET /wymlib/_search { "query": { "match": { "title": ...
- ubuntu下opencv2.4.9和opencv3.1.0的共存
转载:ubuntu下opencv2.4.9和opencv3.1.0的共存 关于opencv3.1.0和opencv2.4.9的共存问题其实并不是什么大的问题,因此网上资料比较少.本人也是因为在安装Ro ...
- HDU 1222 - Wolf and Rabbit & HDU 1108 - [最大公约数&最小公倍数]
水题,只是想借此记一下gcd函数的模板 #include<cstdio> int gcd(int m,int n){return n?gcd(n,m%n):m;} int main() { ...
- Oracle体系结构之密码文件管理
oracle密码文件主要用来控制sysdba和sysoper用户用于远程登录.通常,oracle用户登录database有两种方式,一种是通过本地操作系统验证登录,一种是通过密码文件验证登录. 操作系 ...
- Python:列表生成式
List Comprehensions #列表生成式:Python内置的非常简单却强大的可以用来创建list的生成式. #生成list [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]可 ...
- git 出现 refusing to merge unrelated histories 解决
如果出现refusing to merge unrelated histories,使用以下方法即可 git pull origin master --allow-unrelated-historie ...