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_sys_domain; 00024 vmm_ral_block blocks[$]; 00025 string blk_domains[$]; 00026 vmm_ral_sys subsys[$]; 00027 string sys_domains[$]; 00028 endclass 00029 00030 class vmm_ral_sys extends vmm_ral_block_or_sys; 00031 local vmm_ral_sys_domain domains[]; 00032 00033 extern function new( 00034 vmm_ral_sys parent = null, 00035 string name, 00036 string typename, 00037 int unsigned n_bytes, 00038 vmm_ral::endianness_e endian, 00039 bit [`VMM_RAL_ADDR_WIDTH-1:0] base_addr = 0, 00040 string domain = "", 00041 bit cover_on = 1 00042 ); 00043 00044 /*local*/ extern virtual function void Xlock_modelX(); 00045 /*local*/ extern virtual function void add_domain(int unsigned n_bytes, 00046 vmm_ral::endianness_e endian, 00047 string domain); 00048 /*local*/ extern function void register_block(vmm_ral_block block, 00049 string domain = "", 00050 string in_domain = "", 00051 bit [`VMM_RAL_ADDR_WIDTH-1:0] base_addr); 00052 /*local*/ extern function void register_subsys(vmm_ral_sys subsys, 00053 string domain = "", 00054 string in_domain = "", 00055 bit [`VMM_RAL_ADDR_WIDTH-1:0]base_addr); 00056 /*local*/ extern virtual function void Xregister_ral_accessX(vmm_ral_access access); 00057 00058 extern virtual function string psdisplay(string prefix = "", 00059 string domain = ""); 00060 00061 extern virtual function void get_fields(ref vmm_ral_field fields[], 00062 input string domain = ""); 00063 extern virtual function void get_virtual_fields(ref vmm_ral_vfield fields[], 00064 input string domain = ""); 00065 extern virtual function vmm_ral_field get_field_by_name(string name); 00066 extern virtual function vmm_ral_vfield get_virtual_field_by_name(string name); 00067 00068 extern virtual function void get_registers(ref vmm_ral_reg regs[], 00069 input string domain = ""); 00070 extern virtual function void get_virtual_registers(ref vmm_ral_vreg vregs[], 00071 input string domain = ""); 00072 extern virtual function vmm_ral_reg get_reg_by_name(string name); 00073 extern virtual function vmm_ral_vreg get_vreg_by_name(string name); 00074 extern virtual function vmm_ral_reg get_reg_by_offset(bit [`VMM_RAL_ADDR_WIDTH-1:0] offset, 00075 string domain = ""); 00076 extern virtual function vmm_ral_vreg get_vreg_by_offset(bit [`VMM_RAL_ADDR_WIDTH-1:0] offset, 00077 string domain = ""); 00078 00079 extern virtual function void get_memories(ref vmm_ral_mem mems[], 00080 input string domain = ""); 00081 extern virtual function vmm_ral_mem get_mem_by_name(string name); 00082 extern virtual function vmm_ral_mem get_mem_by_offset(bit [`VMM_RAL_ADDR_WIDTH-1:0] offset, 00083 string domain = ""); 00084 00085 extern virtual function void get_blocks(ref vmm_ral_block blocks[], 00086 ref string domains[], 00087 input string domain = ""); 00088 extern virtual function void get_all_blocks(ref vmm_ral_block blocks[], 00089 ref string domains[], 00090 input string domain = ""); 00091 extern virtual function vmm_ral_block get_block_by_name(string name); 00092 extern virtual function vmm_ral_block get_block_by_offset(bit [`VMM_RAL_ADDR_WIDTH-1:0] offset, 00093 string domain = ""); 00094 00095 extern virtual function void get_subsys(ref vmm_ral_sys subsys[], 00096 ref string domains[], 00097 input string domain = ""); 00098 extern virtual function void get_all_subsys(ref vmm_ral_sys subsys[], 00099 ref string domains[], 00100 input string domain = ""); 00101 extern virtual function vmm_ral_sys get_subsys_by_name(string name); 00102 extern virtual function vmm_ral_sys get_subsys_by_offset(bit [`VMM_RAL_ADDR_WIDTH-1:0] offset, 00103 string domain = ""); 00104 00105 extern function bit set_cover(bit is_on); 00106 00107 extern virtual function void reset(string domain = "", 00108 vmm_ral::reset_e kind = vmm_ral::HARD); 00109 extern virtual function bit needs_update(); 00110 00111 extern virtual task update(output vmm_rw::status_e status, 00112 input vmm_ral::path_e path = vmm_ral::DEFAULT); 00113 extern virtual task mirror(output vmm_rw::status_e status, 00114 input vmm_ral::check_e check = vmm_ral:: QUIET, 00115 input vmm_ral::path_e path = vmm_ral::DEFAULT); 00116 00117 extern virtual task readmemh(string filename); 00118 extern virtual task writememh(string filename); 00119 endclass: vmm_ral_sys 00120 00121 00122 function vmm_ral_sys::new(vmm_ral_sys parent, 00123 string name, 00124 string typename, 00125 int unsigned n_bytes, 00126 vmm_ral::endianness_e endian, 00127 bit [`VMM_RAL_ADDR_WIDTH-1:0] base_addr, 00128 string domain, 00129 bit cover_on); 00130 super.new(parent, "RAL System", name, typename, 00131 n_bytes, endian, base_addr, domain, 00132 cover_on); 00133 00134 this.domains = new [1]; 00135 this.domains[0] = new; 00136 endfunction: new 00137 00138 00139 function void vmm_ral_sys::Xlock_modelX(); 00140 if (this.Xis_lockedX()) return; 00141 00142 super.Xlock_modelX(); 00143 foreach (this.domains[i]) begin 00144 foreach (this.domains[i].blocks[j]) begin 00145 this.domains[i].blocks[j].Xlock_modelX(); 00146 end 00147 foreach (this.domains[i].subsys[j]) begin 00148 this.domains[i].subsys[j].Xlock_modelX(); 00149 end 00150 end 00151 endfunction: Xlock_modelX 00152 00153 00154 function void vmm_ral_sys::add_domain(int unsigned n_bytes, 00155 vmm_ral::endianness_e endian, 00156 string domain); 00157 int n; 00158 00159 super.add_domain(n_bytes, endian, domain); 00160 00161 n = this.domains.size(); 00162 this.domains = new [n+1] (this.domains); 00163 this.domains[n] = new; 00164 endfunction: add_domain 00165 00166 00167 function void vmm_ral_sys::register_block(vmm_ral_block block, 00168 string domain, 00169 string in_domain, 00170 bit [`VMM_RAL_ADDR_WIDTH-1:0] base_addr); 00171 string doms[]; 00172 vmm_ral_sys_domain dom; 00173 00174 if (this.Xis_lockedX()) begin 00175 `vmm_error(this.log, "Cannot add block to locked system model"); 00176 return; 00177 end 00178 00179 block.get_domains(doms); 00180 foreach (doms[i]) begin 00181 if (doms[i] == domain) begin 00182 int j = this.get_domain_index(in_domain); 00183 if (j < 0) return; 00184 00185 dom = this.domains[j]; 00186 dom.blocks.push_back(block); 00187 dom.blk_domains.push_back(domain); 00188 00189 begin 00190 int k; 00191 j = this.get_n_bytes(in_domain); 00192 k = block.get_n_bytes(domain); 00193 if (k > j) begin 00194 `vmm_warning(this.log, $psprintf("%0d-byte block %s.%s instantiated in %0d-byte system %s.%s", 00195 k, block.get_name(), domain, 00196 j, this.get_name(), in_domain)); 00197 end 00198 end 00199 00200 block.map_domain(domain, in_domain, base_addr); 00201 00202 return; 00203 end 00204 end 00205 00206 `vmm_error(this.log, $psprintf("Domain \"%s\" not found in block \"%s\".", 00207 domain, block.get_name())); 00208 endfunction: register_block 00209 00210 00211 function void vmm_ral_sys::register_subsys(vmm_ral_sys subsys, 00212 string domain, 00213 string in_domain, 00214 bit [`VMM_RAL_ADDR_WIDTH-1:0] base_addr); 00215 string doms[]; 00216 vmm_ral_sys_domain dom; 00217 int i; 00218 00219 if (this.Xis_lockedX()) begin 00220 `vmm_error(this.log, "Cannot add subsystem to locked system model"); 00221 return; 00222 end 00223 00224 subsys.get_domains(doms); 00225 foreach (doms[i]) begin 00226 if (doms[i] == domain) begin 00227 int j = this.get_domain_index(in_domain); 00228 if (j < 0) return; 00229 00230 dom = this.domains[j]; 00231 dom.subsys.push_back(subsys); 00232 dom.sys_domains.push_back(domain); 00233 00234 begin 00235 int k; 00236 j = this.get_n_bytes(in_domain); 00237 k = subsys.get_n_bytes(domain); 00238 if (k > j) begin 00239 `vmm_warning(this.log, $psprintf("%0d-byte system %s.%s instantiated in %0d-byte system %s.%s", 00240 k, subsys.get_name(), domain, 00241 j, this.get_name(), in_domain)); 00242 end 00243 end 00244 00245 subsys.map_domain(domain, in_domain, base_addr); 00246 00247 return; 00248 end 00249 end 00250 00251 `vmm_error(this.log, $psprintf("Domain \"%s\" not found in system \"%s\".", 00252 domain, subsys.get_fullname())); 00253 endfunction: register_subsys 00254 00255 00256 function void vmm_ral_sys::Xregister_ral_accessX(vmm_ral_access access); 00257 // There can only be one RAL Access on a RAL model 00258 if (this.ral_access != null && this.ral_access != access) begin 00259 `vmm_fatal(this.log, $psprintf("System %s is already used by another RAL access instance", this.get_fullname())); 00260 end 00261 this.ral_access = access; 00262 00263 // Register all sub-elements 00264 begin 00265 vmm_ral_sys sys[]; 00266 vmm_ral_block blks[]; 00267 string domains[]; 00268 00269 this.get_subsys(sys, domains); 00270 foreach (sys[i]) begin 00271 sys[i].Xregister_ral_accessX(access); 00272 end 00273 00274 this.get_blocks(blks, domains); 00275 foreach (blks[i]) begin 00276 blks[i].Xregister_ral_accessX(access); 00277 end 00278 end 00279 endfunction: Xregister_ral_accessX 00280 00281 00282 function string vmm_ral_sys::psdisplay(string prefix, 00283 string domain); 00284 string image; 00285 string domains[]; 00286 string blk_domains[]; 00287 vmm_ral_sys sys[]; 00288 vmm_ral_block blks[]; 00289 bit single_domain; 00290 vmm_ral::endianness_e endian; 00291 00292 single_domain = 1; 00293 if (domain == "") begin 00294 this.get_domains(domains); 00295 if (domains.size() > 1) single_domain = 0; 00296 end 00297 00298 if (single_domain) begin 00299 $sformat(image, "%sSystem %s", prefix, this.get_fullname()); 00300 if (domain != "") $sformat(image, "%s.%s", image, domain); 00301 endian = this.get_endian(domain); 00302 $sformat(image, "%s -- %0d bytes (%s)", image, 00303 this.get_n_bytes(domain), endian.name()); 00304 00305 this.get_blocks(blks, blk_domains, domain); 00306 foreach (blks[i]) begin 00307 string img; 00308 img = blks[i].psdisplay({prefix, " "}, blk_domains[i]); 00309 image = {image, "\n", img}; 00310 end 00311 00312 this.get_subsys(sys, blk_domains, domain); 00313 foreach (sys[i]) begin 00314 string img; 00315 img = sys[i].psdisplay({prefix, " "}, blk_domains[i]); 00316 image = {image, "\n", img}; 00317 end 00318 end 00319 else begin 00320 $sformat(image, "%sSystem %s", prefix, this.get_fullname()); 00321 foreach (domains[i]) begin 00322 string img; 00323 endian = this.get_endian(domains[i]); 00324 $sformat(img, "%s Domain \"%s\" -- %0d bytes (%s)", 00325 prefix, domains[i], 00326 this.get_n_bytes(domains[i]), endian.name()); 00327 image = {image, "\n", img}; 00328 00329 this.get_blocks(blks, blk_domains, domains[i]); 00330 foreach (blks[j]) begin 00331 img = blks[j].psdisplay({prefix, " "}, 00332 blk_domains[j]); 00333 image = {image, "\n", img}; 00334 end 00335 00336 this.get_subsys(sys, blk_domains, domains[i]); 00337 foreach (sys[j]) begin 00338 img = sys[j].psdisplay({prefix, " "}, 00339 blk_domains[j]); 00340 image = {image, "\n", img}; 00341 end 00342 end 00343 end 00344 return image; 00345 endfunction: psdisplay 00346 00347 00348 function void vmm_ral_sys::get_fields(ref vmm_ral_field fields[], 00349 input string domain); 00350 int n; 00351 vmm_ral_block b[]; 00352 string d[]; 00353 vmm_ral_field f[]; 00354 00355 this.get_all_blocks(b, d, domain); 00356 fields = new [0]; 00357 foreach (b[i]) begin 00358 b[i].get_fields(f, d[i]); 00359 n = fields.size(); 00360 fields = new [n + f.size()] (fields); 00361 00362 foreach (f[j]) begin 00363 fields[n++] = f[j]; 00364 end 00365 end 00366 endfunction: get_fields 00367 00368 function void vmm_ral_sys::get_virtual_fields(ref vmm_ral_vfield fields[], 00369 input string domain); 00370 int n; 00371 vmm_ral_block b[]; 00372 string d[]; 00373 vmm_ral_vfield f[]; 00374 00375 this.get_all_blocks(b, d, domain); 00376 fields = new [0]; 00377 foreach (b[i]) begin 00378 b[i].get_virtual_fields(f, d[i]); 00379 n = fields.size(); 00380 fields = new [n + f.size()] (fields); 00381 00382 foreach (f[j]) begin 00383 fields[n++] = f[j]; 00384 end 00385 end 00386 endfunction: get_virtual_fields 00387 00388 function vmm_ral_field vmm_ral_sys::get_field_by_name(string name); 00389 // Search the registers to find the first field of the specified name 00390 vmm_ral_reg r[]; 00391 00392 this.get_registers(r); 00393 foreach (r[i]) begin 00394 vmm_ral_field fields[]; 00395 r[i].get_fields(fields); 00396 foreach (fields[j]) begin 00397 if (fields[j].get_name() == name) begin 00398 return fields[j]; 00399 end 00400 end 00401 end 00402 `vmm_warning(this.log, $psprintf("Unable to locate field \"%s\" in system \"%s\".", 00403 name, this.get_fullname())); 00404 get_field_by_name = null; 00405 endfunction: get_field_by_name 00406 00407 function vmm_ral_vfield vmm_ral_sys::get_virtual_field_by_name(string name); 00408 // Search the registers to find the first field of the specified name 00409 vmm_ral_vreg r[]; 00410 00411 this.get_virtual_registers(r); 00412 foreach (r[i]) begin 00413 vmm_ral_vfield fields[]; 00414 r[i].get_fields(fields); 00415 foreach (fields[j]) begin 00416 if (fields[j].get_name() == name) begin 00417 return fields[j]; 00418 end 00419 end 00420 end 00421 `vmm_warning(this.log, $psprintf("Unable to locate virtual field \"%s\" in system \"%s\".", 00422 name, this.get_fullname())); 00423 get_virtual_field_by_name = null; 00424 endfunction: get_virtual_field_by_name 00425 00426 function void vmm_ral_sys::get_registers(ref vmm_ral_reg regs[], 00427 input string domain); 00428 vmm_ral_block blks[]; 00429 string d[]; 00430 00431 regs = new [0]; 00432 00433 this.get_all_blocks(blks, d, domain); 00434 foreach (blks[i]) begin 00435 int n = regs.size(); 00436 vmm_ral_reg rg[]; 00437 00438 blks[i].get_registers(rg, d[i]); 00439 regs = new [n + rg.size()] (regs); 00440 00441 foreach (rg[j]) begin 00442 regs[n+j] = rg[j]; 00443 end 00444 end 00445 endfunction: get_registers 00446 00447 function void vmm_ral_sys::get_virtual_registers(ref vmm_ral_vreg vregs[], 00448 input string domain); 00449 vmm_ral_block blks[]; 00450 string d[]; 00451 00452 vregs = new [0]; 00453 00454 this.get_all_blocks(blks, d, domain); 00455 foreach (blks[i]) begin 00456 int n = vregs.size(); 00457 vmm_ral_vreg rg[]; 00458 00459 blks[i].get_virtual_registers(rg, d[i]); 00460 vregs = new [n + rg.size()] (vregs); 00461 00462 foreach (rg[j]) begin 00463 vregs[n+j] = rg[j]; 00464 end 00465 end 00466 endfunction: get_virtual_registers 00467 00468 function vmm_ral_reg vmm_ral_sys::get_reg_by_name(string name); 00469 // Search the registers to find the first of the specified name 00470 vmm_ral_reg r[]; 00471 00472 this.get_registers(r); 00473 foreach (r[i]) begin 00474 if (r[i].get_name() == name) begin 00475 return r[i]; 00476 end 00477 end 00478 `vmm_warning(this.log, $psprintf("Unable to locate register \"%s\" in system \"%s\".", 00479 name, this.get_fullname())); 00480 get_reg_by_name = null; 00481 endfunction: get_reg_by_name 00482 00483 function vmm_ral_vreg vmm_ral_sys::get_vreg_by_name(string name); 00484 // Search the registers to find the first of the specified name 00485 vmm_ral_vreg r[]; 00486 00487 this.get_virtual_registers(r); 00488 foreach (r[i]) begin 00489 if (r[i].get_name() == name) begin 00490 return r[i]; 00491 end 00492 end 00493 `vmm_warning(this.log, $psprintf("Unable to locate virtual register \"%s\" in system \"%s\".", 00494 name, this.get_fullname())); 00495 get_vreg_by_name = null; 00496 endfunction: get_vreg_by_name 00497 00498 function vmm_ral_reg vmm_ral_sys::get_reg_by_offset(bit [`VMM_RAL_ADDR_WIDTH-1:0] offset, 00499 string domain); 00500 endfunction: get_reg_by_offset 00501 00502 function vmm_ral_vreg vmm_ral_sys::get_vreg_by_offset(bit [`VMM_RAL_ADDR_WIDTH-1:0] offset, 00503 string domain); 00504 endfunction: get_vreg_by_offset 00505 00506 function void vmm_ral_sys::get_memories(ref vmm_ral_mem mems[], 00507 input string domain); 00508 vmm_ral_block blks[]; 00509 string d[]; 00510 00511 mems = new [0]; 00512 00513 this.get_all_blocks(blks, d, domain); 00514 foreach (blks[i]) begin 00515 integer n = mems.size(); 00516 vmm_ral_mem mm[]; 00517 00518 blks[i].get_memories(mm, domain); 00519 mems = new [n + mm.size()] (mems); 00520 00521 foreach (mm[j]) begin 00522 mems[n+j] = mm[j]; 00523 end 00524 end 00525 endfunction: get_memories 00526 00527 00528 function vmm_ral_mem vmm_ral_sys::get_mem_by_name(string name); 00529 // Search the memories to find the first of the specified name 00530 vmm_ral_mem m[]; 00531 00532 this.get_memories(m); 00533 foreach (m[i]) begin 00534 if (m[i].get_name() == name) begin 00535 return m[i]; 00536 end 00537 end 00538 `vmm_warning(this.log, $psprintf("Unable to locate memory \"%s\" in system \"%s\".", 00539 name, this.get_fullname())); 00540 get_mem_by_name = null; 00541 endfunction: get_mem_by_name 00542 00543 00544 function vmm_ral_mem vmm_ral_sys::get_mem_by_offset(bit [`VMM_RAL_ADDR_WIDTH-1:0] offset, 00545 string domain); 00546 endfunction: get_mem_by_offset 00547 00548 00549 function void vmm_ral_sys::get_blocks(ref vmm_ral_block blocks[], 00550 ref string domains[], 00551 input string domain); 00552 if (domain == "" && this.domains.size() > 1) begin 00553 blocks = new [0]; 00554 domains = new [0]; 00555 00556 foreach (this.domains[i]) begin 00557 int n = blocks.size(); 00558 00559 blocks = new [n + this.domains[i].blocks.size()] (blocks); 00560 domains = new [n + this.domains[i].blocks.size()] (domains); 00561 00562 foreach (this.domains[i].blocks[j]) begin 00563 blocks[n+j] = this.domains[i].blocks[j]; 00564 domains[n+j] = this.domains[i].blk_domains[j]; 00565 end 00566 end 00567 end 00568 else begin 00569 vmm_ral_sys_domain dom; 00570 int i; 00571 00572 i = this.get_domain_index(domain); 00573 if (i < 0) return; 00574 00575 dom = this.domains[i]; 00576 blocks = new [dom.blocks.size()]; 00577 domains = new [dom.blocks.size()]; 00578 00579 foreach (dom.blocks[j]) begin 00580 blocks[j] = dom.blocks[j]; 00581 domains[j] = dom.blk_domains[j]; 00582 end 00583 end 00584 endfunction: get_blocks 00585 00586 00587 function void vmm_ral_sys::get_all_blocks(ref vmm_ral_block blocks[], 00588 ref string domains[], 00589 input string domain); 00590 vmm_ral_block blks[]; 00591 vmm_ral_sys sys[]; 00592 string doms[]; 00593 string subdoms[]; 00594 00595 this.get_blocks(blocks, domains, domain); 00596 00597 this.get_all_subsys(sys, subdoms, domain); 00598 foreach (sys[i]) begin 00599 int n = blocks.size(); 00600 00601 sys[i].get_blocks(blks, doms, subdoms[i]); 00602 blocks = new [n + blks.size()] (blocks); 00603 domains = new [n + blks.size()] (domains); 00604 00605 foreach (blks[j]) begin 00606 blocks[n+j] = blks[j]; 00607 domains[n+j] = doms[j]; 00608 end 00609 end 00610 endfunction: get_all_blocks 00611 00612 00613 function vmm_ral_block vmm_ral_sys::get_block_by_name(string name); 00614 vmm_ral_block blks[]; 00615 string d[]; 00616 00617 this.get_all_blocks(blks, d); 00618 foreach (blks[i]) begin 00619 if (blks[i].get_name() == name) begin 00620 return blks[i]; 00621 end 00622 end 00623 `vmm_warning(this.log, $psprintf("Unable to locate block \"%s\" in system \"%s\".", 00624 name, this.get_fullname())); 00625 get_block_by_name = null; 00626 endfunction: get_block_by_name 00627 00628 00629 function vmm_ral_block vmm_ral_sys::get_block_by_offset(bit [`VMM_RAL_ADDR_WIDTH-1:0] offset, 00630 string domain); 00631 endfunction: get_block_by_offset 00632 00633 00634 function void vmm_ral_sys::get_subsys(ref vmm_ral_sys subsys[], 00635 ref string domains[], 00636 input string domain); 00637 if (domain == "" && this.domains.size() > 1) begin 00638 subsys = new [0]; 00639 domains = new [0]; 00640 00641 foreach (this.domains[i]) begin 00642 int n = subsys.size(); 00643 00644 subsys = new [n + this.domains[i].subsys.size()] (subsys); 00645 domains = new [n + this.domains[i].subsys.size()] (domains); 00646 00647 foreach (this.domains[i].subsys[j]) begin 00648 subsys[n+j] = this.domains[i].subsys[j]; 00649 domains[n+j] = this.domains[i].sys_domains[j]; 00650 end 00651 end 00652 end 00653 else begin 00654 vmm_ral_sys_domain dom; 00655 int i; 00656 00657 i = this.get_domain_index(domain); 00658 if (i < 0) return; 00659 00660 dom = this.domains[i]; 00661 subsys = new [dom.subsys.size()]; 00662 domains = new [dom.subsys.size()]; 00663 00664 foreach (dom.subsys[j]) begin 00665 subsys[j] = dom.subsys[j]; 00666 domains[j] = dom.sys_domains[j]; 00667 end 00668 end 00669 endfunction: get_subsys 00670 00671 00672 function void vmm_ral_sys::get_all_subsys(ref vmm_ral_sys subsys[], 00673 ref string domains[], 00674 input string domain); 00675 vmm_ral_sys sys[]; 00676 string subdoms[]; 00677 vmm_ral_sys ss[]; 00678 string doms[]; 00679 00680 subsys = new [0]; 00681 domains = new[0]; 00682 00683 this.get_subsys(sys, subdoms, domain); 00684 00685 foreach (sys[i]) begin 00686 int n = subsys.size() + 1; 00687 00688 sys[i].get_all_subsys(ss, doms, subdoms[i]); 00689 subsys = new [n + ss.size()] (subsys); 00690 domains = new [n + ss.size()] (domains); 00691 00692 subsys[n-1] = sys[i]; 00693 domains[n-1] = subdoms[i]; 00694 00695 foreach (ss[j]) begin 00696 subsys[n+j] = ss[j]; 00697 domains[n+j] = doms[j]; 00698 end 00699 end 00700 endfunction: get_all_subsys 00701 00702 00703 function vmm_ral_sys vmm_ral_sys::get_subsys_by_name(string name); 00704 vmm_ral_sys subsys[]; 00705 string d[]; 00706 00707 this.get_all_subsys(subsys, d); 00708 foreach (subsys[i]) begin 00709 if (subsys[i].get_name() == name) begin 00710 return subsys[i]; 00711 end 00712 end 00713 `vmm_warning(this.log, $psprintf("Unable to locate subsystem \"%s\" in system \"%s\".", 00714 name, this.get_fullname())); 00715 get_subsys_by_name = null; 00716 endfunction: get_subsys_by_name 00717 00718 00719 function vmm_ral_sys vmm_ral_sys::get_subsys_by_offset(bit [`VMM_RAL_ADDR_WIDTH-1:0] offset, 00720 string domain); 00721 endfunction: get_subsys_by_offset 00722 00723 00724 function bit vmm_ral_sys::set_cover(bit is_on); 00725 set_cover = super.set_cover(is_on); 00726 00727 if (is_on && !super.is_cover_on()) return set_cover; 00728 00729 foreach (this.domains[i]) begin 00730 foreach (this.domains[i].blocks[j]) begin 00731 this.domains[i].blocks[j].set_cover(is_on); 00732 end 00733 foreach (this.domains[i].subsys[j]) begin 00734 this.domains[i].subsys[j].set_cover(is_on); 00735 end 00736 end 00737 endfunction: set_cover 00738 00739 00740 function void vmm_ral_sys::reset(string domain, 00741 vmm_ral::reset_e kind); 00742 if (domain == "" && this.domains.size() > 1) begin 00743 foreach (this.domains[i]) begin 00744 foreach (this.domains[i].blocks[j]) begin 00745 this.domains[i].blocks[j].reset(this.domains[i].blk_domains[j], 00746 kind); 00747 end 00748 foreach (this.domains[i].subsys[j]) begin 00749 this.domains[i].subsys[j].reset(this.domains[i].sys_domains[j], 00750 kind); 00751 end 00752 end 00753 end 00754 else begin 00755 int i; 00756 00757 i = this.get_domain_index(domain); 00758 if (i < 0) return; 00759 00760 foreach (this.domains[i].blocks[j]) begin 00761 this.domains[i].blocks[j].reset(this.domains[i].blk_domains[j], 00762 kind); 00763 end 00764 foreach (this.domains[i].subsys[j]) begin 00765 this.domains[i].subsys[j].reset(this.domains[i].sys_domains[j], 00766 kind); 00767 end 00768 end 00769 endfunction: reset 00770 00771 00772 function bit vmm_ral_sys::needs_update(); 00773 needs_update = 0; 00774 foreach (this.domains[i]) begin 00775 foreach (this.domains[i].blocks[j]) begin 00776 if (this.domains[i].blocks[j].needs_update()) begin 00777 return 1; 00778 end 00779 end 00780 foreach (this.domains[i].subsys[j]) begin 00781 if (this.domains[i].subsys[j].needs_update()) begin 00782 return 1; 00783 end 00784 end 00785 end 00786 endfunction: needs_update 00787 00788 00789 task vmm_ral_sys::update(output vmm_rw::status_e status, 00790 input vmm_ral::path_e path); 00791 status = vmm_rw::IS_OK; 00792 foreach (this.domains[i]) begin 00793 foreach (this.domains[i].blocks[j]) begin 00794 this.domains[i].blocks[j].update(status, path); 00795 if (status != vmm_rw::IS_OK) return; 00796 end 00797 foreach (this.domains[i].subsys[j]) begin 00798 this.domains[i].subsys[j].update(status, path); 00799 if (status != vmm_rw::IS_OK) return; 00800 end 00801 end 00802 endtask: update 00803 00804 00805 task vmm_ral_sys::mirror(output vmm_rw::status_e status, 00806 input vmm_ral::check_e check, 00807 input vmm_ral::path_e path); 00808 status = vmm_rw::IS_OK; 00809 foreach (this.domains[i]) begin 00810 foreach (this.domains[i].blocks[j]) begin 00811 this.domains[i].blocks[j].mirror(status, check, path); 00812 if (status != vmm_rw::IS_OK) return; 00813 end 00814 foreach (this.domains[i].subsys[j]) begin 00815 this.domains[i].subsys[j].mirror(status, check, path); 00816 if (status != vmm_rw::IS_OK) return; 00817 end 00818 end 00819 endtask: mirror 00820 00821 00822 task vmm_ral_sys::readmemh(string filename); 00823 endtask: readmemh 00824 00825 00826 task vmm_ral_sys::writememh(string filename); 00827 endtask: writememh 00828
![]() Intelligent Design Verification Project: VMM, Revision: 1.0.0 |
Copyright (c) 2008 Intelligent Design Verification. Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.2 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. A copy of the license is included here: http://www.intelligentdv.com/licenses/fdl.txt |
![]() Doxygen Version: 1.5.6 Sat Oct 18 11:38:21 2008 |