sequence中的objection的控制、sv和.svh区别等

1、sequence中的objection的控制策略(白P154)

在整颗UVM树中,树的结点很多,理论来说在任何组件中都可以控制objection。一般在sequence和virtual sequence中,也有在scoreboard和test中。
一般来说,在一个实际的验证平台中,通常会有以下两种objection的控制策略:
第一种:
在scoreboard中进行控制,但要注意当收集到指定数量的数据后,利用fork…join_any跳出循环。
第二种:
在sequence中提起sequencer的objection,当sequence完成后,再撤销此objection。

class case0_sequence extends uvm_sequence #(my_transaction);
   my_transaction m_trans;
   function  new(string name= "case0_sequence");
      super.new(name);
   endfunction 
   virtual task body();
      if(starting_phase != null)                 //
         starting_phase.raise_objection(this);   //置起objection
      repeat (10) begin
         `uvm_do(m_trans)
      end
      #100;
      if(starting_phase != null)                 //
         starting_phase.drop_objection(this);    //撤销objection
   endtask
   `uvm_object_utils(case0_sequence)
endclass

以上两种方式在验证平台中都有应用。其中第二种用的最多,这也是UVM提倡的方式。UVM的设计哲学就是全部由sequence来控制激励的生成,因此一般情况下只在sequence中控制objection。

virtual sequence中objection的控制策略

一般来说,有三个地方可以控制objection。一是普通的sequence,二是中间层的virtual sequence,三是最顶层的virtual sequence。
一般只在最顶层的virtual sequence中控制objection。因为virtual sequence是起统一调度作用的,这种统一调度不只体现在transaction上,也应该体现在objection上。同时在仿真时,经常会出现仿真没有按照预期的结束,这样就不需要层层的查找,从而提高debug的效率。

class case0_sequence extends uvm_sequence #(my_transaction);  //virtual sequence
   my_transaction m_trans;
   function  new(string name= "case0_sequence");
      super.new(name);
   endfunction 
   virtual task body();
      crc_seq cseq;
      long_seq lseq;
      if(starting_phase != null) 
         starting_phase.raise_objection(this);   //raise objection
      repeat (10) begin
         `uvm_do(cseq)
         `uvm_do(lseq)
      end
      #100;
      if(starting_phase != null) 
         starting_phase.drop_objection(this);  //drop objection
   endtask
   `uvm_object_utils(case0_sequence)
endclass

uvm1.2starting_phase不在推荐使用,即使使用default_sequence,也不会给starting_phase自动赋值,sequence中starting_phase仍然为null。建议使用手动启动seq的方式,手动赋值。

 2、.sv和.svh区别

用途:一般是开发验证ip--vip可以用,然后发布给别人的时候可以把sv加密起来,让别人可以看到svh文件,但是具体实现的sv文件看不到

流程:
一般就是开发验证ip--VIP,在.svh文件里面定义一些类,方法和成员变量。
然后在sv文件,对这些方法具体实现。
然后在pkg.sv文件里面,把这些sv文件和svh文件全部include进来。
最后编译的时候就只需要编译pkg.sv文件就好了。

system verilog中sv文件和svh文件的区别原文链接在此

在SystemVerilog中,.sv文件和.svh文件都是用于描述硬件设计的文件,但它们有一些区别:

1. 文件类型:.sv文件是SystemVerilog的源代码文件,可以包含module、interface、package等定义,支持完整的SystemVerilog语法。而.svh文件是SystemVerilog的头文件,主要用于声明重复使用的类型、宏定义、枚举等,不包含具体的实现代码。

2. 编译方式:.sv文件可以独立编译,用于实例化和连接模块。而.svh文件一般被包含在其他的.sv文件中,用于共享类型和宏定义。

3. 作用域:.sv文件的作用域是文件级别,声明的module、interface等可以全局使用。而.svh文件的作用域是被包含文件的范围,只在包含的文件中有效。

4. 预处理指令:.svh文件可以包含预处理指令,比如`define、`ifdef等,用于编译时宏替换和条件编译。.sv文件也可以使用预处理指令,但通常在.svh文件中定义宏。

5. 实例化:.sv文件可以被实例化为具体的模块,并生成硬件。而.svh文件不可实例化,只是用于声明类型和宏定义。 综上所述,.sv文件是SystemVerilog的源代码文件,包含具体的实现代码,可以独立编译和实例化;而.svh文件是头文件,用于声明类型和宏定义,被包含在.sv文件中共享使用。

5. 命名约定:通常,.sv文件使用小写字母和下划线作为文件名的命名约定,如`module.sv`;而.svh文件使用大写字母和下划线作为文件名的命名约定,如`INTERFACE.svh`。

6. 导入方式:.sv文件可以通过`import`或`include`语句导入其他的.sv文件,用于包含或实例化模块;而.svh文件一般使用`include`语句被包含在.sv文件中,用于共享类型和宏定义。

7. 编译顺序:一般情况下,在编译SystemVerilog代码时,先编译.svh文件,然后再编译.sv文件。

8. 文件用途:.sv文件主要用于定义和实现具体的硬件模块,包含逻辑、寄存器、接口等的描述和行为,用于生成RTL(Register Transfer Level)描述。而.svh文件主要用于定义和声明重复使用的类型、宏定义、枚举等,用于提高代码的可读性、可维护性和重用性。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值