在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 3808|回复: 13

[求助] UVM 交互式怎么完成?

[复制链接]
发表于 2017-8-24 15:57:04 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

x
拜读了UVM各种资料,也没有找到我考虑的问题,问题如下:
uvm_driver 发送第一个transaction 给DUT,
DUT根据收到的当前这个transaction发送一笔资料回去,
uvm_driver 发送第二个transaction必须根据 DUT发送的内容来发送相应特定的内容(不能乱发)。


这样的来回几个回合,完成注册过程。
发表于 2017-8-24 16:17:43 | 显示全部楼层
"完成注册过程" 是指什麼?
发表于 2017-8-24 17:14:00 | 显示全部楼层
是不是指“req, resp"的过程。
 楼主| 发表于 2017-8-24 17:47:51 | 显示全部楼层
回复 3# yuanpin318


   可以这么说,但单单是UVM里面put_respone(), get_response().
 楼主| 发表于 2017-8-24 17:58:44 | 显示全部楼层
回复 2# kuolifeng

   a: driver   b: dut

   就是 a 发送一个微信给 b, 告诉b, “你晚上来不来吃饭啊?”
   #第一种情况>>>
   b说,“晚上要加班,去不了了”。

   a 得到这信息就在 发一个微信给b, "那我就取消这次饭局了"。
   。。。。。。
   #第一种情况<<<

   #第二种情况===
    b说,“好的,我6点准时出发”;
    a得到肯定的答案后,发微信告诉b,“那我马上定个包间”;
    。。。。。。
   #第二种情况===

   后面还有一堆的对话,但a除了第一次说“你晚上来不来吃饭啊?”这句以外,其他的对话都是根据b的回复来发送 特定的微信内容

   就是这个意思,不知道我说清楚了没?
发表于 2017-8-24 18:17:56 | 显示全部楼层
1. 建一个transcation,讲DUT需要发送的数据放到里面去
2. 在driver和testbench的top文件各建一个analysis端口,各自连到对方的模块里面。
3. 在各自模块的analysis的write函数下可以很方便的实时调用各自transaction的数据,可以写你想要的逻辑。
发表于 2017-8-25 08:59:03 | 显示全部楼层
1、可以交互,在mon中根据你采集dut的内容控制drv的发送情况或者直接构造复杂的测试seq。但你认为这样做好吗?

2、为什么要交互呢?你只要给不同的简单激励,测试dut的输出是否符合你的预期就ok了。硬件是讲究时序和通路的。只要这个配合的好,我管你a和b交互多少次,说多少话。
 楼主| 发表于 2017-8-25 09:21:48 | 显示全部楼层
回复 7# qyxu1979


那你是对家里的路由器不了解,要是不和局端交互的对话的话,你以为家里的路由器一插电线板就能上网了。要是你家的路由器说话不对路,你就别指望能上网了,那它唯一的功能就是费电。

这样说,不知道能不能说清交互的重要性?
 楼主| 发表于 2017-8-25 09:28:52 | 显示全部楼层
回复 6# jimbo1006


   这种想法我最初也是大致这样想的。发帖的目的是看看UVM有没有自带这种function,毕竟UVM源代码没有看过,不知道里面到底有多少好东西。
发表于 2017-8-25 09:40:03 | 显示全部楼层
some example of req, resp in the driver/sequence:
my_sequence extends uvm_sequence #(my_sequence_item1, (my_sequence_item2); // type of req = my_sequence_item1, type of rsp = my_sequence_item2
  .....
  task body();
    // Step 1 - Creation
    req = my_sequence_item1::type_id::create("req"); // type of req = my_sequence_item1
    // Step 2 - Ready - start_item()
    start_item(req);
    // Step 3 - Set
    if(!req.randomize() with {address inside {[0:32'h4FFF_FFFF]};})
    begin
      `uvm_error("body", "randomization failure for req")
    end
    // Step 4 - Go - finish_item()
    finish_item(req);
    // Step 5 - Response - get_response()
    get_response(rsp); // type of rsp = my_sequence_item2
  endtask: body
endclass: my_sequence

class my_driver extends uvm_driver #(my_sequence_item);
  my_interface vif;
  .....
  task run_phase(uvm_phase phase);
    forever
    begin
      seq_item_port.get_next_item(req); // Blocking call returning the next transaction
      @(posedge vif.clk);
      vif.addr = req.address; // vif is the drivers Virtual Interface
      //
      // etc
      //
      // End of bus cycle
      if(req.read_or_write == READ)
      begin // Assign response data to the req fields
        req.rdata = vif.rdata;
      end
      rsp = my_sequence_item2::type_id::create("rsp"); // type of rsp = my_sequence_item2
      req.resp = vif.error; // Assign response to the req_item response field
      seq_item_port.item_done(rsp); // Signal to the sequence that the driver has finished with the item
    end
  endtask: run
endclass: my_driver
您需要登录后才可以回帖 登录 | 注册

本版积分规则

×

小黑屋| 手机版| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-11-5 12:43 , Processed in 0.025453 second(s), 8 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表