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