VMM - (expanded) RAL/vmm_ral_block.sv

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_block.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_block extends vmm_ral_block_or_sys;
00024: 
00025:    local vmm_ral_reg  regs[$];
00026:    local vmm_ral_vreg vregs[$];
00027:    local vmm_ral_mem  mems[$];
00028:    static local vmm_ral_block __vmm_all_blocks[*];  // Keeps track of all Blocks in the RAL Model
00029:    local int unsigned __vmm_block_id = 0;
00030: 
00031:    extern function new(vmm_ral_sys                   parent,
00032:                        string                        name,
00033:                        string                        typename,
00034:                        int unsigned                  n_bytes,
00035:                        vmm_ral::endianness_e         endian,
00036:                        bit [64-1:0] base_addr,
00037:                        string                        domain   = "",
00038:                        bit                           cover_on = 1);
00039: 
00040:    /*local*/ extern virtual function void Xlock_modelX();
00041:    /*local*/ extern function void register_reg(vmm_ral_reg register);
00042:    /*local*/ extern function void register_vreg(vmm_ral_vreg register);
00043:    /*local*/ extern function void register_mem(vmm_ral_mem memory);
00044:    /*local*/ extern virtual function void Xregister_ral_accessX(vmm_ral_access access);
00045: 
00046:    extern virtual function string psdisplay(string prefix = "",
00047:                                             string domain = "");
00048: 
00049:    extern virtual function void get_fields(ref vmm_ral_field fields[],
00050:                                            input string      domain = ""); 
00051:    extern virtual function void get_virtual_fields(ref vmm_ral_vfield fields[],
00052:                                                    input string      domain = ""); 
00053:    extern virtual function vmm_ral_field get_field_by_name(string name);
00054:    extern virtual function vmm_ral_vfield get_virtual_field_by_name(string name);
00055: 
00056:    extern virtual function void get_registers(ref vmm_ral_reg regs[],
00057:                                               input string    domain = "");
00058:    extern virtual function void get_virtual_registers(ref vmm_ral_vreg vregs[],
00059:                                                       input string    domain = "");
00060:    extern virtual function vmm_ral_reg get_reg_by_name(string name);
00061:    extern virtual function vmm_ral_vreg get_vreg_by_name(string name);
00062:    extern virtual function vmm_ral_reg get_reg_by_offset(bit [64-1:0] offset,
00063:                                                          string                        domain = "");
00064: 
00065:    extern virtual function void get_memories(ref vmm_ral_mem mems[],
00066:                                              input string    domain = "");
00067:    extern virtual function vmm_ral_mem get_mem_by_name(string name);
00068:    extern virtual function vmm_ral_mem get_mem_by_offset(bit [64-1:0] offset,
00069:                                                          string                        domain = "");
00070: 
00071:    extern virtual function void get_constraints(ref string names[]);
00072: 
00073:    extern virtual function bit set_cover(bit is_on);
00074: 
00075:    extern virtual function void reset(string           domain = "",
00076:                                       vmm_ral::reset_e kind   = vmm_ral::HARD);
00077:    extern virtual function bit needs_update();
00078: 
00079:    extern virtual task update(output vmm_rw::status_e status,
00080:                               input  vmm_ral::path_e  path = vmm_ral::DEFAULT);
00081:    extern virtual task mirror(output vmm_rw::status_e status,
00082:                               input  vmm_ral::check_e check = vmm_ral::	QUIET,
00083:                               input  vmm_ral::path_e  path  = vmm_ral::DEFAULT);
00084:    
00085:    extern virtual task readmemh(string filename);
00086:    extern virtual task writememh(string filename);
00087: 
00088:    extern virtual /*local*/ function void XsampleX(bit [64-1:0] addr,
00089:                                                    int                           domain);
00090:    extern protected virtual function void sample(bit [64-1:0] addr,
00091:                                                  int                           domain);
00092: 
00093:    extern function int unsigned get_block_ID(); 
00094: 
00095:    extern /*static*/ function vmm_ral_block get_block_by_ID(int unsigned id); 
00096: endclass: vmm_ral_block
00097:    
00098: 
00099: function vmm_ral_block::new(vmm_ral_sys                   parent,
00100:                             string                        name,
00101:                             string                        typename,
00102:                             int unsigned                  n_bytes,
00103:                             vmm_ral::endianness_e         endian,
00104:                             bit [64-1:0] base_addr,
00105:                             string                        domain,
00106:                             bit                           cover_on);
00107:    super.new(parent, "RAL Block", name, typename,
00108:              n_bytes, endian, base_addr, domain,
00109:              cover_on);
00110: 
00111:    // Initialize Block ID
00112:    this.__vmm_block_id = ++this.__vmm_block_or_sys_id_factory;
00113:    __vmm_all_blocks[this.__vmm_block_id] = this;
00114: endfunction: new
00115: 
00116: 
00117: function void vmm_ral_block::Xlock_modelX();
00118:    if (this.Xis_lockedX()) return;
00119: 
00120:    super.Xlock_modelX();
00121:    foreach (this.regs[i]) begin
00122:       this.regs[i].Xlock_modelX();
00123:    end
00124:    foreach (this.mems[i]) begin
00125:       this.mems[i].Xlock_modelX();
00126:    end
00127: endfunction: Xlock_modelX
00128: 
00129: 
00130: function void vmm_ral_block::register_reg(vmm_ral_reg register);
00131:    if (this.Xis_lockedX()) begin
00132:       
     : do 
     :    if (this.log.start_msg(vmm_log::FAILURE_TYP, vmm_log::ERROR_SEV)) begin 
     :       void'(this.log.text("Cannot add register to locked block model")); 
     :       this.log.end_msg(); 
     :    end 
     : while (0);
00133:       return;
00134:    end
00135: 
00136:    // Check if this register has already been registered with this block
00137:    foreach (this.regs[i]) begin
00138:       if (this.regs[i] == register) begin
00140: 
     : do 
     :    if (this.log.start_msg(vmm_log::FAILURE_TYP, vmm_log::ERROR_SEV)) begin 
     :       void'(this.log.text($psprintf("Register \"%s\" has already been registered with block \"%s\".\n",
     :                                        register.get_name(), this.get_name()))); 
     :       this.log.end_msg(); 
     :    end 
     : while (0);
00141:          return;
00142:       end
00143:    end
00144:    this.regs.push_back(register);
00145: endfunction: register_reg
00146: 
00147: function void vmm_ral_block::register_vreg(vmm_ral_vreg register);
00148:    if (this.Xis_lockedX()) begin
00149:       
     : do 
     :    if (this.log.start_msg(vmm_log::FAILURE_TYP, vmm_log::ERROR_SEV)) begin 
     :       void'(this.log.text("Cannot add virtual register to locked block model")); 
     :       this.log.end_msg(); 
     :    end 
     : while (0);
00150:       return;
00151:    end
00152: 
00153:    // Check if this register has already been registered with this block
00154:    foreach (this.vregs[i]) begin
00155:       if (this.vregs[i] == register) begin
00157: 
     : do 
     :    if (this.log.start_msg(vmm_log::FAILURE_TYP, vmm_log::ERROR_SEV)) begin 
     :       void'(this.log.text($psprintf("Virtual register \"%s\" has already been registered with block \"%s\".\n",
     :                                        register.get_name(), this.get_name()))); 
     :       this.log.end_msg(); 
     :    end 
     : while (0);
00158:          return;
00159:       end
00160:    end
00161:    this.vregs.push_back(register);
00162: endfunction: register_vreg
00163: 
00164: function void vmm_ral_block::register_mem(vmm_ral_mem memory);
00165:    if (this.Xis_lockedX()) begin
00166:       
     : do 
     :    if (this.log.start_msg(vmm_log::FAILURE_TYP, vmm_log::ERROR_SEV)) begin 
     :       void'(this.log.text("Cannot add memory to locked block model")); 
     :       this.log.end_msg(); 
     :    end 
     : while (0);
00167:       return;
00168:    end
00169: 
00170:    // Check if this memory has already been registered with this block
00171:    foreach (this.mems[i]) begin
00172:       if (this.mems[i] == memory) begin
00174: 
     : do 
     :    if (this.log.start_msg(vmm_log::FAILURE_TYP, vmm_log::ERROR_SEV)) begin 
     :       void'(this.log.text($psprintf("Memory \"%s\" has already been registered with block \"%s\".\n",
     :                                        memory.get_name(), this.get_name()))); 
     :       this.log.end_msg(); 
     :    end 
     : while (0);
00175:          return;
00176:       end
00177:    end
00178:    this.mems.push_back(memory);
00179: endfunction: register_mem
00180: 
00181: 
00182: function void vmm_ral_block::Xregister_ral_accessX(vmm_ral_access access);
00183:    // There can only be one RAL Access on a RAL model
00184:    if (this.ral_access != null && this.ral_access != access) begin
00185:       
     : do 
     :    if (this.log.start_msg(vmm_log::FAILURE_TYP, vmm_log::FATAL_SEV)) begin 
     :       void'(this.log.text($psprintf("Block %s is already used by another RAL access instance", this.get_fullname()))); 
     :       this.log.end_msg(); 
     :    end 
     : while (0);
00186:    end
00187:    this.ral_access = access;
00188: 
00189:    // Register all sub-elements
00190:    begin
00191:       vmm_ral_reg  regs[];
00192:       vmm_ral_mem  mems[];
00193: 
00194:       this.get_registers(regs);
00195:       foreach (regs[i]) begin
00196:          regs[i].Xregister_ral_accessX(access);
00197:       end
00198: 
00199:       this.get_memories(mems);
00200:       foreach (mems[i]) begin
00201:          mems[i].Xregister_ral_accessX(access);
00202:       end
00203:    end
00204: endfunction: Xregister_ral_accessX
00205: 
00206: 
00207: function string vmm_ral_block::psdisplay(string prefix,
00208:                                          string domain);
00209:    string       domains[];
00210:    vmm_ral_reg  regs[];
00211:    vmm_ral_vreg vregs[];
00212:    vmm_ral_mem  mems[];
00213:    bit          single_domain;
00214:    vmm_ral::endianness_e endian;
00215: 
00216:    single_domain = 1;
00217:    if (domain == "") begin
00218:       this.get_domains(domains);
00219:       if (domains.size() > 1) single_domain = 0;
00220:    end
00221:    if (single_domain) begin
00222:       $sformat(psdisplay, "%sBlock %s", prefix, this.get_fullname());
00223:       if (domain != "") $sformat(psdisplay, "%s.%s", psdisplay, domain);
00224:       endian = this.get_endian(domain);
00225:       $sformat(psdisplay, "%s -- %0d bytes (%s)", psdisplay,
00226:                this.get_n_bytes(domain), endian.name());
00227:       this.get_registers(regs, domain);
00228:       foreach (regs[j]) begin
00229:          $sformat(psdisplay, "%s\n%s", psdisplay,
00230:                   regs[j].psdisplay({prefix, "   "}, domain));
00231:       end
00232:       this.get_virtual_registers(vregs, domain);
00233:       foreach (vregs[j]) begin
00234:          $sformat(psdisplay, "%s\n%s", psdisplay,
00235:                   vregs[j].psdisplay({prefix, "   "}, domain));
00236:       end
00237:       this.get_memories(mems, domain);
00238:       foreach (mems[j]) begin
00239:          $sformat(psdisplay, "%s\n%s", psdisplay,
00240:                   mems[j].psdisplay({prefix, "   "}, domain));
00241:       end
00242:    end
00243:    else begin
00244:       $sformat(psdisplay, "%sBlock %s", prefix, this.get_fullname());
00245:       foreach (domains[i]) begin
00246:          endian = this.get_endian(domains[i]);
00247:          $sformat(psdisplay, "%s\n%s   Domain \"%s\" -- %0d bytes (%s)",
00248:                   psdisplay, prefix, domains[i],
00249:                   this.get_n_bytes(domains[i]), endian.name());
00250:          this.get_registers(regs, domains[i]);
00251:          foreach (regs[j]) begin
00252:             $sformat(psdisplay, "%s\n%s", psdisplay,
00253:                      regs[j].psdisplay({prefix, "      "},
00254:                                        domains[i]));
00255:          end
00256:          this.get_virtual_registers(vregs, domains[i]);
00257:          foreach (vregs[j]) begin
00258:             $sformat(psdisplay, "%s\n%s", psdisplay,
00259:                      vregs[j].psdisplay({prefix, "      "},
00260:                                        domains[i]));
00261:          end
00262:          this.get_memories(mems, domains[i]);
00263:          foreach (mems[j]) begin
00264:             $sformat(psdisplay, "%s\n%s", psdisplay,
00265:                      mems[j].psdisplay({prefix, "      "}, domains[i]));
00266:          end
00267:       end
00268:    end
00269: endfunction: psdisplay
00270: 
00271: 
00272: function void vmm_ral_block::get_fields(ref vmm_ral_field fields[],
00273:                                         input string      domain);
00274:    int n;
00275:    vmm_ral_reg r[];
00276:    vmm_ral_field f[];
00277: 
00278:    fields = new [0];
00279:    this.get_registers(r, domain);
00280:    foreach (r[i]) begin
00281:       r[i].get_fields(f);
00282:       n = fields.size();
00283:       fields = new [n + f.size()] (fields);
00284: 
00285:       foreach (f[j]) begin
00286:          fields[n++] = f[j];
00287:       end
00288:    end
00289: endfunction: get_fields
00290: 
00291: function void vmm_ral_block::get_virtual_fields(ref vmm_ral_vfield fields[],
00292:                                                 input string      domain);
00293:    int n;
00294:    vmm_ral_vreg r[];
00295:    vmm_ral_vfield f[];
00296: 
00297:    fields = new [0];
00298:    this.get_virtual_registers(r, domain);
00299:    foreach (r[i]) begin
00300:       r[i].get_fields(f);
00301:       n = fields.size();
00302:       fields = new [n + f.size()] (fields);
00303: 
00304:       foreach (f[j]) begin
00305:          fields[n++] = f[j];
00306:       end
00307:    end
00308: endfunction: get_virtual_fields
00309: 
00310: function vmm_ral_field vmm_ral_block::get_field_by_name(string name);
00311:    // Search the registers to find the first field of the specified name
00312:    foreach (this.regs[i]) begin
00313:       vmm_ral_field fields[];
00314:       this.regs[i].get_fields(fields);
00315:       foreach (fields[j]) begin
00316:          if (fields[j].get_name() == name) begin
00317:             return fields[j];
00318:          end
00319:       end
00320:    end
00322: 
     : 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 block \"%s\".",
     :                                     name, this.get_fullname()))); 
     :       this.log.end_msg(); 
     :    end 
     : while(0);
00323:    get_field_by_name = null;
00324: endfunction: get_field_by_name
00325: 
00326: function vmm_ral_vfield vmm_ral_block::get_virtual_field_by_name(string name);
00327:    // Search the registers to find the first field of the specified name
00328:    foreach (this.vregs[i]) begin
00329:       vmm_ral_vfield fields[];
00330:       this.vregs[i].get_fields(fields);
00331:       foreach (fields[j]) begin
00332:          if (fields[j].get_name() == name) begin
00333:             return fields[j];
00334:          end
00335:       end
00336:    end
00338: 
     : 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 block \"%s\".",
     :                                     name, this.get_fullname()))); 
     :       this.log.end_msg(); 
     :    end 
     : while(0);
00339:    get_virtual_field_by_name = null;
00340: endfunction: get_virtual_field_by_name
00341: 
00342: 
00343: function void vmm_ral_block::get_registers(ref vmm_ral_reg regs[],
00344:                                            input string    domain);
00345:    if (domain == "") begin
00346:       regs = new [this.regs.size()];
00347:       foreach(this.regs[i]) begin
00348:          regs[i] = this.regs[i];
00349:       end
00350:    end
00351:    else begin
00352:       int n = 0;
00353:       regs = new [this.regs.size()];
00354:       foreach(this.regs[i]) begin
00355:          // Is the register in the specified domain?
00356:          string domains[];
00357:          this.regs[i].get_domains(domains);
00358:          foreach(domains[j]) begin
00359:             if (domains[j] == domain) begin
00360:                regs[n++] = this.regs[i];
00361:                break;
00362:             end
00363:          end
00364:       end
00365:       regs = new [n] (regs);
00366:    end
00367: endfunction: get_registers
00368: 
00369: function void vmm_ral_block::get_virtual_registers(ref vmm_ral_vreg vregs[],
00370:                                                    input string    domain);
00371:    if (domain == "") begin
00372:       vregs = new [this.vregs.size()];
00373:       foreach(this.vregs[i]) begin
00374:          vregs[i] = this.vregs[i];
00375:       end
00376:    end
00377:    else begin
00378:       int n = 0;
00379:       vregs = new [this.vregs.size()];
00380:       foreach(this.vregs[i]) begin
00381:          // Is the register in the specified domain?
00382:          string domains[];
00383:          this.vregs[i].get_domains(domains);
00384:          foreach(domains[j]) begin
00385:             if (domains[j] == domain) begin
00386:                vregs[n++] = this.vregs[i];
00387:                break;
00388:             end
00389:          end
00390:       end
00391:       vregs = new [n] (vregs);
00392:    end
00393: endfunction: get_virtual_registers
00394: 
00395: function vmm_ral_reg vmm_ral_block::get_reg_by_name(string name);
00396:    foreach (this.regs[i]) begin
00397:       if (this.regs[i].get_name() == name) begin
00398:          return this.regs[i];
00399:       end
00400:    end
00402: 
     : 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 block \"%s\".",
     :                                     name, this.get_fullname()))); 
     :       this.log.end_msg(); 
     :    end 
     : while(0);
00403:    get_reg_by_name = null;
00404: endfunction: get_reg_by_name
00405: 
00406: function vmm_ral_vreg vmm_ral_block::get_vreg_by_name(string name);
00407:    foreach (this.vregs[i]) begin
00408:       if (this.vregs[i].get_name() == name) begin
00409:          return this.vregs[i];
00410:       end
00411:    end
00413: 
     : 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 block \"%s\".",
     :                                     name, this.get_fullname()))); 
     :       this.log.end_msg(); 
     :    end 
     : while(0);
00414:    get_vreg_by_name = null;
00415: endfunction: get_vreg_by_name
00416: 
00417: function vmm_ral_reg vmm_ral_block::get_reg_by_offset(bit [64-1:0] offset,
00418:                                                       string                        domain);
00419:    foreach (this.regs[i]) begin
00420:       if (this.regs[i].get_offset_in_block(domain) == offset) begin
00421:          return this.regs[i];
00422:       end
00423:    end
00427: 
     : do 
     :    if (this.log.start_msg(vmm_log::FAILURE_TYP, vmm_log::WARNING_SEV)) begin 
     :       void'(this.log.text($psprintf("Unable to locate register at offset 0x%h %0sin block \"%s\".",
     :                                     offset, ((domain == "") ? "" : $psprintf("in domain \"%s\" ",
     :                                                                              domain)),
     :                                     this.get_fullname()))); 
     :       this.log.end_msg(); 
     :    end 
     : while(0);
00428:    get_reg_by_offset = null;
00429: endfunction: get_reg_by_offset
00430: 
00431: 
00432: function void vmm_ral_block::get_memories(ref vmm_ral_mem mems[],
00433:                                           input string    domain);
00434:    if (domain == "") begin
00435:       mems = new [this.mems.size()];
00436:       foreach(this.mems[i]) begin
00437:          mems[i] = this.mems[i];
00438:       end
00439:    end
00440:    else begin
00441:       int n = 0;
00442:       mems = new [this.mems.size()];
00443:       foreach(this.mems[i]) begin
00444:          // Is the memory in the specified domain?
00445:          string domains[];
00446:          this.mems[i].get_domains(domains);
00447:          foreach(domains[j]) begin
00448:             if (domains[j] == domain) begin
00449:                mems[n++] = this.mems[i];
00450:                break;
00451:             end
00452:          end
00453:       end
00454:       mems = new [n] (mems);
00455:    end
00456: endfunction: get_memories
00457: 
00458: 
00459: function vmm_ral_mem vmm_ral_block::get_mem_by_name(string name);
00460:    foreach (this.mems[i]) begin
00461:       if (this.mems[i].get_name() == name) begin
00462:          return this.mems[i];
00463:       end
00464:    end
00466: 
     : 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 block \"%s\".",
     :                                     name, this.get_fullname()))); 
     :       this.log.end_msg(); 
     :    end 
     : while(0);
00467:    get_mem_by_name = null;
00468: endfunction: get_mem_by_name
00469: 
00470: 
00471: function vmm_ral_mem vmm_ral_block::get_mem_by_offset(bit [64-1:0] offset,
00472:                                                       string                        domain);
00473:    //get_mem_by_offset = this.mems.first() with index: (this.mems[index].offset_in_block == offset);
00474: endfunction: get_mem_by_offset
00475: 
00476: 
00477: function void vmm_ral_block::get_constraints(ref string names[]);
00478: endfunction: get_constraints
00479: 
00480: 
00481: function bit vmm_ral_block::set_cover(bit is_on);
00482:    set_cover = super.set_cover(is_on);
00483: 
00484:    if (is_on && !super.is_cover_on()) return set_cover;
00485: 
00486:    foreach (this.regs[i]) begin
00487:       this.regs[i].set_cover(is_on);
00488:    end
00489:    foreach (this.mems[i]) begin
00490:       this.mems[i].set_cover(is_on);
00491:    end
00492: endfunction: set_cover
00493: 
00494: 
00495: function void vmm_ral_block::reset(string           domain,
00496:                                    vmm_ral::reset_e kind);
00497:    vmm_ral_reg regs[];
00498:    vmm_ral_mem mems[];
00499: 
00500:    this.get_registers(regs, domain);
00501:    foreach (regs[i]) begin
00502:       regs[i].reset(kind);
00503:    end
00504: 
00505:    this.get_memories(mems, domain);
00506:    foreach (mems[i]) begin
00507:       vmm_ral_vreg vregs[];
00508:       mems[i].get_virtual_registers(vregs);
00509:       foreach (vregs[j]) begin
00510:          vregs[j].reset(kind);
00511:       end
00512:    end
00513: endfunction: reset
00514: 
00515: 
00516: function bit vmm_ral_block::needs_update();
00517:    needs_update = 0;
00518:    foreach (this.regs[i]) begin
00519:       if (this.regs[i].needs_update()) begin
00520:          return 1;
00521:       end
00522:    end
00523: endfunction: needs_update
00524: 
00525: 
00526: task vmm_ral_block::update(output vmm_rw::status_e status,
00527:                            input  vmm_ral::path_e  path);
00528:    string domains[];
00529:    bit    updated;
00530: 
00531:    status = vmm_rw::IS_OK;
00532:    foreach (this.regs[i]) begin
00533:       if (!this.regs[i].needs_update()) continue;
00534: 
00535:       if (path == vmm_ral::BACKDOOR) begin
00536:          this.regs[i].update(status, path);
00537:          if (status != vmm_rw::IS_OK) return;
00538:          continue;
00539:       end
00540: 
00541:       // Find the first writeable domain to
00542:       // perform the update through
00543:       this.regs[i].get_domains(domains);
00544:       updated = 0;
00545:       foreach (domains[j]) begin
00546:          if (this.regs[i].get_rights(domains[j]) != vmm_ral::RO) begin
00547:             this.regs[i].update(status, path, domains[j]);
00548:             if (status == vmm_rw::IS_OK) begin
00549:                updated = 1;
00550:                break;
00551:             end
00552:          end
00553:       end
00554:       if (!updated) begin
00556: 
     : do 
     :    if (this.log.start_msg(vmm_log::FAILURE_TYP, vmm_log::ERROR_SEV)) begin 
     :       void'(this.log.text($psprintf("Register \"%s\" could not be updated",
     :                                         regs[i].get_fullname()))); 
     :       this.log.end_msg(); 
     :    end 
     : while (0);
00557:          if (status == vmm_rw::IS_OK) status = vmm_rw::ERROR;
00558:          return;
00559:       end
00560:    end
00561: endtask: update
00562: 
00563: 
00564: task vmm_ral_block::mirror(output vmm_rw::status_e status,
00565:                            input  vmm_ral::check_e check,
00566:                            input  vmm_ral::path_e  path);
00567:    string domains[];
00568:    bit mirrored;
00569: 
00570:    status = vmm_rw::IS_OK;
00571:    foreach (this.regs[i]) begin
00572: 
00573:       if (path == vmm_ral::BACKDOOR) begin
00574:          this.regs[i].mirror(status, check, path);
00575:          if (status != vmm_rw::IS_OK) return;
00576:          continue;
00577:       end
00578: 
00579:       // Find the first readable domain to
00580:       // perform the update through
00581:       this.regs[i].get_domains(domains);
00582:       mirrored = 0;
00583:       foreach (domains[j]) begin
00584:          if (this.regs[i].get_rights(domains[j]) != vmm_ral::WO) begin
00585:             this.regs[i].mirror(status, check, path, domains[0]);
00586:             if (status == vmm_rw::IS_OK) begin
00587:                mirrored = 1;
00588:                break;
00589:             end
00590:          end
00591:       end
00592:       if (!mirrored) begin
00594: 
     : do 
     :    if (this.log.start_msg(vmm_log::FAILURE_TYP, vmm_log::ERROR_SEV)) begin 
     :       void'(this.log.text($psprintf("Register \"%s\" could not be mirrored",
     :                                         regs[i].get_fullname()))); 
     :       this.log.end_msg(); 
     :    end 
     : while (0);
00595:          if (status == vmm_rw::IS_OK) status = vmm_rw::ERROR;
00596:          return;
00597:       end
00598:    end
00599: endtask: mirror
00600: 
00601: 
00602: task vmm_ral_block::readmemh(string filename);
00603: endtask: readmemh
00604: 
00605: 
00606: task vmm_ral_block::writememh(string filename);
00607: endtask: writememh
00608: 
00609: 
00610: function void vmm_ral_block::XsampleX(bit [64-1:0] addr,
00611:                                       int                           domain);
00612:    this.sample(addr, domain);
00613: endfunction
00614: 
00615: 
00616: function void vmm_ral_block::sample(bit [64-1:0] addr,
00617:                                     int                           domain);
00618:    // Nothing to do in this base class
00619: endfunction
00620: 
00621: 
00622: function int unsigned vmm_ral_block::get_block_ID(); 
00623:    get_block_ID =  this.__vmm_block_id;
00624: endfunction
00625: 
00626: function vmm_ral_block vmm_ral_block::get_block_by_ID(int unsigned id); 
00627:    if (__vmm_all_blocks.exists(id)) get_block_by_ID = __vmm_all_blocks[id];
00628:    else get_block_by_ID = null;
00629: endfunction