vmm_ral_sys.sv

Go to the documentation of this file.
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
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
Doxygen Version: 1.5.6
Sat Oct 18 11:38:21 2008
Find a documentation bug? Report bugs to: bugs.intelligentdv.com Project: DoxygenFilterSV