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