uvm中在sequence中的rand变量怎么c语言随机函数rand

*2.4.3 default_sequence 的使用
本文所属图书&>&
本书以一个完整的示例开篇,使得读者一开始就对如何使用UVM搭建验证平台有总体的概念。本书提供大量示例代码,这些代码都经过实际的运行。全书内容力求简单易懂,尽量将UVM中的概念与读者已有的概念联系起来。在&&
在上一节的例子中,sequence是在my_env的main_phase中手工启动的,作为示例使用这种方式足够了,但是在实际应用中,使用最多的还是通过default_sequence的方式启动sequence。
使用default_sequence的方式非常简单,只需要在某个component(如my_env)的build_phase中设置如下代码即可:
代码清单 2-69
文件:src/ch2/section2.4/2.4.3/my_env.sv
&19&& virtual function void build_phase(uvm_phase phase);
&20&&&&& super.build_phase(phase);
&30&&&&& uvm_config_db#(uvm_object_wrapper)::set(this,
&31&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& &i_agt.sqr.main_phase&,
&32&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& &default_sequence&,
&33&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& my_sequence::type_id::get());
&35&& endfunction
这是除了在top_tb中通过config_db设置virtual interface后再一次用到config_db的功能。与在top_tb中不同的是,这里set函数的第一个参数由null变成了this,而第二个代表路径的参数则去除了uvm_test_top。事实上,第二个参数是相对于第一个参数的相对路径,由于上述代码是在my_env中,而my_env本身已经是uvm_test_top了,且第一个参数被设置为了this,所以第二个参数中就不需要uvm_test_top了。在top_tb中设置virtual interface时,由于top_tb不是一个类,无法使用this指针,所以设置set的第一个参数为null,第二个参数使用绝对路径uvm_test_top.xxx。
另外,在第二个路径参数中,出现了main_phase。这是UVM在设置default_sequence时的要求。由于除了main_phase外,还存在其他任务phase,如configure_phase、reset_phase等,所以必须指定是哪个phase,从而使sequencer知道在哪个phase启动这个sequence。
至于set的第三个和第四个参数,以及uvm_config_db#(uvm_object_wrapper)中为什么是uvm_object_wrapper而不是uvm_sequence或者其他,则纯粹是由于UVM的规定,用户在使用时照做即可。
其实,除了在my_env的build_phase中设置default_sequence外,还可以在其他地方设置,比如top_tb:
代码清单 2-70
module top_
initial begin
&& uvm_config_db#(uvm_object_wrapper)::set(null,
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& &uvm_test_top.i_agt.sqr.main_phase&,
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& &default_sequence&,
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& my_sequence::type_id::get());
这种情况下set函数的第一个参数和第二个参数应该改变一下。另外,还可以在其他的component里设置,如my_agent的build_phase里:
代码清单 2-71
function void my_agent::build_phase(uvm_phase phase);
& super.build_phase(phase);
& uvm_config_db#(uvm_object_wrapper)::set(this,
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& &sqr.main_phase&,
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& &default_sequence&,
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& my_sequence::type_id::get());
endfunction
只需要正确地设置set的第二个参数即可。
config_db通常都是成对出现的。在top_tb中通过set设置virtual interface,而在driver或者monitor中通过get函数得到virtual interface。那么在这里是否需要在sequencer中手工写一些get相关的代码呢?答案是否定的。UVM已经做好了这些,读者无需再把时间花在这上面。
使用default_sequence启动sequence的方式取代了上一节代码清单2-66中在sequencer的main_phase中手工启动sequence的相关语句,但是新的问题出现了:在上一节启动sequence前后,分别提起和撤销objection,此时使用default_sequence又如何提起和撤销objection呢?
在uvm_sequence这个基类中,有一个变量名为starting_phase,它的类型是uvm_phase,sequencer在启动default_sequence时,会自动做如下相关操作:
代码清单 2-72
task my_sequencer::main_phase(uvm_phase phase);
& seq.starting_phase =
& seq.start(this);
因此,可以在sequence中使用starting_phase进行提起和撤销 objection:
代码清单 2-73
文件:src/ch2/section2.4/2.4.3/my_sequence.sv
& 4 class my_sequence extends uvm_sequence #(my_transaction);
& 5&& my_transaction m_
&11&& virtual task body();
&12&&&& if(starting_phase != null)
&13&&&&&& starting_phase.raise_objection(this);
&14&&&& repeat (10) begin
&15&&&&&& `uvm_do(m_trans)
&16&&&& end
&17&&&& #1000;
&18&&&& if(starting_phase != null)
&19&&&&&& starting_phase.drop_objection(this);
&20&& endtask
&22&& `uvm_object_utils(my_sequence)
&23 endclass
从而,objection完全与sequence关联在了一起,在其他任何地方都不必再设置objection。
您对本文章有什么意见或着疑问吗?请到您的关注和建议是我们前行的参考和动力&&
您的浏览器不支持嵌入式框架,或者当前配置为不显示嵌入式框架。UVM通用验证方法学基础 - E课网 - 集成电路设计在线职业教育平台 - Powered By EduSohoCopyright (C) &&
&&Powered by&君,已阅读到文档的结尾了呢~~
uvm实战-学习笔记
扫扫二维码,随身浏览文档
手机或平板扫扫即可继续访问
uvm实战-学习笔记
举报该文档为侵权文档。
举报该文档含有违规或不良信息。
反馈该文档无法正常浏览。
举报该文档为重复文档。
推荐理由:
将文档分享至:
分享完整地址
文档地址:
粘贴到BBS或博客
flash地址:
支持嵌入FLASH地址的网站使用
html代码:
&embed src='/DocinViewer--144.swf' width='100%' height='600' type=application/x-shockwave-flash ALLOWFULLSCREEN='true' ALLOWSCRIPTACCESS='always'&&/embed&
450px*300px480px*400px650px*490px
支持嵌入HTML代码的网站使用
您的内容已经提交成功
您所提交的内容需要审核后才能发布,请您等待!
3秒自动关闭窗口

我要回帖

更多关于 randsequence 的文章

 

随机推荐