luyuan_0922的个人空间 https://blog.eetop.cn/106870 [收藏] [复制] [分享] [RSS]

空间首页 动态 记录 日志 相册 主题 分享 留言板 个人资料

日志

uvm_sequence_base (2011-10-24 16:26:00)

已有 1790 次阅读| 2015-3-25 11:24 |个人分类:uvm

转 

liu_uestc的博客

的一篇文章

先抄过来再看。

uvm_sequence_base

 (2011-10-24 16:26:00)
标签: 

uvm

 

sequence

 

sequence_base

 

it

分类: uvm

preface

   uvm_sequence_base是一个比较关键的类,该类实现了一个item的构成的流;同时该类本省也继承自item,这样该类也可以包含若干uvm_sequence_base构成的流。

 一个sequence的执行大致分为几种方法,这些方法都直接或者间接地调用了<start_item>/<finish_item> 或者调用宏`uvm_do_* macros。下边把这几种方法简单介绍下:

 1.Executing sequences via <start>:

   A sequence's <start> method has a ~parent_sequence~ argument that controls
   whether <pre_do>, <mid_do>, and <post_do> are called *in the parent*      
   sequence. It also has a ~call_pre_post~ argument that controls whether its
    <pre_body> and <post_body> methods are called.                            
  The sequence execution flow looks like

   User code                                                                            
   sub_seq.randomize(...); // optional                         
   sub_seq.start(seqr, parent_seq, priority, *call_pre_post*)                        

   The following methods are called, in order                                                  
   sub_seq.pre_body           (task)  if call_pre_post==1    
     parent_seq.pre_do(0)     (task)  if parent_sequence!=null
     parent_seq.mid_do(this)  (func)  if parent_sequence!=null
   sub_seq.body               (task)  YOUR STIMULUS CODE     
     parent_seq.post_do(this) (func)  if parent_sequence!=null
   sub_seq.post_body          (task)  if call_pre_post==1    

  2.Executing sub-sequences via <start_item>/<finish_item> or `uvm_do macros:

   A sequence can also be indirectly started as a child in the <body> of a  
parent sequence. The child sequence's <start> method is called indirectly
via calls to its <start_item>/<finish_item> methods or by invoking       
any of the `uvm_do macros. Child sequences can also be started by        
the predefined sequences, <uvm_random_sequence> and                      
<uvm_exhaustive_sequence>. In all these cases, <start> is called with    
~call_pre_post~ set to 0, preventing the started sequence's <pre_body> and
<post_body> methods from being called. During execution of the           
child sequence, the parent's <pre_do>, <mid_do>, and <post_do> methods   
are called

  User code                                                                   
                                                                             
| parent_seq.start_item(sub_seq, priority);                                  
| sub_seq.randomize(...);                                                    
| parent_seq.finish_item(sub_seq);                                           
                                                                           
| or                                                                         
                                                                           
| `uvm_do_with_prior(seq_seq, { constraints }, priority)                     
                                                                           
                                                                             
 The following methods are called, in order                                  
                                                                             
                                                                           
  parent_seq.pre_do(0)        (task)                                       
  parent_req.mid_do(sub_seq)  (func)                                       
    sub_seq.body              (task)                                       
  parent_seq.post_do(sub_seq) (func)                                       
                                                                             
 Remember, it is the *parent* sequence's pre|mid|post_do that are called, not
 the sequence being executed.                                                
 3. Executing sequence items via <start_item>/<finish_item> or `uvm_do macros:

  Items are started in the <body> of a parent sequence via calls to 
<start_item>/<finish_item> or invocations of any of the `uvm_do   
macros. The <pre_do>, <mid_do>, and <post_do> methods of the parent
sequence will be called as the item is executed.                  
 User code                                                            
                                                                      
| parent_seq.start_item(item, priority);                              
| sub_seq.randomize(...) [with {constraints}];                        
| parent_seq.finish_item(item);                                       
                                                                    
| or                                                                  
                                                                    
| `uvm_do_with_prior(item, constraints, priority)                     
                                                                    
                                                                      
 The following methods are called, in order                           
                                                                      
                                                                    
  sequencer.wait_for_grant(prior) (task) \ start_item  \            
  parent_seq.pre_do(1)            (task) /              \           
                                                     `uvm_do* macros
  parent_seq.mid_do(item)         (func) \              /           
  sequencer.send_request(item)    (func)  \finish_item /            
  sequencer.wait_for_item_done()  (task)  /                         
  parent_seq.post_do(item)        (func) /                          
4.属性

  protected uvm_sequence_state m_sequence_state;//枚举,查看base globals
            int                m_next_transaction_id = 1;//下一个数据的id
  local     int                m_priority = -1;
            int                m_tr_handle;//在recorder中的句柄
            int                m_wait_for_grant_semaphore;//记录的是发起了多少个发送数据的请求

  // Each sequencer will assign a sequence id.  When a sequence is talking to multiple
  // sequencers, each sequence_id is managed seperately

  //一个sequence在sequencer中注册一次就会分配一个全局的sequence_id
  protected int m_sqr_seq_ids[int]

  protected uvm_sequence_item response_queue[$];//存储来自driver的响应
  protected int               response_queue_depth = 8;
  protected bit               response_queue_error_report_disabled = 0;//比如driver返回的响应在队列中溢出了打印报告,这个就是来控制打印不打印的

  rand bit is_randomized = 0;
  constraint c_randomized {
    is_randomized == 1;
  }


  protected process  m_sequence_process;//squence的进程
  local bit m_use_response_handler = 0;

  static string type_name = "uvm_sequence_base";

  // bits to detect if is_relevant()/wait_for_relevant() are implemented
  local bit is_rel_default;
  local bit wait_rel_default;                                                          
5. function new (string name = "uvm_sequence");//设置sequence的状态为m_sequence_state = CREATED;发出的传输数据的请求为m_wait_for_grant_semaphore = 0

6.virtual function bit is_item();返回零,表示不是item,妈的,这就是通过属性实现多态性的余孽

7.function uvm_sequence_state_enum get_sequence_state();

8.task wait_for_sequence_state(uvm_sequence_state_enum state);等待m_sequence_state == state

  //--------------------------
  // Group: Sequence Execution
  //--------------------------

9.  virtual task start (uvm_sequencer_base sequencer,
                      uvm_sequence_base parent_sequence = null,
                      integer this_priority = 100,
                      bit call_pre_post = 1);

  9.1 如果sequence还没执行完成,就报告出错

  9.2 this_priority检查这个值设置是否违规

  9.3 clear_response_queue();

  9.4 把arguments中的值设置到属性

  9.5 分结构化的sequence和单个sequence分别调用sequencer的记录器记录本实例

  9.6 设置sequence_id

  9.7 清空sequencer_id_sequence_id队列

  9.8 在对应的sequencer中注册本sequence

  9.9 开一个进程m_sequence_process = process::self();实现1中的调用过程

  9.10 sequencer中的记录器结束记录

  9.11 调用m_sequencer.m_sequence_exiting(this)执行

10. callbacks null

  virtual task pre_body();

   virtual task pre_do(bit is_item);

   virtual function void mid_do(uvm_sequence_item this_item);

   virtual task body();

    virtual function void post_do(uvm_sequence_item this_item);

   virtual task post_body();

  11.uvm_phase starting_phase;在sequencer中的适当阶段本sequence中的start会被调用

  //------------------------
  // Group: Sequence Control
  //------------------------

  12.function void set_priority (int value);

  13.function int get_priority();

  14.virtual function bit is_relevant();sequencer会对所有发出请求的sequence并且没有阻塞的sequence进行仲裁,仲裁前会检查is_relevent,如果这个返回0就会等待这个sequence的is_relevent返回1,在让这个sequence参加仲裁;

  15. virtual task wait_for_relevant();参考14,被sequencer调用

  16. task lock(uvm_sequencer_base sequencer = null);//让sequencer把本sequence锁住,就是暂时不要仲裁给本sequence

  17.task grab(uvm_sequencer_base sequencer = null);//告诉sequencer本sequence应该放在总裁队列的grabers的末尾,相对优先的被仲裁

  18.function void  unlock(uvm_sequencer_base sequencer = null);

  19.function void  ungrab(uvm_sequencer_base sequencer = null);

  20.function bit is_blocked();

  21.function bit has_lock();

  22. function void kill();对m_sequence_process的进程的操作

  23.virtual function void do_kill(); null

  24.function void m_kill();参考22

  //-------------------------------
  // Group: Sequence Item Execution
  //-------------------------------

  25.   protected function uvm_sequence_item create_item(uvm_object_wrapper type_var,
                                                   uvm_sequencer_base l_sequencer, string name);

  //调用工厂创建一个uvm_sequence_item并对一些属性惊醒设置

 26.   virtual task m_start_item_or_seq(uvm_sequencer_base sequencer,
                                   uvm_sequence_item parent_seq,
                                   int set_priority);//改写了item中的函数

 27.  virtual task m_finish_item(uvm_sequencer_base sequencer,
                             uvm_sequence_item parent_seq,
                             int set_priority = -1);//改写item中的函数

 28.virtual task wait_for_grant(int item_priority = -1, bit lock_request = 0);//调用sequencer中的本函数, 该函数让sequence给sequencer发起一个发包请求,sequencer进行仲裁后返回,sequence得到返回后立即调用send_request。当然这些操作都是在sequencer中间接调用sequence中的东西来实现的

 29. virtual function void send_request(uvm_sequence_item request, bit rerandomize = 0);//调用sequencer中的send_request实现,该函数中调用sequence中的函数,设置sequence产生的数据,如transaction_id然后传递给driver

 30.virtual task wait_for_item_done(int transaction_id = -1);等待driver用完item给出反馈

  // Group: Response API
  //--------------------

 31. function void use_response_handler(bit enable);

     function bit get_use_response_handler();

 32.virtual function void response_handler(uvm_sequence_item response);//null

 33.function void set_response_queue_error_report_disabled(bit value);

    function bit get_response_queue_error_report_disabled();

 34.function void set_response_queue_depth(int value);

      function int get_response_queue_depth();

 35. virtual function void put_response (uvm_sequence_item response_item);

 36. virtual task get_base_response(output uvm_sequence_item response, input int transaction_id = -1);//在response_queque中找到对应的东西

  //------------------------
  // Group- Sequence Library DEPRECATED
  //------------------------

 37. rand int unsigned seq_kind;

 38.function int get_seq_kind(string type_name);//调用sequencerm_sequencer.get_seq_kind(type_name)实现

 39. function uvm_sequence_base get_sequence(int unsigned req_kind);//返回m_seq_type = m_sequencer.sequences[req_kind];

 40. task do_sequence_kind(int unsigned req_kind);//该函数返回一个req_kind的sequence

 41. function uvm_sequence_base get_sequence_by_name(string seq_name);//返回一个seq_name的sequence

 42.task create_and_start_sequence_by_name(string seq_name);//create_and_start_sequence_by_name

 43.function int m_get_sqr_sequence_id(int sequencer_id, bit update_sequence_id);

 44.function void m_set_sqr_sequence_id(int sequencer_id, int sequence_id);

 45.virtual function uvm_sequence_item create_request ();

 46.virtual function uvm_sequence_item create_response ();

location:

 C:\Documents and Settings\zhliu\Desktop\uvm-1.0p1\src\seq\uvm_sequence_base.svh


点赞

全部作者的其他最新日志

发表评论 评论 (1 个评论)

回复 luyuan_0922 2015-3-25 19:06
排版还是不行,,算了,贴上原文链接: http://blog.sina.com.cn/s/blog_466496f30100ygis.html :lol :lol :lol

facelist

您需要登录后才可以评论 登录 | 注册

  • 关注TA
  • 加好友
  • 联系TA
  • 0

    周排名
  • 0

    月排名
  • 0

    总排名
  • 0

    关注
  • 4

    粉丝
  • 1

    好友
  • 1

    获赞
  • 11

    评论
  • 1002

    访问数
关闭

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

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

GMT+8, 2024-4-25 09:42 , Processed in 0.017643 second(s), 9 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
返回顶部