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文件主要用于定义和声明重复使用的类型、宏定义、枚举等,用于提高代码的可读性、可维护性和重用性。