VMM - RAL/vmm_ral_mem.svh

RAL/vmm_ral_mem.svh expanded source

00001 // 
00002 // -------------------------------------------------------------
00003 //    Copyright 2004-2008 Synopsys, Inc.
00004 //    All Rights Reserved Worldwide
00005 // 
00006 //    Licensed under the Apache License, Version 2.0 (the
00007 //    "License"); you may not use this file except in
00008 //    compliance with the License.  You may obtain a copy of
00009 //    the License at
00010 // 
00011 //        http://www.apache.org/licenses/LICENSE-2.0
00012 // 
00013 //    Unless required by applicable law or agreed to in
00014 //    writing, software distributed under the License is
00015 //    distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
00016 //    CONDITIONS OF ANY KIND, either express or implied.  See
00017 //    the License for the specific language governing
00018 //    permissions and limitations under the License.
00019 // -------------------------------------------------------------
00020 // 
00021 
00022 
00023 class vmm_ral_mem_burst;
00024    rand int unsigned                 n_beats;
00025    rand bit [`VMM_RW_ADDR_WIDTH-1:0] start_offset;
00026    rand bit [`VMM_RW_ADDR_WIDTH-1:0] incr_offset;
00027    rand bit [`VMM_RW_ADDR_WIDTH-1:0] max_offset;
00028         vmm_data                     user_data;
00029 endclass
00030 
00031 
00032 class vmm_ral_mem_callbacks extends vmm_ral_callbacks;
00033 
00034    virtual task pre_write(vmm_ral_mem                       mem,
00035                           ref bit [`VMM_RAL_ADDR_WIDTH-1:0] offset,
00036                           ref bit [`VMM_RAL_DATA_WIDTH-1:0] wdat,
00037                           ref vmm_ral::path_e               path,
00038                           ref string                        domain);
00039    endtask: pre_write
00040 
00041    virtual task post_write(vmm_ral_mem                   mem,
00042                            bit [`VMM_RAL_ADDR_WIDTH-1:0] offset,
00043                            bit [`VMM_RAL_DATA_WIDTH-1:0] wdat,
00044                            vmm_ral::path_e               path,
00045                            string                        domain,
00046                            ref vmm_rw::status_e          status);
00047    endtask: post_write
00048 
00049    virtual task pre_read(vmm_ral_mem                       mem,
00050                          ref bit [`VMM_RAL_ADDR_WIDTH-1:0] offset,
00051                          ref vmm_ral::path_e               path,
00052                          ref string                        domain);
00053    endtask: pre_read
00054 
00055    virtual task post_read(input vmm_ral_mem                   mem,
00056                           input bit [`VMM_RAL_ADDR_WIDTH-1:0] offset,
00057                           ref   bit [`VMM_RAL_DATA_WIDTH-1:0] rdat,
00058                           input vmm_ral::path_e               path,
00059                           input string                        domain,
00060                           ref   vmm_rw::status_e              status);
00061    endtask: post_read
00062 
00063    virtual task pre_burst(vmm_ral_mem                       mem,
00064                           vmm_rw::kind_e                    kind,
00065                           vmm_ral_mem_burst                 burst,
00066                           ref bit [`VMM_RAL_DATA_WIDTH-1:0] wdat[],
00067                           ref vmm_ral::path_e               path,
00068                           ref string                        domain);
00069    endtask: pre_burst
00070 
00071    virtual task post_burst(input vmm_ral_mem                   mem,
00072                            input vmm_rw::kind_e                kind,
00073                            input vmm_ral_mem_burst             burst,
00074                            ref   bit [`VMM_RAL_DATA_WIDTH-1:0] data[],
00075                            input vmm_ral::path_e               path,
00076                            input string                        domain,
00077                            ref   vmm_rw::status_e              status);
00078    endtask: post_burst
00079 endclass: vmm_ral_mem_callbacks
00080 
00081 
00082 virtual class vmm_ral_mem_frontdoor;
00083    static vmm_log log = new("vmm_ral_mem_frontdoor", "class");
00084    
00085    extern virtual task write(output vmm_rw::status_e              status,
00086                              input  bit [`VMM_RAL_ADDR_WIDTH-1:0] offset,
00087                              input  bit [`VMM_RAL_DATA_WIDTH-1:0] data,
00088                              input  int                           data_id = -1,
00089                              input  int                           scenario_id = -1,
00090                              input  int                           stream_id = -1);
00091    extern virtual task read(output vmm_rw::status_e              status,
00092                             input  bit [`VMM_RAL_ADDR_WIDTH-1:0] offset,
00093                             output bit [`VMM_RAL_DATA_WIDTH-1:0] data,
00094                             input  int                           data_id = -1,
00095                             input  int                           scenario_id = -1,
00096                             input  int                           stream_id = -1);
00097    extern virtual task burst_write(output vmm_rw::status_e              status,
00098                                    input  vmm_ral_mem_burst             burst,
00099                                    input  bit [`VMM_RAL_DATA_WIDTH-1:0] data[],
00100                                    input  int                           data_id = -1,
00101                                    input  int                           scenario_id = -1,
00102                                    input  int                           stream_id = -1);
00103    extern virtual task burst_read(output vmm_rw::status_e              status,
00104                                   input  vmm_ral_mem_burst             burst,
00105                                   output bit [`VMM_RAL_DATA_WIDTH-1:0] data[],
00106                                   input  int                           data_id = -1,
00107                                   input  int                           scenario_id = -1,
00108                                   input  int                           stream_id = -1);
00109 endclass: vmm_ral_mem_frontdoor
00110 
00111 
00112 class vmm_ral_mem;
00113    static vmm_log log = new("RAL", "memory");
00114 
00115    vmm_mam mam;
00116 
00117    typedef enum {UNKNOWNS, ZEROES, ONES, ADDRESS, VALUE, INCR, DECR} init_e;
00118 
00119    local string name;
00120    local bit locked;
00121 
00122    local vmm_ral::access_e access;
00123    local longint unsigned size;
00124 
00125    local vmm_ral_block parent;
00126 
00127    local logic [`VMM_RAL_ADDR_WIDTH-1:0] offset_in_block[];
00128    local string                          domains[];
00129    local vmm_ral::access_e               rights[];
00130 
00131    local int unsigned  n_bits;
00132    local string        constraint_block_names[];
00133 
00134    local vmm_ral_access ral_access;
00135    local vmm_ral_mem_frontdoor frontdoor[];
00136    local vmm_ral_mem_backdoor backdoor;
00137 
00138    local vmm_ral_mem_callbacks callbacks[$];
00139 
00140    local bit no_cover;
00141    local bit cover_on;
00142 
00143    static local vmm_ral_mem __vmm_all_mems[*]; // Keeps track of all memories in the RAL Model
00144    static int unsigned __vmm_mem_id_factory = 0;
00145    local int unsigned __vmm_mem_id = 0;
00146 
00147    /*local*/ vmm_ral_vreg XvregsX[$]; //Virtual registers implemented here
00148 
00149    extern function new(vmm_ral_block                 parent,
00150                        string                        name,
00151                        vmm_ral::access_e             access,
00152                        longint unsigned              size,
00153                        int unsigned                  n_bits,
00154                        bit [`VMM_RAL_ADDR_WIDTH-1:0] base_addr,
00155                        string                        domain   = "",
00156                        bit                           cover_on = 1,
00157                        bit [1:0]                     rights   = 2'b11,
00158                        bit                           unmapped = 0);
00159 
00160    /*local*/ extern function void Xlock_modelX();
00161    /*local*/ extern function void add_domain(bit [`VMM_RAL_ADDR_WIDTH-1:0] base_addr,
00162                                              string                        domain,
00163                                              bit [1:0]                     rights,
00164                                              bit                           unmapped = 0);
00165 
00166    /*local*/ extern function void Xregister_ral_accessX(vmm_ral_access access);
00167 
00168    extern virtual function string get_name();
00169    extern virtual function string get_fullname();
00170    extern virtual function int get_n_domains();
00171    extern virtual function void get_domains(ref string domains[]);
00172    extern virtual function vmm_ral::access_e get_access(string domain = "");
00173    extern /*local*/ function vmm_ral_access Xget_ral_accessX();
00174    extern virtual function vmm_ral::access_e get_rights(string domain = "");
00175    extern virtual function void get_virtual_fields(ref vmm_ral_vfield fields[]);
00176    extern virtual function vmm_ral_vfield get_virtual_field_by_name(string name);
00177    extern virtual function void get_virtual_registers(ref vmm_ral_vreg regs[]);
00178    extern virtual function vmm_ral_vreg get_vreg_by_name(string name);
00179    extern virtual function vmm_ral_vreg get_vreg_by_offset(bit [63:0] offset,
00180                                                            string domain = "");
00181    extern virtual function vmm_ral_block get_block();
00182    extern virtual function bit [`VMM_RAL_ADDR_WIDTH-1:0] get_offset_in_block(bit [`VMM_RAL_ADDR_WIDTH-1:0] mem_addr = 0,
00183                                                                              string                        domain   = "");
00184    extern virtual function bit [`VMM_RAL_ADDR_WIDTH-1:0] get_address_in_system(bit [`VMM_RAL_ADDR_WIDTH-1:0] mem_addr = 0,
00185                                                             string                                           domain   = "");
00186    extern virtual function longint unsigned get_size();
00187    extern virtual function int unsigned get_n_bits();
00188    extern         function int unsigned get_n_bytes();
00189 
00190    extern virtual function void display(string prefix = "",
00191                                         string domain = "");
00192    extern virtual function string psdisplay(string prefix = "",
00193                                             string domain = "");
00194 
00195    extern virtual function bit set_cover(bit is_on);
00196    extern virtual function bit is_cover_on();
00197 
00198    extern virtual task init(output bit                           is_ok,
00199                             input  init_e                        pattern,
00200                             input  bit [`VMM_RAL_DATA_WIDTH-1:0] data);
00201 
00202    extern virtual task write(output vmm_rw::status_e              status,
00203                              input  bit [`VMM_RAL_ADDR_WIDTH-1:0] mem_addr,
00204                              input  bit [`VMM_RAL_DATA_WIDTH-1:0] value,
00205                              input  vmm_ral::path_e               path   = vmm_ral::DEFAULT,
00206                              input  string                        domain = "",
00207                              input  int                           data_id = -1,
00208                              input  int                           scenario_id = -1,
00209                              input  int                           stream_id = -1);
00210 
00211    extern virtual task read(output vmm_rw::status_e              status,
00212                             input  bit [`VMM_RAL_ADDR_WIDTH-1:0] mem_addr,
00213                             output bit [`VMM_RAL_DATA_WIDTH-1:0] value,
00214                             input  vmm_ral::path_e               path   = vmm_ral::DEFAULT,
00215                             input  string                        domain = "",
00216                             input  int                           data_id = -1,
00217                             input  int                           scenario_id = -1,
00218                             input  int                           stream_id = -1);
00219 
00220    extern local function bit validate_burst(vmm_ral_mem_burst burst);
00221 
00222    extern virtual task burst_write(output vmm_rw::status_e              status,
00223                                    input  vmm_ral_mem_burst             burst,
00224                                    input  bit [`VMM_RAL_DATA_WIDTH-1:0] value[],
00225                                    input  vmm_ral::path_e               path   = vmm_ral::DEFAULT,
00226                                    input  string                        domain = "",
00227                                    input  int                           data_id = -1,
00228                                    input  int                           scenario_id = -1,
00229                                    input  int                           stream_id = -1);
00230 
00231    extern virtual task burst_read(output vmm_rw::status_e              status,
00232                                   input  vmm_ral_mem_burst             burst,
00233                                   output bit [`VMM_RAL_DATA_WIDTH-1:0] value[],
00234                                   input  vmm_ral::path_e               path   = vmm_ral::DEFAULT,
00235                                   input  string                        domain = "",
00236                                   input  int                           data_id = -1,
00237                                   input  int                           scenario_id = -1,
00238                                   input  int                           stream_id = -1);
00239 
00240    extern virtual task poke(output vmm_rw::status_e              status,
00241                             input  bit [`VMM_RAL_ADDR_WIDTH-1:0] mem_addr,
00242                             input  bit [`VMM_RAL_DATA_WIDTH-1:0] value,
00243                             input  int                           data_id = -1,
00244                             input  int                           scenario_id = -1,
00245                             input  int                           stream_id = -1);
00246 
00247    extern virtual task peek(output vmm_rw::status_e              status,
00248                             input  bit [`VMM_RAL_ADDR_WIDTH-1:0] mem_addr,
00249                             output bit [`VMM_RAL_DATA_WIDTH-1:0] value,
00250                             input  int                           data_id = -1,
00251                             input  int                           scenario_id = -1,
00252                             input  int                           stream_id = -1);
00253 
00254    extern virtual task readmemh(string filename);
00255    extern virtual task writememh(string filename);
00256 
00257    extern function void set_frontdoor(vmm_ral_mem_frontdoor ftdr,
00258                                       string                domain = "");
00259    extern function vmm_ral_mem_frontdoor get_frontdoor(string domain = "");
00260    extern function void set_backdoor(vmm_ral_mem_backdoor bkdr);
00261    extern function vmm_ral_mem_backdoor get_backdoor();
00262 
00263    extern function void prepend_callback(vmm_ral_mem_callbacks cb);
00264    extern function void append_callback(vmm_ral_mem_callbacks cb);
00265    extern function void unregister_callback(vmm_ral_mem_callbacks cb);
00266 
00267    extern local function int get_domain_index(string domain);
00268 
00269    extern function int unsigned get_mem_ID();
00270 
00271    extern /*static*/ function vmm_ral_mem get_mem_by_ID(int unsigned id);
00272 endclass: vmm_ral_mem