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);

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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • ansys随机振动分析_workbench扫频振动仿真

    ansys随机振动分析_workbench扫频振动仿真随机振动(PSD)分析步骤PSD分析包括如下六个步骤:1.建造模型;2.求得模态解;3.扩展模态;4.获得谱解;5.合并模态;6.观察结果。以上六步中,前两步跟单点响应谱分析一样,后四步将在下面作详细讲解。Ansys/Professional产品中不能进展随机振动分析。如果选用GUI交互方法进展分析,模态分析选择对话框〔MODOPT命令〕中包含有是否进展模态扩展选项〔MXPAND命令〕,将其设置为YES就可以进展下面的:扩展模态。这样,第二步〔求得模态解〕和第三步〔扩展模态〕就合并到一个步

    2022年10月10日
  • keil4 进行 S3C2440裸机开发

    keil4 进行 S3C2440裸机开发用Keil-MDK开发TQ2440裸机程序入门教程——LED流水灯实现觉得此编文章很详实,故转载之,来自http://www.amobbs.com/thread-5281512-1-1.html开发板也差不多买了半年了,以前照着教程用的是软件是ADS,在win7下老是崩溃,后来才知道ADS早就不提供支持了,ADS的公司怎样怎样了…(此处省略300..)然后我就捣鼓

  • Java练手小程序——QQ聊天「建议收藏」

    Java练手小程序——QQ聊天「建议收藏」1.思路图    2.主要功能     实现一对一聊天实现多对多聊天好友上线自动刷新功能3.知识点   界面布局:一是流布局,二是卡片布局(现在应该都不用了) socket通信之对象流objectinput/outputStream     将线程里面的信息显示到界面上4.项目代码    4.1服务端 

  • java8之lamda groupingby多层 嵌套[通俗易懂]

    java8之lamda groupingby多层 嵌套[通俗易懂]@Testpublicvoidr(){List<Person>javaProgrammers=newArrayList<Person>(){{add(newPerson("Elsdon","1","Javaprogrammer","male",43,2000));

  • 树形结构的数据库表设计

    树形结构的数据库表设计树形结构的数据库表Schema设计   程序设计过程中,我们常常用树形结构来表征某些数据的关联关系,如企业上下级部门、栏目结构、商品分类等等,通常而言,这些树状结构需要借助于数据库完成持久化。然而目前的各种基于关系的数据库,都是以二维表的形式记录存储数据信息,因此是不能直接将Tree存入DBMS,设计合适的Schema及其对应的CRUD算法是实现关系型数据库中存储树形结构的关键。   理想中树…

  • export symbol 与 export symbol gpl

    export symbol 与 export symbol gpl1.EXPORT_SYMBOLEXPORT_SYMBOL(my_pub_func);在预编译阶段会解析为:externvoid*__crc_my_pub_func__attribute__((weak));staticconstunsignedlong__kcrctab_my_pub_func__attribute__((__used__))__attri

发表回复

您的电子邮箱地址不会被公开。

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