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