当前位置: 首页 > wzjs >正文

广州网站关键词优化推广网站动效怎么做的

广州网站关键词优化推广,网站动效怎么做的,内容型网站有哪些,做教育行业网站系列文章目录 【UVM学习笔记】UVM基础—一文告诉你UVM的组成部分 【UVM学习笔记】UVM中的“类” 文章目录 系列文章目录前言一、TLM是什么?二、put操作2.1、建立PORT和EXPORT的连接2.2 IMP组件 三、get操作四、transport端口五、nonblocking端口六、analysis端口七…

系列文章目录

【UVM学习笔记】UVM基础—一文告诉你UVM的组成部分
【UVM学习笔记】UVM中的“类”


文章目录

  • 系列文章目录
  • 前言
  • 一、TLM是什么?
  • 二、put操作
    • 2.1、建立PORT和EXPORT的连接
    • 2.2 IMP组件
  • 三、get操作
  • 四、transport端口
  • 五、nonblocking端口
  • 六、analysis端口
  • 七、monitor与scoreboard之间的通信
  • 八、使用FIFO通信
  • 总结


前言


一、TLM是什么?

TLM是Transaction Level Modeling(事务级建模)的缩写。所谓transaction level是相对DUT中各个模块之间信号线级别的通信来说的。
TLM通常有三种模式:

  1. put操作,通信的发起者A把一个transaction发送给B。在这个过程中,A称为“发起者”,而B称为“目标”。A具有的端口(用方框表示)称为PORT,而B的端口(用圆圈表示)称为EXPORT。这个过程中,数据流是从A流向B的。
  2. get操作。在这个过程中,A依然是“发起者”,B依然是“目标”,A上的端口依然是PORT,而B上的端口依然是EXPORT。这个过程中,数据流是从B流向A的。PORT和EXPORT体现的是控制流而不是数据流。

在这里插入图片描述

  1. transport操作,transport操作相当于一次put操作加一次get操作,这两次操作的“发起者”都是A,目标都是B。在这个过程中,数据流先从A流向B,再从B流向A。在现实世界中, 相当于是A向B提交了一个请求(request),而B返回给A一个应答(response)。

在这里插入图片描述

二、put操作

2.1、建立PORT和EXPORT的连接

UVM中使用connect函数来建立连接关系。如A要和B通信(A是发起者),那么可以这么写:A.port.connect(B.export)。下面是A的代码部分:

class A extends uvm_component;`uvm_component_utils(A)uvm_blocking_put_port#(my_transaction) A_port;function new(string name, uvm_component parent);super.new(name, parent);endfunctionextern function void build_phase(uvm_phase phase);extern virtual  task main_phase(uvm_phase phase);
endclassfunction void A::build_phase(uvm_phase phase);super.build_phase(phase);A_port = new("A_port", this);
endfunctiontask A::main_phase(uvm_phase phase);
endtask

然后得到B的代码:

class B extends uvm_component;`uvm_component_utils(B)uvm_blocking_put_export#(my_transaction) B_export;function new(string name, uvm_component parent);super.new(name, parent);endfunctionextern function void build_phase(uvm_phase phase);extern virtual  task main_phase(uvm_phase phase);
endclassfunction void B::build_phase(uvm_phase phase);super.build_phase(phase);B_export = new("B_export", this);
endfunctiontask B::main_phase(uvm_phase phase);
endtask

然后在env将两者进行链接

class my_env extends uvm_env;A   A_inst;B   B_inst;function new(string name = "my_env", uvm_component parent);super.new(name, parent);endfunctionvirtual function void build_phase(uvm_phase phase);super.build_phase(phase);A_inst = A::type_id::create("A_inst", this);B_inst = B::type_id::create("B_inst", this);endfunctionextern virtual function void connect_phase(uvm_phase phase);`uvm_component_utils(my_env)
endclassfunction void my_env::connect_phase(uvm_phase phase);super.connect_phase(phase);A_inst.A_port.connect(B_inst.B_export);
endfunction

2.2 IMP组件

除了TLM中定义的PORT与EXPORT外,UVM中加入了第三种端口:IMP,起作用相当于在EXPORT后进行接受操作。
添加IMP后,A的代码变为:

task A::main_phase(uvm_phase phase);my_transaction tr;repeat(10) begin#10;tr = new("tr");assert(tr.randomize());A_port.put(tr);end
endtask

在B中需要改动的要多一点:

class B extends uvm_component;`uvm_component_utils(B)uvm_blocking_put_export#(my_transaction) B_export;uvm_blocking_put_imp#(my_transaction, B) B_imp;function new(string name, uvm_component parent);super.new(name, parent);endfunctionextern function void build_phase(uvm_phase phase);extern function void connect_phase(uvm_phase phase);extern function void put(my_transaction tr);extern virtual  task main_phase(uvm_phase phase);
endclassfunction void B::build_phase(uvm_phase phase);super.build_phase(phase);B_export = new("B_export", this);B_imp = new("B_imp", this);
endfunctionfunction void B::connect_phase(uvm_phase phase);super.connect_phase(phase);B_export.connect(B_imp);
endfunctionfunction void B::put(my_transaction tr);`uvm_info("B", "receive a transaction", UVM_LOW) tr.print();
endfunction

在上述连接关系中,IMP是作为连接的终点。在UVM中,只有IMP才能作为连接关系的终点。如果是PORT或者EXPORT作为终点,则会报错。

三、get操作

get系列端口与put系列端口在某些方面完全相反。在这种连接关系中,数据流依然是从A到B,但是A由动作发起者变成了动作接收者,而B由动作接收者变成了动作发起者。
在这里插入图片描述
B_port的类型为uvm_blocking_get_port,A_export的类型为uvm_blocking_get_export,A_imp的类型为uvm_blocking_get_imp。A的代码为:

class A extends uvm_component;`uvm_component_utils(A)uvm_blocking_get_export#(my_transaction) A_export;uvm_blocking_get_imp#(my_transaction, A) A_imp;my_transaction tr_q[$];function new(string name, uvm_component parent);super.new(name, parent);endfunctionextern function void build_phase(uvm_phase phase);extern function void connect_phase(uvm_phase phase);extern virtual  task get(output my_transaction tr);extern virtual  task main_phase(uvm_phase phase);
endclassfunction void A::build_phase(uvm_phase phase);super.build_phase(phase);A_export = new("A_export", this);A_imp = new("A_imp", this);
endfunctionfunction void A::connect_phase(uvm_phase phase);super.connect_phase(phase);A_export.connect(A_imp); 
endfunctiontask A::get(output my_transaction tr);while(tr_q.size() == 0) #2;tr = tr_q.pop_front();
endtasktask A::main_phase(uvm_phase phase);my_transaction tr;repeat(10) begin#10;tr = new("tr");tr_q.push_back(tr); end
endtask

在A的get任务中,每隔2个时间单位检查tr_q中是否有数据,如果有则发送出去。当B在其main_phase调用get任务时,会最终执行A的get任务。在A的connect_phase,需要把A_export和A_imp连接起来。下面是B的部分:

class B extends uvm_component;`uvm_component_utils(B)uvm_blocking_get_port#(my_transaction) B_port;function new(string name, uvm_component parent);super.new(name, parent);endfunctionextern function void build_phase(uvm_phase phase);extern virtual  task main_phase(uvm_phase phase);
endclassfunction void B::build_phase(uvm_phase phase);super.build_phase(phase);B_port = new("B_port", this);
endfunctiontask B::main_phase(uvm_phase phase);my_transaction tr;while(1) beginB_port.get(tr);`uvm_info("B", "get a transaction", UVM_LOW) tr.print();end
endtask

在这些连接关系中,需要谨记的是连接的终点必须是一个IMP。

四、transport端口

在这里插入图片描述
A代码如下所示:

task A::main_phase(uvm_phase phase);my_transaction tr;my_transaction rsp;repeat(10) begin#10;tr = new("tr");assert(tr.randomize());A_transport.transport(tr, rsp);`uvm_info("A", "received rsp", UVM_MEDIUM)rsp.print();end
endtask

B中需要定义一个类型为uvm_blocking_transport_imp的IMP:

class B extends uvm_component;`uvm_component_utils(B)uvm_blocking_transport_imp#(my_transaction, my_transaction, B) B_imp;function new(string name, uvm_component parent);super.new(name, parent);endfunctionextern function void build_phase(uvm_phase phase);extern task transport(my_transaction req, output my_transaction rsp);
endclassfunction void B::build_phase(uvm_phase phase);super.build_phase(phase);B_imp = new("B_imp", this);
endfunctiontask B::transport(my_transaction req, output my_transaction rsp);`uvm_info("B", "receive a transaction", UVM_LOW) req.print();//do something according to req#5;rsp = new("rsp");
endtask

env中的代码是:

function void my_env::connect_phase(uvm_phase phase);super.connect_phase(phase);A_inst.A_transport.connect(B_inst.B_imp);
endfunction

在A中调用transport任务,并把生成的transaction作为第一个参数。B中的transaport任务接收到这笔transaction,根据这笔transaction做某些操作,并把操作的结果作为transport的第二个参数发送出去。A根据接收到的rsp来决定后面的行为。

五、nonblocking端口

task A::main_phase(uvm_phase phase);my_transaction tr;repeat(10) begintr = new("tr");assert(tr.randomize());while(!A_port.can_put()) #10;void'(A_port.try_put(tr));end
endtask

由于端口变为了非阻塞的,所以在送出transaction之前需要调用can_put函数来确认是否能够执行put操作。can_put最终会调用B中的can_put:

六、analysis端口

UVM中还有两种特殊的端口:analysis_port和analysis_export。该端口有两点需要注意的地方:

  • 一个analysis_port(analysis_export)可以连接多个IMP,analysis_port(analysis_export)与IMP 之间的通信是一对多的通信。analysis_port(analysis_export)更像是一个广播。
  • put与get系列端口都有阻塞和非阻塞的区分。但是对于analysis_port和analysis_export来说,没有阻塞和非阻塞的概念。

一个analysis_port可以和多个IMP相连接进行通信,但是IMP的类型必须是uvm_analysis_imp,否则会报错。
在这里插入图片描述
下面是A的代码:

class A extends uvm_component;`uvm_component_utils(A)uvm_analysis_port#(my_transaction) A_ap;function new(string name, uvm_component parent);super.new(name, parent);endfunctionextern function void build_phase(uvm_phase phase);extern virtual  task main_phase(uvm_phase phase);
endclassfunction void A::build_phase(uvm_phase phase);super.build_phase(phase);A_ap = new("A_ap", this);
endfunctiontask A::main_phase(uvm_phase phase);my_transaction tr;repeat(10) begin#10;tr = new("tr");assert(tr.randomize());A_ap.write(tr);end
endtask

A的代码很简单,只是简单地定义一个analysis_port,并在main_phase中每隔10个时间单位写入一个transaction。
B的代码为:

function void B::write(my_transaction tr);`uvm_info("B", "receive a transaction", UVM_LOW) tr.print();
endfunction

在env中通过下面方式进行连接:

function void my_env::connect_phase(uvm_phase phase);super.connect_phase(phase);A_inst.A_ap.connect(B_inst.B_imp);A_inst.A_ap.connect(C_inst.C_imp);
endfunction

上面只是一个analysis_port与IMP相连的例子。analysis_export和IMP也可以这样相连接,只需将上面例子中的uvm_analysis_port改为uvm_analysis_export就可以。

七、monitor与scoreboard之间的通信

和上一个一样,在两段分别进行定义,monitor的代码为:

task my_monitor::main_phase(uvm_phase phase);my_transaction tr;while(1) begintr = new("tr");collect_one_pkt(tr);ap.write(tr);end
endtask

scoreboard的代码为:

function void my_scoreboard::write_monitor(my_transaction tr);my_transaction  tmp_tran;bit result;if(expect_queue.size() > 0) begintmp_tran = expect_queue.pop_front();result = tr.compare(tmp_tran);if(result) begin `uvm_info("my_scoreboard", "Compare SUCCESSFULLY", UVM_LOW);endelse begin`uvm_error("my_scoreboard", "Compare FAILED");$display("the expect pkt is");tmp_tran.print();$display("the actual pkt is");tr.print();endendelse begin`uvm_error("my_scoreboard", "Received from DUT, while Expect Queue is empty");$display("the unexpected pkt is");tr.print();end
endfunction

之后在env中可以使用connect连接。
由于monitor与scoreboard在UVM树中并不是平等的兄妹关系,这里选择下面的连接方式:
在agent中声明一个ap,但是不实例化它,让其指向monitor中的ap。在env中可以直接连接agent的ap到scoreboard的imp:

agent:
class my_agent extends uvm_agent ; uvm_analysis_port #(my_transaction) ap; ...  function void my_agent::connect_phase(uvm_phase phase); ap = mon.ap; ...  endfunction 
endclass 
env:
function void my_env::connect_phase(uvm_phase phase); o_agt.ap.connect(scb.scb_imp); ...  
endfunction

在上面的例子中,scoreboard只接收一路数据。但在现实情况中,scoreboard除了接收monitor的数据之外,还要接收reference model的数据。相应的scoreboard就要再添加一个 uvm_analysis_imp的IMP。此时问题就出现了,由于接收到的两路数据应该做不同的处理,所以这个新的IMP也要有一个write任务与其对应。但是write只有一个,怎么办?
可以使用宏定义的方法:

`uvm_analysis_imp_decl(_monitor)
`uvm_analysis_imp_decl(_model)
class my_scoreboard extends uvm_scoreboard;my_transaction  expect_queue[$];uvm_analysis_imp_monitor#(my_transaction, my_scoreboard) monitor_imp; uvm_analysis_imp_model#(my_transaction, my_scoreboard) model_imp;`uvm_component_utils(my_scoreboard)extern function new(string name, uvm_component parent = null);extern virtual function void build_phase(uvm_phase phase);extern virtual task main_phase(uvm_phase phase);
endclass 

上述代码通过宏uvm_analysis_imp_decl声明了两个后缀_monitor和_model。
当与monitor_imp相连接的analysis_port执行write函数时,会自动调用write_monitor函数,而与model_imp相连接的analysis_port执行write 函数时,会自动调用write_model函数。

八、使用FIFO通信

使用fifo的方法能够让两个端口都能实现主动的接收,因此下面的例子便是利用FIFO来实现monitor和scoreboard的通信。
FIFO的本质是一块缓存加两个IMP。在monitor与FIFO的连接关系中,monitor中依然是analysis_port,FIFO中是uvm_analysis_imp,数据流和控制流的方向相同。在scoreboard与FIFO的连接关系中,scoreboard中使用blocking_get_port端口:

class my_scoreboard extends uvm_scoreboard;my_transaction  expect_queue[$];uvm_blocking_get_port #(my_transaction)  exp_port[16];uvm_blocking_get_port #(my_transaction)  act_port;`uvm_component_utils(my_scoreboard)extern function new(string name, uvm_component parent = null);extern virtual function void build_phase(uvm_phase phase);extern virtual task main_phase(uvm_phase phase);
endclass 

而FIFO中使用的是一个get端口的IMP。在这种连接关系中,控制流是从scoreboard到FIFO,而数据流是从FIFO到scoreboard。

在env中连接方式如下:

function void my_env::connect_phase(uvm_phase phase);super.connect_phase(phase);i_agt.ap.connect(agt_mdl_fifo.analysis_export);mdl.port.connect(agt_mdl_fifo.blocking_get_export);for(int i = 0; i < 16; i++) beginmdl.ap[i].connect(mdl_scb_fifo[i].analysis_export);scb.exp_port[i].connect(mdl_scb_fifo[i].blocking_get_export);endo_agt.ap.connect(agt_scb_fifo.analysis_export);scb.act_port.connect(agt_scb_fifo.blocking_get_export); 
endfunction

FIFO中有两个IMP,但是在上面的连接关系中,FIFO中却是EXPORT,这是为什么呢?实际上,FIFO中的analysis_export和blocking_get_export虽然名字中有关键字export,但是其类型却是IMP。UVM为了掩饰IMP的存在,在它们的命名中加入了export关键字。
但事实上,FIFO上的端口并不局限于上述两个,一个FIFO中有众多的端口。端口列表如下:

总结

总结来说,这一章主要讲了数据在UVM中的传递方式,学习这一章可以更好的编写灵活性更高的UVM代码。


文章转载自:

http://qbm0GCQt.dbxss.cn
http://lJlHXTFD.dbxss.cn
http://s576PoGX.dbxss.cn
http://vhGd08CW.dbxss.cn
http://FiJD7Yj6.dbxss.cn
http://SUP0fqSt.dbxss.cn
http://yxDISbaX.dbxss.cn
http://NEA99fWY.dbxss.cn
http://KqY12N20.dbxss.cn
http://3IcVxDGT.dbxss.cn
http://mLbea0iA.dbxss.cn
http://1GdqbMbH.dbxss.cn
http://UxtEODoC.dbxss.cn
http://fRBKk1na.dbxss.cn
http://kQwzREWx.dbxss.cn
http://ZArE8YPd.dbxss.cn
http://x6DrN1Ib.dbxss.cn
http://KU5ZnkOL.dbxss.cn
http://x0LGtcWi.dbxss.cn
http://5XtzYOmN.dbxss.cn
http://jjV4cQNr.dbxss.cn
http://kHDXsyuj.dbxss.cn
http://jqKFuxEo.dbxss.cn
http://WvUFGTtu.dbxss.cn
http://AzxuUaKw.dbxss.cn
http://LKeBGQlP.dbxss.cn
http://HVB1bB35.dbxss.cn
http://3sTr13Zu.dbxss.cn
http://lajmrBgJ.dbxss.cn
http://lJEYPF5N.dbxss.cn
http://www.dtcms.com/wzjs/606061.html

相关文章:

  • 快三竞猜网站建设小程序开发费用明细
  • 安徽网站建设费用郑州企业网站建站模板
  • 软件开发详细设计文档网站做优化好还是做推广好
  • 做网站按页面收费wordpress评论框提示
  • 网站模板登录模块wordpress改变上传目录权限
  • 重庆 网站 建设 公司网站定制文章列表项怎么做
  • 桂林景区网站策划工信部备案网站查
  • flask网站开发视频php网站带数据库
  • 缘魁上海网站建设高端网站制作哪家好
  • 北京建设公司的网站做购物网站的初衷
  • 莆田做网站价格富阳网站建设服务
  • 教育企业重庆网站建设学校网站建设情况
  • 建设银行东航龙卡登录东航网站自己做个影视app需要多少钱
  • 长沙营销企业网站建设营销技巧培训ppt
  • phpstudy 网站空白湖北做网站的公司
  • 手机端网站关键字排名域名解析错误连不上网
  • 阜宁网站制作选哪家优秀广告案例分析
  • 做网站电话号码海拉尔网页设计
  • 郑州做网站公司天强科技如何做可以微信转发的网站
  • 网站如何做首面关键词网站建设与域名备案
  • 泛微 企业网站建设计划成都成立公司
  • 海南住房和城乡建设厅网站首页wordpress集团网站
  • 精能集团有限公司两学一做网站保定公司网站建设
  • 自助建站免费自助建站网站企业网站Wap在线生成
  • 自助建站系统步骤哈尔滨信息网租房信息
  • 精品课程网站设计说明范文微信公众号 做不了微网站吗
  • 刷单做任务的网站h5企业网站开发
  • 全国新农村建设中心网站深圳网页设计培训费用
  • 昆明有哪些帮忙做网站的公司嘉兴本地推广网站有哪些
  • 坪山网站建设流程民宿客栈网站制作