zoukankan      html  css  js  c++  java
  • uvm_reg_model——寄存器模型(一)

      对于一个复杂设计,寄存器模型要能够模拟任意数量的寄存器域操作。UVM提供标准的基类库,UVM的寄存器模型来自于继承自VMM的RAL(Register Abstract Layer),现在可以先将寄存器模型进行XML建模,再通过脚本工具直接生产寄存器模型。首先来看看uvm_reg_model的代码,该文件用来保存Register Layer的全局变量和文件include。

    //------------------------------------------------------------------------------
    // TITLE: Global Declarations for the Register Layer
    //------------------------------------------------------------------------------
    //
    // This section defines globally available types, enums, and utility classes.
    //
    //------------------------------------------------------------------------------
    
    `ifndef UVM_REG_MODEL__SV
    `define UVM_REG_MODEL__SV
    
    
    typedef class uvm_reg_field;
    typedef class uvm_vreg_field;
    typedef class uvm_reg;
    typedef class uvm_reg_file;
    typedef class uvm_vreg;
    typedef class uvm_reg_block;
    typedef class uvm_mem;
    typedef class uvm_reg_item;
    typedef class uvm_reg_map;
    typedef class uvm_reg_map_info;
    typedef class uvm_reg_sequence;
    typedef class uvm_reg_adapter;
    typedef class uvm_reg_indirect_data;

    除了声明了基本的寄存器模型外,还定义了一些全局变量和枚举的定义:

    // Type: uvm_hdl_path_slice
    //
    // Slice of an HDL path
    //
    // Struct that specifies the HDL variable that corresponds to all
    // or a portion of a register.
    //
    // path    - Path to the HDL variable.
    // offset  - Offset of the LSB in the register that this variable implements
    // size    - Number of bits (toward the MSB) that this variable implements
    //
    // If the HDL variable implements all of the register, ~offset~ and ~size~
    // are specified as -1. For example:
    //|
    //| r1.add_hdl_path('{ '{"r1", -1, -1} });
    //|
    //
    typedef struct {
       string path;
       int offset;
       int size;
    } uvm_hdl_path_slice;
    
    
    typedef uvm_resource_db#(uvm_reg_cvr_t) uvm_reg_cvr_rsrc_db;
    
    
    //--------------------
    // Group: Enumerations
    //--------------------
    
    // Enum: uvm_status_e
    //
    // Return status for register operations
    //
    // UVM_IS_OK      - Operation completed successfully
    // UVM_NOT_OK     - Operation completed with error
    // UVM_HAS_X      - Operation completed successfully bit had unknown bits.
    //
    
       typedef enum {
          UVM_IS_OK,
          UVM_NOT_OK,
          UVM_HAS_X
       } uvm_status_e;
    
    
    // Enum: uvm_path_e
    //
    // Path used for register operation
    //
    // UVM_FRONTDOOR    - Use the front door
    // UVM_BACKDOOR     - Use the back door
    // UVM_PREDICT      - Operation derived from observations by a bus monitor via
    //                    the <uvm_reg_predictor> class.
    // UVM_DEFAULT_PATH - Operation specified by the context
    //
       typedef enum {
          UVM_FRONTDOOR,
          UVM_BACKDOOR,
          UVM_PREDICT,
          UVM_DEFAULT_PATH
       } uvm_path_e;
    
    
    // Enum: uvm_check_e
    //
    // Read-only or read-and-check
    //
    // UVM_NO_CHECK   - Read only
    // UVM_CHECK      - Read and check
    //   
       typedef enum {
          UVM_NO_CHECK,
          UVM_CHECK
       } uvm_check_e;
    
    
    // Enum: uvm_endianness_e
    //
    // Specifies byte ordering
    //
    // UVM_NO_ENDIAN      - Byte ordering not applicable
    // UVM_LITTLE_ENDIAN  - Least-significant bytes first in consecutive addresses
    // UVM_BIG_ENDIAN     - Most-significant bytes first in consecutive addresses
    // UVM_LITTLE_FIFO    - Least-significant bytes first at the same address
    // UVM_BIG_FIFO       - Most-significant bytes first at the same address
    //   
       typedef enum {
          UVM_NO_ENDIAN,
          UVM_LITTLE_ENDIAN,
          UVM_BIG_ENDIAN,
          UVM_LITTLE_FIFO,
          UVM_BIG_FIFO
       } uvm_endianness_e;
    
    
    // Enum: uvm_elem_kind_e
    //
    // Type of element being read or written
    //
    // UVM_REG      - Register
    // UVM_FIELD    - Field
    // UVM_MEM      - Memory location
    //
       typedef enum {
          UVM_REG,
          UVM_FIELD,
          UVM_MEM
       } uvm_elem_kind_e;
    
    
    // Enum: uvm_access_e
    //
    // Type of operation begin performed
    //
    // UVM_READ     - Read operation
    // UVM_WRITE    - Write operation
    //
       typedef enum {
          UVM_READ,
          UVM_WRITE,
          UVM_BURST_READ,
          UVM_BURST_WRITE
       } uvm_access_e;
    
    
    // Enum: uvm_hier_e
    //
    // Whether to provide the requested information from a hierarchical context.
    //
    // UVM_NO_HIER - Provide info from the local context
    // UVM_HIER    - Provide info based on the hierarchical context
    
       typedef enum {
          UVM_NO_HIER,
          UVM_HIER
       } uvm_hier_e;
    
    
    // Enum: uvm_predict_e
    //
    // How the mirror is to be updated
    //
    // UVM_PREDICT_DIRECT  - Predicted value is as-is
    // UVM_PREDICT_READ    - Predict based on the specified value having been read
    // UVM_PREDICT_WRITE   - Predict based on the specified value having been written
    //
       typedef enum {
          UVM_PREDICT_DIRECT,
          UVM_PREDICT_READ,
          UVM_PREDICT_WRITE
       } uvm_predict_e;
    
    
    // Enum: uvm_coverage_model_e
    //
    // Coverage models available or desired.
    // Multiple models may be specified by bitwise OR'ing individual model identifiers.
    //
    // UVM_NO_COVERAGE      - None
    // UVM_CVR_REG_BITS     - Individual register bits
    // UVM_CVR_ADDR_MAP     - Individual register and memory addresses
    // UVM_CVR_FIELD_VALS   - Field values
    // UVM_CVR_ALL          - All coverage models
    //
       typedef enum uvm_reg_cvr_t {
          UVM_NO_COVERAGE      = 'h0000,
          UVM_CVR_REG_BITS     = 'h0001,
          UVM_CVR_ADDR_MAP     = 'h0002,
          UVM_CVR_FIELD_VALS   = 'h0004,
          UVM_CVR_ALL          = -1
       } uvm_coverage_model_e;
    
    
    // Enum: uvm_reg_mem_tests_e
    //
    // Select which pre-defined test sequence to execute.
    //
    // Multiple test sequences may be selected by bitwise OR'ing their
    // respective symbolic values.
    //
    // UVM_DO_REG_HW_RESET      - Run <uvm_reg_hw_reset_seq>
    // UVM_DO_REG_BIT_BASH      - Run <uvm_reg_bit_bash_seq>
    // UVM_DO_REG_ACCESS        - Run <uvm_reg_access_seq>
    // UVM_DO_MEM_ACCESS        - Run <uvm_mem_access_seq>
    // UVM_DO_SHARED_ACCESS     - Run <uvm_reg_mem_shared_access_seq>
    // UVM_DO_MEM_WALK          - Run <uvm_mem_walk_seq>
    // UVM_DO_ALL_REG_MEM_TESTS - Run all of the above
    //
    // Test sequences, when selected, are executed in the
    // order in which they are specified above.
    //
    typedef enum bit [63:0] {
      UVM_DO_REG_HW_RESET      = 64'h0000_0000_0000_0001,
      UVM_DO_REG_BIT_BASH      = 64'h0000_0000_0000_0002,
      UVM_DO_REG_ACCESS        = 64'h0000_0000_0000_0004,
      UVM_DO_MEM_ACCESS        = 64'h0000_0000_0000_0008,
      UVM_DO_SHARED_ACCESS     = 64'h0000_0000_0000_0010,
      UVM_DO_MEM_WALK          = 64'h0000_0000_0000_0020,
      UVM_DO_ALL_REG_MEM_TESTS = 64'hffff_ffff_ffff_ffff 
    } uvm_reg_mem_tests_e;

    包含其他文件的include:

    `include "reg/uvm_reg_item.svh"
    `include "reg/uvm_reg_adapter.svh"
    `include "reg/uvm_reg_predictor.svh"
    `include "reg/uvm_reg_sequence.svh"
    `include "reg/uvm_reg_cbs.svh"
    `include "reg/uvm_reg_backdoor.svh"
    `include "reg/uvm_reg_field.svh"
    `include "reg/uvm_vreg_field.svh"
    `include "reg/uvm_reg.svh"
    `include "reg/uvm_reg_indirect.svh"
    `include "reg/uvm_reg_fifo.svh"
    `include "reg/uvm_reg_file.svh"
    `include "reg/uvm_mem_mam.svh"
    `include "reg/uvm_vreg.svh"
    `include "reg/uvm_mem.svh"
    `include "reg/uvm_reg_map.svh"
    `include "reg/uvm_reg_block.svh"
    
    `include "reg/sequences/uvm_reg_hw_reset_seq.svh"
    `include "reg/sequences/uvm_reg_bit_bash_seq.svh"
    `include "reg/sequences/uvm_mem_walk_seq.svh"
    `include "reg/sequences/uvm_mem_access_seq.svh"
    `include "reg/sequences/uvm_reg_access_seq.svh"
    `include "reg/sequences/uvm_reg_mem_shared_access_seq.svh"
    `include "reg/sequences/uvm_reg_mem_built_in_seq.svh"
    `include "reg/sequences/uvm_reg_mem_hdl_paths_seq.svh"
  • 相关阅读:
    LeetCode 515. 在每个树行中找最大值(Find Largest Value in Each Tree Row)
    LeetCode 114. 二叉树展开为链表(Flatten Binary Tree to Linked List)
    LeetCode 199. 二叉树的右视图(Binary Tree Right Side View)
    LeetCode 1022. 从根到叶的二进制数之和(Sum of Root To Leaf Binary Numbers)
    LeetCode 897. 递增顺序查找树(Increasing Order Search Tree)
    LeetCode 617. 合并二叉树(Merge Two Binary Trees)
    LeetCode 206. 反转链表(Reverse Linked List) 16
    LeetCode 104. 二叉树的最大深度(Maximum Depth of Binary Tree)
    LeetCode 110. 平衡二叉树(Balanced Binary Tree) 15
    LeetCode 108. 将有序数组转换为二叉搜索树(Convert Sorted Array to Binary Search Tree) 14
  • 原文地址:https://www.cnblogs.com/dpc525/p/8024899.html
Copyright © 2011-2022 走看看