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

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

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
楼主: doogo

[原创] 《UVM实战》24小时问答

[复制链接]
发表于 2015-10-21 15:48:31 | 显示全部楼层
本帖最后由 jiurizhizi 于 2015-10-21 15:50 编辑

源代码 3.3.4节 my_transaction中加入if(is_vlan)...,并把crc配置为UVM_NOPACK之后,my_monitor中task:collect_one_package是否需要做相应的更新?不然怎么去修正更改时Monitor收集数据时pload的size?
发表于 2015-10-25 21:27:25 | 显示全部楼层
写的不错,情况考虑的比较周到
发表于 2015-11-12 15:08:21 | 显示全部楼层
谢谢分享!!
发表于 2015-11-12 16:57:31 | 显示全部楼层
不错的书,看完第二章,我已爱得无法自拔
发表于 2015-11-17 10:02:31 | 显示全部楼层
2014年7月第一版第一次印刷的版本:3.4.2节,第78页,有一段话:
但是经过代码清单3-58的设置后,输出变为:
UVM_ERROR my_driver.sv(29) @ 1100000: uvm_test_top.env.i_agt_drv [my_driver]  this information is warning , but prints as UVM_ERROR
这个地方应该是个笔误吧? 应该是
但是经过代码清单3-59的设置后,输出变为:
发表于 2015-11-18 10:45:08 | 显示全部楼层
thanks
发表于 2015-11-18 15:45:48 | 显示全部楼层
在你的书中有这样一个例子,代码如下:
class sequence0 extends uvm_sequence #(my_transaction);
   my_transaction m_trans;

   function  new(string name= "sequence0");
      super.new(name);
   endfunction
   
   virtual task body();
      if(starting_phase != null)
         starting_phase.raise_objection(this);
      repeat (5) begin
         `uvm_do(m_trans)
         `uvm_info("sequence0", "send one transaction", UVM_MEDIUM)
      end
      #100;
      if(starting_phase != null)
         starting_phase.drop_objection(this);
   endtask

   `uvm_object_utils(sequence0)
endclass

class sequence1 extends uvm_sequence #(my_transaction);
   my_transaction m_trans;

   function  new(string name= "sequence1");
      super.new(name);
   endfunction
   
   virtual task body();
      if(starting_phase != null)
         starting_phase.raise_objection(this);
      repeat (3) begin
         `uvm_do_with(m_trans, {m_trans.pload.size < 500;})
         `uvm_info("sequence1", "send one transaction", UVM_MEDIUM)
      end
      grab();
      `uvm_info("sequence1", "grab the sequencer ", UVM_MEDIUM)
      repeat (4) begin
         `uvm_do_with(m_trans, {m_trans.pload.size < 500;})
         `uvm_info("sequence1", "send one transaction", UVM_MEDIUM)
      end
      `uvm_info("sequence1", "ungrab the sequencer ", UVM_MEDIUM)
      ungrab();
      repeat (3) begin
         `uvm_do_with(m_trans, {m_trans.pload.size < 500;})
         `uvm_info("sequence1", "send one transaction", UVM_MEDIUM)
      end
      #100;
      if(starting_phase != null)
         starting_phase.drop_objection(this);
   endtask

   `uvm_object_utils(sequence1)
endclass


class my_case0 extends base_test;

   function new(string name = "my_case0", uvm_component parent = null);
      super.new(name,parent);
   endfunction
   `uvm_component_utils(my_case0)
   extern virtual task main_phase(uvm_phase phase);
endclass

task my_case0::main_phase(uvm_phase phase);
   sequence0 seq0;
   sequence1 seq1;

   seq0 = new("seq0");
   seq0.starting_phase = phase;
   seq1 = new("seq1");
   seq1.starting_phase = phase;
   fork
      seq0.start(env.i_agt.sqr);
      seq1.start(env.i_agt.sqr);
   join
endtask
这里使用了sequencer的grab操作。
如果将sequence1的grab();以及ungrab();换成lock();和unlock();运行情况如下:
在lock语句之前,sequence0和sequence1交替产生transaction;在lock语句后,一直发送sequence1的transaction,知道unlock语句被调用后,sequence0和sequence1又开始交替产生transaction。
但是,如果是grab运行情况又是什么呢?
书中对grab操作的描述是这样的:与lock操作一样。grab操作也用于暂时拥有sequencer的所有权,只是grab操作比lock操作优先级更高,lock请求被插入sequencer仲裁队列的最后面,等到它时,它前面的仲裁请求都已结束。grab请求则被放入sequencer仲裁队列的最前面,它几乎是一出发就拥有了sequencer的所有权。
按照这个逻辑,sequence1也要等到grab前面的语句执行完毕之后才能获得sequencer的所有权,运行的情况不合lock的时候是一样吗?
发表于 2015-11-22 11:02:28 | 显示全部楼层
多谢楼主分享,很受用!
发表于 2015-12-8 14:19:05 | 显示全部楼层
我是刚想入门的新手,要好好拜读一下。谢谢楼主。
发表于 2015-12-9 03:49:37 | 显示全部楼层
thnx!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /1 下一条


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

GMT+8, 2024-11-7 04:40 , Processed in 0.021731 second(s), 7 queries , Gzip On, Redis On.

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