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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 在线快速将pdf转换成word[通俗易懂]

    在线快速将pdf转换成word[通俗易懂]在线快速将pdf转换成word处理同样1000个PDF文件的格式转换,在线PDF转换成Word转换器比普通PDF转换器快8-12倍以上,是一款全自动化的转换模式,为用户提供了高质量的PDF转换服务的同时,大大节省了转换过程中所消耗的时间。今天小编给你支招的这款pdf转换成word转换器在线是专业转换网站,能够给你多种格式转换的选择。  相对于电脑版PDF转换器而言,近期

    2022年5月2日
    35
  • gtk还有人用吗_iperf使用方法

    gtk还有人用吗_iperf使用方法​GTK+:GTK+的简介、安装、使用方法之详细攻略目录GTK+的简介GTK+的安装GTK+的使用方法GTK+的简介GTK+(GIMPToolkit)是一套源码以LGPL许可协议分发、跨平台的图形工具包。最初是为GIMP写的,已成为一个功能强大、设计灵活的一个通用图形库,是GNU/Linux下开发图形界面的应用程序的主流开发工具之一。并且,GTK+也有Windows版本和MacOSX版。GTK+是一种图形用户界面(GUI)工

    2022年10月22日
    0
  • Code Coverage API plugin 一个新的代码覆盖率插件

    Code Coverage API plugin 一个新的代码覆盖率插件

    2021年6月19日
    92
  • Python fill_python mean

    Python fill_python mean而df.fillna(0)用0填充所有NA/NaN值,是否有一个函数将所有非NA/NaN值替换为另一个值,例如1?如果我的DataFrame中的值是可变长度列表,那么:>df.replace()要求列表长度相同>布尔索引,如df[len(df)>0]=1抛出ValueError:无法插入True,已经存在>pandas.get_dummies()抛出Ty…

    2022年8月12日
    7
  • Winscp连接Amazon Ec2实例传送文件

    Winscp连接Amazon Ec2实例传送文件使用WinSCP将文件传输到您的Linux实例WinSCP是适用于Windows的基于GUI的文件管理器,您可以通过它来使用SFTP、SCP、FTP和FTPS协议将文件上传并传输到远程计算机。通过WinSCP,您可以将Windows计算机中的文件拖放到Linux实例或同步这两个系统之间的所有目录结构。要使用WinSCP,您将需要在 使用P

    2022年7月20日
    19
  • gg修改器修改数值没有用怎么办_GG修改器详细使用教程[通俗易懂]

    gg修改器修改数值没有用怎么办_GG修改器详细使用教程[通俗易懂]今天呢主要是为了给那些刚刚接触GG的小白朋友们一个教程大佬们请无视这个帖子我看到很多知乎的朋友们不会使用GG,所以俺来了,希望能帮到大家❤另外谢谢各位盆友们支持我❤废话不多说上教程!!1.首先是GG修改器怎么下载看不懂英文的朋友按照图片顺序操作即可2.接下来是下载好以后需要做什么然后就是如何进去GG修改器安装模式一般都是选择64位安装成功后会进行随机包名安装随机包以后卸载之前安装成功那给新安装…

    2022年9月5日
    4

发表回复

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

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