VMM DATA

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

这个是完整源码 python实现 Flask,Vue 【python毕业设计】基于Python的Flask+Vue物业管理系统 源码+论文+sql脚本 完整版 数据库是mysql 本文首先实现了基于Python的Flask+Vue物业管理系统技术的发展随后依照传统的软件开发流程,最先为系统挑选适用的言语和软件开发平台,依据需求分析开展控制模块制做和数据库查询构造设计,随后依据系统整体功能模块的设计,制作系统的功能模块图、E-R图。随后,设计框架,依据设计的框架撰写编码,完成系统的每个功能模块。最终,对基本系统开展了检测,包含软件性能测试、单元测试和性能指标。测试结果表明,该系统能够实现所需的功能,运行状况尚可并无明显缺点。本文首先实现了基于Python的Flask+Vue物业管理系统技术的发展随后依照传统的软件开发流程,最先为系统挑选适用的言语和软件开发平台,依据需求分析开展控制模块制做和数据库查询构造设计,随后依据系统整体功能模块的设计,制作系统的功能模块图、E-R图。随后,设计框架,依据设计的框架撰写编码,完成系统的每个功能模块。最终,对基本系统开展了检测,包含软件性能测试、单元测试和性能指标。测试结果表明,该系统能够实现所需的功能,运行状况尚可并无明显缺点。本文首先实现了基于Python的Flask+Vue物业管理系统技术的发展随后依照传统的软件开发流程,最先为系统挑选适用的言语和软件开发平台,依据需求分析开展控制模块制做和数据库查询构造设计,随后依据系统整体功能模块的设计,制作系统的功能模块图、E-R图。随后,设计框架,依据设计的框架撰写编码,完成系统的每个功能模块。最终,对基本系统开展了检测,包含软件性能测试、单元测试和性能指标。测试结果表明,该系统能够实现所需的功能,运行状况尚可并无明显缺点。本文首先实现了基于Python的Flask+Vue物业管理系统技术的发
源码地址: https://pan.quark.cn/s/a4b39357ea24 # SerialAssistant串口助手 下载地址: 本仓库release文件夹 在线下载:http://mculover666.cn/SerialAssistant.zip 功能说明 本项目是使用C# + WinForm框架编写的串口助手。 目前版本为2.0.0版本,拥有以下功能: 未打开串口时,自动扫描可用端口 接收数据支持文本或者HEX方式显示 支持接收数据加入时间戳 支持将当前接收数据保存为文件 支持发送文本数据或HEX数据 支持自动定时发送数据 支持从文件中(.txt, .json)加载数据到发送文本框 支持发送数据记录(不重复记录) ……欢迎加入更多功能 环境说明 VS2019 .NET Framework 4.5 教程 C#上位机开发(一)—— 了解上位机 C#上位机开发(二)—— Hello,World C#上位机开发(三)—— 构建SerialAssistant雏形 C#上位机开发(四)—— SerialAssistant功能完善 C#上位机开发(五)——SerialAssistant界面升级(WinForm界面布局进阶) C#上位机开发(六)——SerialAssistant功能优化(串口自动扫描功能、接收数据保存功能、加载发送文件、发送历史记录、打开浏览器功能、定时发送功能) C#上位机开发(七)—— 修改窗口图标和exe文件图标 C#上位机开发(八)—— 美化界面(给按钮添加背景) 更新日志 2018/6/3 完成串口属性设置,打开与关闭异常处理; 字符串发送功能; 字符串接收功能; 2018/6/4 完善串口扩展功能界面部分 2018/6/6 完善...
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值