[UVM]UVM Sequence item方法總結及使用案例

                                   UVM Sequence item Methods

 

1、create():

       The create method allocates a new object of the same type as this object and returns it via a base uvm_object handle.

2、print():

       The print method deep-prints this object’s properties in a format and manner governed by the given printer argument;

//-------------------------------------------------------------------------
//Simple TestBench to create and randomize sequence item
//-------------------------------------------------------------------------
module seq_item_tb;
   
  //instance
  mem_seq_item seq_item;
   
  initial begin
    //create method
    seq_item = mem_seq_item::type_id::create();
     
    //randomizing the seq_item
    seq_item.randomize();
     
    //printing the seq_item
    seq_item.print();  
  end 
endmodule

    Simulator Output:

---------------------------------------
Name Type Size Value
---------------------------------------
mem_seq_item mem_seq_item - @334 
addr integral 4 'h4 
wr_en integral 1 'h1 
rd_en integral 1 'h0 
wdata integral 8 'h88 
---------------------------------------

3、copy:

       The copy makes this object a copy of the specified object.

//-------------------------------------------------------------------------
//Simple TestBench to access sequence item
//-------------------------------------------------------------------------
module seq_item_tb;
   
  //instance
  mem_seq_item seq_item_0;
  mem_seq_item seq_item_1;
   
  initial begin
    //create method
    seq_item_0 = mem_seq_item::type_id::create("seq_item_0");
    seq_item_1 = mem_seq_item::type_id::create("seq_item_1");
     
    seq_item_0.randomize(); //randomizing the seq_item  
    seq_item_0.print();     //printing the seq_item_0
     
    //copy method
    seq_item_1.copy(seq_item_0); //copy seq_item_0 to seq_item_1
    seq_item_1.print();          //printing the seq_item_1
     
  end 
endmodule

    Simulator Output:

-------------------------------------
Name Type Size Value
-------------------------------------
seq_item_0 mem_seq_item - @334 
addr integral 4 'h4 
wr_en integral 1 'h1 
rd_en integral 1 'h0 
wdata integral 8 'h88 
-------------------------------------
-------------------------------------
Name Type Size Value
-------------------------------------
seq_item_1 mem_seq_item - @338 
addr integral 4 'h4 
wr_en integral 1 'h1 
rd_en integral 1 'h0 
wdata integral 8 'h88 
-------------------------------------

4、clone

       The clone method creates and returns an exact copy of this object. clone = create() + copy();

//-------------------------------------------------------------------------
//Simple TestBench to access sequence item
//-------------------------------------------------------------------------
module seq_item_tb;
   
  //instance
  mem_seq_item seq_item_0;
  mem_seq_item seq_item_1;
   
  initial begin
    //create method
    seq_item_0 = mem_seq_item::type_id::create("seq_item_0");
     
    seq_item_0.randomize(); //randomizing the seq_item  
    seq_item_0.print();     //printing the seq_item_0
     
    //clone method
    $cast(seq_item_1,seq_item_0.clone()); //create seq_item_1 and copy seq_item_0 to seq_item_1
     
    //changing the seq_item_1 values will not reflect on seq_item_0 values.
    seq_item_1.addr  = 8;
    seq_item_1.wdata = 'h56;
    `uvm_info("","Printing seq_item_0", UVM_LOW)
    seq_item_0.print();          //printing the seq_item_0
    `uvm_info("","Printing seq_item_1", UVM_LOW)
    seq_item_1.print();          //printing the seq_item_1
     
    //Note:: name of seq_item_1 will be printed as seq_item_0, because there is no option to pass 
    //argument to
    //create method while calling the clone method.
  end 
endmodule

     Simulator Output:

-------------------------------------
Name Type Size Value
-------------------------------------
seq_item_0 mem_seq_item - @334 
addr integral 4 'h4 
wr_en integral 1 'h1 
rd_en integral 1 'h0 
wdata integral 8 'h88 
-------------------------------------
UVM_INFO testbench.sv(52) @ 0: reporter [] Printing seq_item_0
-------------------------------------
Name Type Size Value
-------------------------------------
seq_item_0 mem_seq_item - @334 
addr integral 4 'h4 
wr_en integral 1 'h1 
rd_en integral 1 'h0 
wdata integral 8 'h88 
-------------------------------------
UVM_INFO testbench.sv(54) @ 0: reporter [] Printing seq_item_1
-------------------------------------
Name Type Size Value
-------------------------------------
seq_item_0 mem_seq_item - @338 
addr integral 4 'h8 
wr_en integral 1 'h1 
rd_en integral 1 'h0 
wdata integral 8 'h56 
-------------------------------------

5、compare

       Deep compares members of this data object with those of the object provided in the RHS (right-hand side) argument, returning 1 on a match, 0 otherwise.

//-------------------------------------------------------------------------
//Simple TestBench to access sequence item
//-------------------------------------------------------------------------
module seq_item_tb;
   
  //instance
  mem_seq_item seq_item_0;
  mem_seq_item seq_item_1;
   
  initial begin
    //create method
    seq_item_0 = mem_seq_item::type_id::create("seq_item_0");
    seq_item_1 = mem_seq_item::type_id::create("seq_item_1");   
     
    //---------------Mismatch Case------------------------------ 
    seq_item_0.randomize(); //randomizing the seq_item_0 
    seq_item_1.randomize(); //randomizing the seq_item_1 
     
    seq_item_0.print();     //printing the seq_item_0
    seq_item_1.print();     //printing the seq_item_1
     
    //compare method
    if(seq_item_0.compare(seq_item_1))
      `uvm_info("","seq_item_0 matching with seq_item_1", UVM_LOW)
    else
      `uvm_error("","seq_item_0 is not matching with seq_item_1")
     
    //---------------Matching Case------------------------------ 
    seq_item_1.copy(seq_item_0); //copy seq_item_0 to seq_item_1
    //compare method
    if(seq_item_0.compare(seq_item_1))
      `uvm_info("","seq_item_0 matching with seq_item_1", UVM_LOW)
    else
      `uvm_error("","seq_item_0 is not matching with seq_item_1")    
       
  end 
endmodule

    Simulator Output:

-------------------------------------
Name Type Size Value
-------------------------------------
seq_item_0 mem_seq_item - @334 
addr integral 4 'h4 
wr_en integral 1 'h1 
rd_en integral 1 'h0 
wdata integral 8 'h88 
-------------------------------------
-------------------------------------
Name Type Size Value
-------------------------------------
seq_item_1 mem_seq_item - @338 
addr integral 4 'h5 
wr_en integral 1 'h0 
rd_en integral 1 'h1 
wdata integral 8 'h33 
-------------------------------------
UVM_INFO @ 0: reporter [MISCMP] Miscompare for seq_item_0.addr: lhs = 'h4 : rhs = 'h5
UVM_INFO @ 0: reporter [MISCMP] 1 Miscompare(s) for object seq_item_1@338 vs. seq_item_0@334
UVM_ERROR testbench.sv(54) @ 0: reporter [] seq_item_0 is not matching with seq_item_1
UVM_INFO testbench.sv(59) @ 0: reporter [] seq_item_0 matching with seq_item_1

6、pack, pack_bytes, pack_ints

       The pack methods bitwise-concatenate this object’s properties into an array of bits, bytes, or ints.

(1)pack/unpack to/from array of bit type

//-------------------------------------------------------------------------
//Simple TestBench to access sequence item
//-------------------------------------------------------------------------
module seq_item_tb;
   
  //instance
  mem_seq_item seq_item_0;
  mem_seq_item seq_item_1;
  bit bit_packed_data[];
   
  initial begin
    //create method
    seq_item_0 = mem_seq_item::type_id::create("seq_item_0");
    seq_item_1 = mem_seq_item::type_id::create("seq_item_1");
     
    //---------------------- PACK  ------------------------------ 
    seq_item_0.randomize(); //randomizing the seq_item_0
    seq_item_0.print();     //printing the seq_item_0
     
    seq_item_0.pack(bit_packed_data);    //pack method
    foreach(bit_packed_data[i])
      `uvm_info("PACK",$sformatf("bit_packed_data[%0d] = %b",i,bit_packed_data[i]), UVM_LOW)
       
    //---------------------- UNPACK ------------------------------
    `uvm_info("UNPACK","Before UnPack", UVM_LOW)
    seq_item_1.print();     //printing the seq_item_1
    seq_item_1.unpack(bit_packed_data);     //unpack method
    `uvm_info("UNPACK","After UnPack", UVM_LOW)
    seq_item_1.print();     //printing the seq_item_1
 
  end 
endmodule

    Simulator Output:

-------------------------------------
Name Type Size Value
-------------------------------------
seq_item_0 mem_seq_item - @334 
addr integral 4 'h4 
wr_en integral 1 'h1 
rd_en integral 1 'h0 
wdata integral 8 'h88 
-------------------------------------
UVM_INFO testbench.sv(51) @ 0: reporter [PACK] pack_data[0] = 0
UVM_INFO testbench.sv(51) @ 0: reporter [PACK] pack_data[1] = 1
UVM_INFO testbench.sv(51) @ 0: reporter [PACK] pack_data[2] = 0
UVM_INFO testbench.sv(51) @ 0: reporter [PACK] pack_data[3] = 0
UVM_INFO testbench.sv(51) @ 0: reporter [PACK] pack_data[4] = 1
UVM_INFO testbench.sv(51) @ 0: reporter [PACK] pack_data[5] = 0
UVM_INFO testbench.sv(51) @ 0: reporter [PACK] pack_data[6] = 1
UVM_INFO testbench.sv(51) @ 0: reporter [PACK] pack_data[7] = 0
UVM_INFO testbench.sv(51) @ 0: reporter [PACK] pack_data[8] = 0
UVM_INFO testbench.sv(51) @ 0: reporter [PACK] pack_data[9] = 0
UVM_INFO testbench.sv(51) @ 0: reporter [PACK] pack_data[10] = 1
UVM_INFO testbench.sv(51) @ 0: reporter [PACK] pack_data[11] = 0
UVM_INFO testbench.sv(51) @ 0: reporter [PACK] pack_data[12] = 0
UVM_INFO testbench.sv(51) @ 0: reporter [PACK] pack_data[13] = 0
UVM_INFO testbench.sv(54) @ 0: reporter [UNPACK] Before UnPack
-------------------------------------
Name Type Size Value
-------------------------------------
seq_item_1 mem_seq_item - @338 
addr integral 4 'h0 
wr_en integral 1 'h0 
rd_en integral 1 'h0 
wdata integral 8 'h0 
-------------------------------------
UVM_INFO testbench.sv(57) @ 0: reporter [UNPACK] After UnPack
-------------------------------------
Name Type Size Value
-------------------------------------
seq_item_1 mem_seq_item - @338 
addr integral 4 'h4 
wr_en integral 1 'h1 
rd_en integral 1 'h0 
wdata integral 8 'h88 
-------------------------------------

(2)pack/unpack to/from array of byte type

//-------------------------------------------------------------------------
//Simple TestBench to access sequence item
//-------------------------------------------------------------------------
module seq_item_tb;
   
  //instance
  mem_seq_item seq_item_0;
  mem_seq_item seq_item_1;
  byte unsigned byte_packed_data[];
   
  initial begin
    //create method
    seq_item_0 = mem_seq_item::type_id::create("seq_item_0");
    seq_item_1 = mem_seq_item::type_id::create("seq_item_1");
     
    //---------------------- PACK  ------------------------------ 
    seq_item_0.randomize(); //randomizing the seq_item_0
    seq_item_0.print();     //printing the seq_item_0
     
    seq_item_0.pack_bytes(byte_packed_data);    //pack method
     
    foreach(byte_packed_data[i])
      `uvm_info("PACK",$sformatf("byte_packed_data[%0d] = %b",i,byte_packed_data[i]), UVM_LOW)
       
    //---------------------- UNPACK ------------------------------
    `uvm_info("UNPACK","Before UnPack", UVM_LOW)
    seq_item_1.print();     //printing the seq_item_1
     
    seq_item_1.unpack_bytes(byte_packed_data);     //unpack method
     
    `uvm_info("UNPACK","After UnPack", UVM_LOW)
    seq_item_1.print();     //printing the seq_item_1
 
  end 
endmodule

    Simulator Output:

-------------------------------------
Name Type Size Value
-------------------------------------
seq_item_0 mem_seq_item - @334 
addr integral 4 'h4 
wr_en integral 1 'h1 
rd_en integral 1 'h0 
wdata integral 8 'h88 
-------------------------------------

UVM_INFO testbench.sv(51) @ 0: reporter [PACK] byte_packed_data[0] = 01001010
UVM_INFO testbench.sv(51) @ 0: reporter [PACK] byte_packed_data[1] = 00100000
UVM_INFO testbench.sv(54) @ 0: reporter [UNPACK] Before UnPack

-------------------------------------
Name Type Size Value
-------------------------------------
seq_item_1 mem_seq_item - @338 
addr integral 4 'h0 
wr_en integral 1 'h0 
rd_en integral 1 'h0 
wdata integral 8 'h0 
-------------------------------------

UVM_INFO testbench.sv(57) @ 0: reporter [UNPACK] After UnPack

-------------------------------------
Name Type Size Value
-------------------------------------
seq_item_1 mem_seq_item - @338 
addr integral 4 'h4 
wr_en integral 1 'h1 
rd_en integral 1 'h0 
wdata integral 8 'h88 
-------------------------------------

(3)pack/unpack to/from array of int type

//-------------------------------------------------------------------------
//Simple TestBench to access sequence item
//-------------------------------------------------------------------------
module seq_item_tb;
   
  //instance
  mem_seq_item seq_item_0;
  mem_seq_item seq_item_1;
  int unsigned int_packed_data[];
   
  initial begin
    //create method
    seq_item_0 = mem_seq_item::type_id::create("seq_item_0");
    seq_item_1 = mem_seq_item::type_id::create("seq_item_1");
     
    //---------------------- PACK  ------------------------------ 
    seq_item_0.randomize(); //randomizing the seq_item_0
    seq_item_0.print();     //printing the seq_item_0
     
    seq_item_0.pack_ints(int_packed_data);    //pack method
     
    foreach(int_packed_data[i])
      `uvm_info("PACK",$sformatf("int_packed_data[%0d] = %b",i,int_packed_data[i]), UVM_LOW)
       
    //---------------------- UNPACK ------------------------------
    `uvm_info("UNPACK","Before UnPack", UVM_LOW)
    seq_item_1.print();     //printing the seq_item_1
     
    seq_item_1.unpack_ints(int_packed_data);     //unpack method
     
    `uvm_info("UNPACK","After UnPack", UVM_LOW)
    seq_item_1.print();     //printing the seq_item_1
 
  end 
endmodule

    Simulator Output: 

-------------------------------------
Name Type Size Value
-------------------------------------
seq_item_0 mem_seq_item - @334 
addr integral 4 'h4 
wr_en integral 1 'h1 
rd_en integral 1 'h0 
wdata integral 8 'h88 
-------------------------------------
UVM_INFO testbench.sv(52) @ 0: reporter [PACK] int_packed_data[0] = 01001010001000000000000000000000
UVM_INFO testbench.sv(55) @ 0: reporter [UNPACK] Before UnPack
-------------------------------------
Name Type Size Value
-------------------------------------
seq_item_1 mem_seq_item - @338 
addr integral 4 'h0 
wr_en integral 1 'h0 
rd_en integral 1 'h0 
wdata integral 8 'h0 
-------------------------------------
UVM_INFO testbench.sv(60) @ 0: reporter [UNPACK] After UnPack
-------------------------------------
Name Type Size Value
-------------------------------------
seq_item_1 mem_seq_item - @338 
addr integral 4 'h4 
wr_en integral 1 'h1 
rd_en integral 1 'h0 
wdata integral 8 'h88 
-------------------------------------

 

  • 3
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

元直数字电路验证

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值