VMM DATA_vm文件

VMM DATA_vm文件VMMDATAvmm_dataclassistobeusedtomodelalltransactionsintheinfrastructure.Itprovidesastandardsetofmethodsexpectedtobefoundinalltransactions.Alltransactionsinthever

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

VMM DATA

vmm_data class is to be used to model all transactions in the infrastructure . It provides a standard set of methods expected to be found in all transactions. All transactions in the verification environment inherit this object and override its main generic virtual tasks such as copy(), byte_pack(), byte_unpack(), compare() and psdisplay().

vmm_data has 3 unique identifiers for identifying transaction instance.

int stream_id;  // Stream identifier
int scenario_id;// Sequence identifier within stream
int data_id;    // instance identifier within sequence

This class is used to generate random, constraint random and directed transactions.

We will see the implementation of some methods.

Let us implement a simple packet using vmm_data.

Packet Specification
——————————-
Packet has DA,SA,Len and ….. few more feilds.
All the feilds are 8 bit.

1) Define a packet class by extending vmm_data

   class Packet extends vmm_data;

2) Define all the packet fields as rand variables

    rand bit [7:0] da;
    rand bit [7:0] sa;
    rand bit [7:0] length;
    ….
    ….

3) Constraint the rand variables based on the specification.

    constraint address_c {
da inside {
`P0,`P1,`P2,`P3}; }
    ….
    …..

4) Define psdisplay() method.
  
psdisplay() method displays the current value of the transaction or data described by this instance in a human-readable format on the standard output.

    virtual function string psdisplay(string prefix= “”);
         int i;

         $write(psdisplay,”   %s%s   da:0x%h\n”, psdisplay, prefix,this.da);
         $write(psdisplay,”   %s%s   sa:0x%h\n”, psdisplay, prefix,this.sa);
         $write(psdisplay,”   %s%s   length:0x%h (data.size=%0d)\n”, psdisplay, prefix,this.length,this.data.size());
         ………
         
    endfunction

5) Define copy() method.

copy() method copies the current value of the object instance to the specified object instance.

     virtual function vmm_data copy(vmm_data to= null);
         Packet cpy;
         cpy = new;
        
         super.copy_data(cpy);
        
         cpy.da =this.da;
         cpy.sa =this.sa;
         cpy.length = this.length;
         ………..
注:copy函数的返回值类型为vmm_data类,而不是扩展类类型,这是因为扩展类的虚函数必须跟其基类的函数相匹配,包括所有的参数和返回类型。

6) Define compare() method.

Compare method compares the current value of the object instance with the current value of the specified object instance.

    virtual function bitcompare(input vmm_data   to,outputstring diff,inputint   kind = 1);
        Packet cmp;
    
        compare =1; // Assume success by default.
        diff    = “No differences found”;
       
        // data types are the same, do comparison:
        if (this.da!= cmp.da)
        begin
           diff = $psprintf(“Different DA values: %b != %b”,this.da, cmp.da);
           compare = 0;
        end
         
        if (this.sa!= cmp.sa)
        begin
           diff = $psprintf(“Different SA values: %b != %b”,this.sa, cmp.sa);
           compare = 0;
        end
        ……..
        ……..

7) Define byte_pack() method.

   byte_pack() method Packs the content of the transaction or data into the specified dynamic array of bytes.

   virtual function intunsigned byte_pack(
                     ref logic [7:0] bytes[],
                     input int unsigned offset=0 ,
                     input int   kind = 1);
      byte_pack = 0;
      bytes = new[this.data.size()+ 4];
      bytes[0]= this.da;
      bytes[1]= this.sa;
      bytes[2]= this.length;
      ……..
      ……..

8) Define byte_unpack() method.

   byte_unpack() method unpacket the array in to different data feilds.

    virtual function intunsigned byte_unpack(
                     const ref logic[7:0] bytes[],
                     input int unsigned offset= 0,
                     input int len = 1,
                     input int kind = 1);
      this.da= bytes[0];
      this.sa= bytes[1];
      this.length= bytes[2];
      ………
      ………

  Complete Packet Class 

class Packet extends vmm_data;

static vmm_log log = new(“Packet”,“Class”);

rand bit [7:0] length;
rand bit [7:0] da;
rand bit [7:0] sa;
rand bit [7:0]data[];//Payload using Dynamic array,size is generated on the fly
rand byte fcs;

constraint payload_size_c {
data.sizeinside {
[1: 6]};}

function new();
     super.new(this.log);
endfunction:new

virtual function vmm_data allocate();
     Packet pkt;
     pkt = new();
     return pkt;
endfunction:allocate

virtual function string psdisplay(string prefix= “”);
    int i;

    $write(psdisplay,”   %s   packet #%0d.%0d.%0d\n”, prefix,this.stream_id,this.scenario_id,this.data_id);
    $write(psdisplay,”   %s%s   da:0x%h\n”, psdisplay, prefix,this.da);
    $write(psdisplay,”   %s%s   sa:0x%h\n”, psdisplay, prefix,this.sa);
    $write(psdisplay,”   %s%s   length:0x%h (data.size=%0d)\n”, psdisplay, prefix,this.length,this.data.size());
    $write(psdisplay,”   %s%s   data[%0d]:0x%h”, psdisplay, prefix,0,data[0]);
    if(data.size()> 1)
        $write(psdisplay,”   data[%0d]:0x%h”,1,data[1]);
    if(data.size()> 4)
        $write(psdisplay,”  ….  “);
    if(data.size()> 2)
        $write(psdisplay,”   data[%0d]:0x%h”,data.size()2,data[data.size()2]);
    if(data.size()> 3)
        $write(psdisplay,”   data[%0d]:0x%h”,data.size()1,data[data.size()1]);
    $write(psdisplay,“\n   %s%s   fcs:0x%h \n”, psdisplay, prefix,this.fcs);
   
endfunction

virtual function vmm_data copy(vmm_data to= null);
    Packet cpy;

    // Copying to a new instance?
    if (to == null)
       cpy = new;
     else

    // Copying to an existing instance. Correct type?
    if (!$cast(cpy, to))   
       begin
       `vmm_fatal(this.log,“Attempting to copy to a non packet instance”);
       copy = null;
       return copy;
       end
   

    super.copy_data(cpy);
   
    cpy.da =this.da;
    cpy.sa =this.sa;
    cpy.length =this.length;
    cpy.data= new[this.data.size()];
    foreach(data[i])
        begin
       cpy.data[i]= this.data[i];
        end                   
    cpy.fcs =this.fcs;
    copy = cpy;
endfunction:copy

virtual function bitcompare(input vmm_data   to,outputstring diff,inputint   kind = 1);
    Packet cmp;

    compare =1; // Assume success by default.
    diff    = “No differences found”;
   
    if (!$cast(cmp, to))
    begin
       `vmm_fatal(this.log,“Attempting to compare to a non packet instance”);
       compare =0;
       diff = “Cannot compare non packets”;
       return compare;
     end

    // data types are the same, do comparison:
    if (this.da!= cmp.da)
    begin
       diff = $psprintf(“Different DA values: %b != %b”,this.da, cmp.da);
       compare =0;
       return compare;
    end
     
    if (this.sa!= cmp.sa)
    begin
       diff = $psprintf(“Different SA values: %b != %b”,this.sa, cmp.sa);
       compare =0;
       return compare;
    end
    if (this.length!= cmp.length)
    begin
       diff = $psprintf(“Different LEN values: %b != %b”,this.length, cmp.length);
       compare =0;
       return compare;
    end

    foreach(data[i])
       if (this.data[i]!= cmp.data[i])
       begin
          diff = $psprintf(“Different data[%0d] values: 0x%h != 0x%h”,i,this.data[i], cmp.data[i]);
          compare = 0;
          return compare;
       end
    if (this.fcs!= cmp.fcs)
    begin
       diff = $psprintf(“Different FCS values: %b != %b”,this.fcs, cmp.fcs);
       compare =0;
       return compare;
    end
endfunction:compare

virtual function intunsigned byte_pack(
                     ref logic [7:0] bytes[],
                     input int unsigned offset=0 ,
                     input int   kind = 1);
      byte_pack = 0;
      bytes = new[this.data.size()+ 4];
      bytes[0]= this.da;
      bytes[1]= this.sa;
      bytes[2]= this.length;

      foreach(data[i])
          bytes[3+i]= data[i];

      bytes[this.data.size()+ 3 ] = fcs;
      byte_pack = this.data.size()+ 4;
endfunction:byte_pack    

virtual function intunsigned byte_unpack(
                     const ref logic[7:0] bytes[],
                     input int unsigned offset= 0,
                     input int len = 1,
                     input int kind = 1);
      this.da= bytes[0];
      this.sa= bytes[1];
      this.length= bytes[2];
      this.fcs= bytes[bytes.size()1];
      this.data= new[bytes.size() 4];
      foreach(data[i])
      this.data[i]= bytes[i+3];
      return bytes.size();
endfunction:byte_unpack

endclass

   Vmm_data Methods 

      virtual function string psdisplay( string prefix= “” );
      virtual function bit is_valid( bit silent= 1,int kind = 1);
      virtual function vmm_data allocate ();
      virtual function vmm_data copy ( vmm_data to= null);
      virtual function bitcompare (
      input vmm_data to,output string diff, input int kind= 1);
      function void display(string prefix= “”);
      virtual protected functionvoid copy_data ( vmm_data to );
      virtual function intunsigned byte_pack (
      ref logic [7:0] bytes[ ], int unsigned offset= 0,int kind = 1);
      virtual function intunsigned byte_unpack (
      const ref logic[7:0] bytes[ ], input intunsigned offset = 0,
      input int len = 1,input int kind = 1 );
      virtual function intunsigned byte_size ( int kind = 1);
      virtual function intunsigned max_byte_size ( int kind = 1);
      virtual function void save( int file);
      virtual function bit load( int file);

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/190602.html原文链接:https://javaforall.net

(0)
上一篇 2026年2月17日 下午5:15
下一篇 2026年2月17日 下午5:43


相关推荐

  • 字符串数组转对象数组怎么操作_前端字符串转数组

    字符串数组转对象数组怎么操作_前端字符串转数组constreasonLi:any[]=[];reasonList.forEach(it=>{reasonLi.push({answer:it});});console.log(‘reasonLiarr’,reasonLi);

    2025年10月21日
    3
  • mysql创建表的sql语句_mysql增删改查语句

    mysql创建表的sql语句_mysql增删改查语句打开数据库:步骤:新建查询(Ctrl+Q)→写SQL语句→运行→刷新→创建表成功创建表的SQL语句一般格式:CREATETABLE<表名>(<列名><数据类型>[列级完整性约束定义]{,<列名><数据类型>[列级完整性约束定义]…}[,表级完整性约束定义])下面来举个列子来说明一下就更清晰了,…

    2022年10月16日
    6
  • ifconfig 与 ip addr 命令详解 – 学习/实践

    ifconfig 与 ip addr 命令详解 – 学习/实践1.应用场景 主要用于了解学习,掌握使用IP地址相关知识, 如何查看IP信息,以及各个参数代表的含义 2.学习/操作 1.文档阅读 网络协议概论|Laravel学院-不定期分享之ifconfig与ipaddr命令详解 2.整理输出 2.1如何查看机器的IP地址 我们在Linux系统查看IP地址通常有以下两种方式: 1)ifconfig 2)ipaddr

    2022年7月27日
    30
  • fopen函数打开文件失败原因_为什么打开文件失败

    fopen函数打开文件失败原因_为什么打开文件失败大家好,我是疯狂的比特,一个每天在互联网上种菜和砍柴的程序员今天给大家分享一个C语言初学者常见的一个问题。问题经常有人问我,我的C语言代码好好的,怎么就打开文件失败了呢?我们先来看看代码吧#include<stdio.h>#include<stdlib.h>intmain(){ FILE*pfRead=fopen(“test.txt”,”r”); if(pfRead==NULL) { printf(“打开文件test.txt失败啦\

    2022年10月14日
    5
  • pycharm 编码怎么设置_pycharm编码格式

    pycharm 编码怎么设置_pycharm编码格式Python中默认的编码格式是ASCII格式,在没修改编码格式时无法正确打印汉字,所以在读取中文时会报错。有两种解决方法。一种是在python的编程工具Pycharm中设置默认编码pycharm下载地址:http://www.jetbrains.com/pycharm/选择社区版即可,免费。设置方法如下:入口A:工具栏-File-DefaultSettings-Editor-File…

    2022年8月27日
    7
  • PyCharm 菜单栏隐藏后如何恢复?

    PyCharm 菜单栏隐藏后如何恢复?PyCharm 菜单栏隐藏后如何恢复 为节省屏幕空间 用 PyCharm 菜单 View 把菜单栏隐藏了 后觉的不便 摸索了很久才找到恢复的办法 功双击左 Shift 键 出 搜索 弹出窗口 输入 View 中文或是 视图 可以搜出 View 点击 View 进入 View 菜单 选择显示菜单栏即可

    2026年3月27日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号