网站大量收购闲置独家精品文档,联系QQ:2885784924

uvm实战指南.doc

  1. 1、本文档共50页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
uvm实战指南

/blog/#m=0t=1c=fks_084066087094087064080095087095085086087067087085095068084 Callback——最简单的callback?? 2012-01-21 22:06:01|??分类:?SystemVerilog|字号?订阅 在RVM、VMM、OVM/UVM中,常常提到callback这个概念。指在事先设置好的地方留下一个接口,通过向这个接口添加一些函数对象,来达到不改变代码结构而动态修改代码行为。下面用systemverilog来举一个简单的callback例子: ?1?class?callback; ?2? ?3???virtual?task?cb_pre_run(?); ?4?????$display(base callback run); ?5???endtask:cb_pre_run ?6??? ?7?endclass:callback ?8? ?9?class?widget; 10? 11???callback cb_queue[$]; 12? 13???function?void?add_cb(callback cb); 14?????cb_queue.push_back(cb); 15???endfunction:add_cb 16? 17???task?run(); 18?????// add callback here 19?????foreach(cb_queue[i])?begin 20???????cb_queue[i].cb_pre_run(); 21?????end 22?????$display(widget run....); 23???endtask:run 24?endclass:widget 25? 26?module?top; 27? 28?class?ext_callback?extends?callback; 29???task?cb_pre_run(); 30?????$display(ext callback run); 31???endtask:cb_pre_run 32?endclass:ext_callback 33???widget w; 34???callback cb0; 35???ext_callback cb_ext; 36? 37??? 38???initial?begin 39?????w?=?new; 40?????cb0?=?new; 41?????cb_ext?=?new; 42?????w.run; 43?????w.add_cb(cb0); 44?????$display(===========??After Add base Callback); 45?????w.run; 46?????w.add_cb(cb_ext); 47?????$display(===========??After Add extention Callback); 48?????w.run; 49???end 50??? 51?endmodule;?// top ????在sysverilog中,没有函数指针的概念,因此必须将函数包装成为一个对象,就是上面例子中的callback class. 而为了在widget的对象中使用这个函数对象,必须事先在设计好的调用点对callback对象中的函数进行逐个调用(代码19-21行)。 ????widget的对象事先并不知道有多少callback对象,而是将所有的callback对象放到自己的一个callback对象队列中(cb_queue)。然后逐个对这个队列中的所有对象进行函数调用。 ????上面的程序编译执行后,结果如下: widget run.... =========== After Add base Callback base callback run widget run.... =========== After Add extention Callback base callback run ext callback run widget run.... ????可以看出,在执行的过程中,可以对widget对象进行动态的添加callback,从而动态的改变widget对象的动作。 ????上面的例子非常简单,仅仅是输出一些讯息而已,有一些局限: 这个callback结构并不能够真的改变widget对象的内部成员,以及处理的数据内容,仅仅能够输出一些讯息。 对每一个widget的对象,都需要单独添加相关callback对象,假如程序中又创建了一个新的widget对象,那么这个对象的callback queue初始是空的,也就是没有callb

文档评论(0)

精华文库 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

版权声明书
用户编号:7111022151000002

1亿VIP精品文档

相关文档