VMM OpenSource - sv/RAL/vmm_ral_mem.svh

sv/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 string attributes[string];
00141 
00142    local bit is_powered_down;
00143 
00144    local int has_cover;
00145    local int cover_on;
00146 
00147    static vmm_ral_mem all_mems[*]; // Keeps track of all memories in the RAL Model
00148    static local int unsigned mem_id_factory = 0;
00149    local int unsigned mem_id = 0;
00150 
00151    /*local*/ vmm_ral_vreg XvregsX[$]; //Virtual registers implemented here
00152 
00153    extern function new(vmm_ral_block                 parent,
00154                        string                        name,
00155                        vmm_ral::access_e             access,
00156                        longint unsigned              size,
00157                        int unsigned                  n_bits,
00158                        bit [`VMM_RAL_ADDR_WIDTH-1:0] base_addr,
00159                        string                        domain   = "",
00160                        int                           cover_on = vmm_ral::NO_COVERAGE,
00161                        bit [1:0]                     rights   = 2'b11,
00162                        bit                           unmapped = 0,
00163                        int                           has_cover = vmm_ral::NO_COVERAGE);
00164 
00165    /*local*/ extern function void Xlock_modelX();
00166    /*local*/ extern function void add_domain(bit [`VMM_RAL_ADDR_WIDTH-1:0] base_addr,
00167                                              string                        domain,
00168                                              bit [1:0]                     rights,
00169                                              bit                           unmapped = 0);
00170 
00171    /*local*/ extern function void Xregister_ral_accessX(vmm_ral_access access);
00172 
00173    extern virtual function string get_name();
00174    extern virtual function string get_fullname();
00175    extern virtual function int get_n_domains();
00176    extern virtual function void get_domains(ref string domains[]);
00177    extern virtual function vmm_ral::access_e get_access(string domain = "");
00178    extern /*local*/ function vmm_ral_access Xget_ral_accessX();
00179    extern virtual function vmm_ral::access_e get_rights(string domain = "");
00180    extern virtual function void get_virtual_fields(ref vmm_ral_vfield fields[]);
00181    extern virtual function vmm_ral_vfield get_virtual_field_by_name(string name);
00182    extern virtual function void get_virtual_registers(ref vmm_ral_vreg regs[]);
00183    extern virtual function vmm_ral_vreg get_vreg_by_name(string name);
00184    extern virtual function vmm_ral_vreg get_vreg_by_offset(bit [63:0] offset,
00185                                                            string domain = "");
00186    extern virtual function vmm_ral_block get_block();
00187    extern virtual function bit [`VMM_RAL_ADDR_WIDTH-1:0] get_offset_in_block(bit [`VMM_RAL_ADDR_WIDTH-1:0] mem_addr = 0,
00188                                                                              string                        domain   = "");
00189    extern virtual function bit [`VMM_RAL_ADDR_WIDTH-1:0] get_address_in_system(bit [`VMM_RAL_ADDR_WIDTH-1:0] mem_addr = 0,
00190                                                             string                                           domain   = "");
00191    extern virtual function longint unsigned get_size();
00192    extern virtual function int unsigned get_n_bits();
00193    extern         function int unsigned get_n_bytes();
00194 
00195    extern virtual function void display(string prefix = "",
00196                                         string domain = "");
00197    extern virtual function string psdisplay(string prefix = "",
00198                                             string domain = "");
00199 
00200    extern virtual function void set_attribute(string name,
00201                                               string value);
00202    extern virtual function string get_attribute(string name,
00203                                                 bit inherited = 1);
00204    extern virtual function void get_all_attributes(ref string names[],
00205                                                    input bit inherited = 1);
00206 
00207    extern virtual function void power_down();
00208    extern virtual function void power_up();
00209 
00210    extern virtual function bit can_cover(int models);
00211    extern virtual function int set_cover(int is_on);
00212    extern virtual function bit is_cover_on(int is_on = vmm_ral::ALL_COVERAGE);
00213 
00214    extern virtual task init(output bit                           is_ok,
00215                             input  init_e                        pattern,
00216                             input  bit [`VMM_RAL_DATA_WIDTH-1:0] data);
00217 
00218    extern virtual task write(output vmm_rw::status_e              status,
00219                              input  bit [`VMM_RAL_ADDR_WIDTH-1:0] mem_addr,
00220                              input  bit [`VMM_RAL_DATA_WIDTH-1:0] value,
00221                              input  vmm_ral::path_e               path   = vmm_ral::DEFAULT,
00222                              input  string                        domain = "",
00223                              input  int                           data_id = -1,
00224                              input  int                           scenario_id = -1,
00225                              input  int                           stream_id = -1);
00226 
00227    extern virtual task read(output vmm_rw::status_e              status,
00228                             input  bit [`VMM_RAL_ADDR_WIDTH-1:0] mem_addr,
00229                             output bit [`VMM_RAL_DATA_WIDTH-1:0] value,
00230                             input  vmm_ral::path_e               path   = vmm_ral::DEFAULT,
00231                             input  string                        domain = "",
00232                             input  int                           data_id = -1,
00233                             input  int                           scenario_id = -1,
00234                             input  int                           stream_id = -1);
00235 
00236    extern local function bit validate_burst(vmm_ral_mem_burst burst);
00237 
00238    extern virtual task burst_write(output vmm_rw::status_e              status,
00239                                    input  vmm_ral_mem_burst             burst,
00240                                    input  bit [`VMM_RAL_DATA_WIDTH-1:0] value[],
00241                                    input  vmm_ral::path_e               path   = vmm_ral::DEFAULT,
00242                                    input  string                        domain = "",
00243                                    input  int                           data_id = -1,
00244                                    input  int                           scenario_id = -1,
00245                                    input  int                           stream_id = -1);
00246 
00247    extern virtual task burst_read(output vmm_rw::status_e              status,
00248                                   input  vmm_ral_mem_burst             burst,
00249                                   output bit [`VMM_RAL_DATA_WIDTH-1:0] value[],
00250                                   input  vmm_ral::path_e               path   = vmm_ral::DEFAULT,
00251                                   input  string                        domain = "",
00252                                   input  int                           data_id = -1,
00253                                   input  int                           scenario_id = -1,
00254                                   input  int                           stream_id = -1);
00255 
00256    extern virtual task poke(output vmm_rw::status_e              status,
00257                             input  bit [`VMM_RAL_ADDR_WIDTH-1:0] mem_addr,
00258                             input  bit [`VMM_RAL_DATA_WIDTH-1:0] value,
00259                             input  int                           data_id = -1,
00260                             input  int                           scenario_id = -1,
00261                             input  int                           stream_id = -1);
00262 
00263    extern virtual task peek(output vmm_rw::status_e              status,
00264                             input  bit [`VMM_RAL_ADDR_WIDTH-1:0] mem_addr,
00265                             output bit [`VMM_RAL_DATA_WIDTH-1:0] value,
00266                             input  int                           data_id = -1,
00267                             input  int                           scenario_id = -1,
00268                             input  int                           stream_id = -1);
00269 
00270    extern virtual task readmemh(string filename);
00271    extern virtual task writememh(string filename);
00272 
00273    extern function void set_frontdoor(vmm_ral_mem_frontdoor ftdr,
00274                                       string                domain = "");
00275    extern function vmm_ral_mem_frontdoor get_frontdoor(string domain = "");
00276    extern function void set_backdoor(vmm_ral_mem_backdoor bkdr);
00277    extern function vmm_ral_mem_backdoor get_backdoor();
00278 
00279    extern function void prepend_callback(vmm_ral_mem_callbacks cb);
00280    extern function void append_callback(vmm_ral_mem_callbacks cb);
00281    extern function void unregister_callback(vmm_ral_mem_callbacks cb);
00282 
00283    extern local function int get_domain_index(string domain);
00284 
00285    extern function int unsigned get_mem_ID();
00286 endclass: vmm_ral_mem