VMM - (expanded) std_lib/vmm_env.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.

std_lib/vmm_env.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: function vmm_env::new(string name
00024:                       );
00025:    int initial_seed;
00026: 
00030: 
00031:    this.log    = new(name, "");
00032: 
00033:    if ($value$plusargs("ntb_random_seed=%d", initial_seed)) begin
00034:       
     : do 
     :    if (this.log.start_msg(vmm_log::NOTE_TYP)) begin 
     :       void'(this.log.text($psprintf("Initial random seed is %0d", initial_seed))); 
     :       this.log.end_msg(); 
     :    end 
     : while (0);
00035:    end
00036: 
00037:    this.step = 0;
00038: 
00039:    this.notify = new(this.log);
00040: 
00041:    this.notify.configure(GEN_CFG,      vmm_notify::ON_OFF);
00042:    this.notify.configure(BUILD,        vmm_notify::ON_OFF);
00043:    this.notify.configure(RESET_DUT,    vmm_notify::ON_OFF);
00044:    this.notify.configure(CFG_DUT,      vmm_notify::ON_OFF);
00045:    this.notify.configure(START,        vmm_notify::ON_OFF);
00046:    this.notify.configure(RESTART,      vmm_notify::ON_OFF);
00047:    this.notify.configure(WAIT_FOR_END, vmm_notify::ON_OFF);
00048:    this.notify.configure(STOP,         vmm_notify::ON_OFF);
00049:    this.notify.configure(CLEANUP,      vmm_notify::ON_OFF);
00050:    this.notify.configure(REPORT,       vmm_notify::ON_OFF);
00051: 
00052:    this.reset_rng_state = 0;
00053:    this.thread_rng_state_after_new = get_randstate();
00054: 
00055:    this.soft_restart = 0;
00056:    this.soft_restartable = 0;
00057: 
00058:    this.end_vote = new(name, "End-of-test Consensus");
00059: endfunction: new
00060: 
00061: 
00062: task vmm_env::run();
00063:    if (this.soft_restart || this.step == 0) this.pre_test();
00064: 
00065:    if (this.step < CLEANUP) this.cleanup();
00066:    if (this.step != CLEANUP)
00067:       
     : do 
     :    if (this.log.start_msg(vmm_log::FAILURE_TYP, vmm_log::FATAL_SEV)) begin 
     :       void'(this.log.text("Extension of vmm_env::cleanup() did not call super.cleanup().")); 
     :       this.log.end_msg(); 
     :    end 
     : while (0);
00068:    this.report();
00069: endtask: run
00070: 
00071: 
00072: task vmm_env::pre_test();
00073:    if (this.step == 0) begin
00074:       this.cfg_dut();
00075:       if (this.step != CFG_DUT) 
00076:          
     : do 
     :    if (this.log.start_msg(vmm_log::FAILURE_TYP, vmm_log::FATAL_SEV)) begin 
     :       void'(this.log.text("Extension of vmm_env::cfg_dut() did not call super.cfg_dut().")); 
     :       this.log.end_msg(); 
     :    end 
     : while (0);
00077: 
00078:       // Save the seed for the main program thread
00079:       this.thread_rng_state_after_pre_test = get_randstate();
00080:       // Save the RNG state for the entire environment as built
00081:       this.save_rng_state();
00082:    
00083:       // Make sure the saved seed are the one that are going
00084:       // to be used when starting the environment, even if
00085:       // some components are manually replaced in the test
00086:       this.reset_rng_state = 1;
00087:    end
00088:    else if (this.step == RESTARTED) begin
00089:       this.step = CFG_DUT;
00090:    end
00091:    else if (this.step <= CFG_DUT) begin
00092:       
     : do 
     :    if (this.log.start_msg(vmm_log::FAILURE_TYP, vmm_log::FATAL_SEV)) begin 
     :       void'(this.log.text("vmm_env::pre_test() was not the first simulation step in simulation flow.")); 
     :       this.log.end_msg(); 
     :    end 
     : while (0);
00093:    end
00094:    else if (this.step > CFG_DUT) begin
00095:       
     : do 
     :    if (this.log.start_msg(vmm_log::FAILURE_TYP, vmm_log::FATAL_SEV)) begin 
     :       void'(this.log.text("vmm_env::pre_test() called too late in simulation flow.")); 
     :       this.log.end_msg(); 
     :    end 
     : while (0);
00096:    end
00097: 
00098:    set_randstate(this.thread_rng_state_after_pre_test);
00099:    this.soft_restartable = 1;
00100:    this.soft_restart = 0;
00101: endtask: pre_test
00102: 
00103: 
00104: function void vmm_env::gen_cfg();
00105:    if (this.soft_restart) begin
00106:      
     : do 
     :    if (this.log.start_msg(vmm_log::FAILURE_TYP, vmm_log::FATAL_SEV)) begin 
     :       void'(this.log.text("Cannot run a tests that invokes vmm_env::gen_cfg after a soft restart...")); 
     :       this.log.end_msg(); 
     :    end 
     : while (0);
00107:    end
00108: 
00109:    this.step = GEN_CFG;
00110:    this.notify.indicate(GEN_CFG);
00111:    if (this.log.start_msg(vmm_log::INTERNAL_TYP , vmm_log::TRACE_SEV )) begin
00112:       void'(this.log.text("Generating test configuration..."));
00113:       this.log.end_msg();
00114:    end
00115: endfunction: gen_cfg
00116: 
00117: 
00118: function void vmm_env::build();
00119:    if (this.soft_restart) begin
00120:       
     : do 
     :    if (this.log.start_msg(vmm_log::FAILURE_TYP, vmm_log::FATAL_SEV)) begin 
     :       void'(this.log.text("Cannot run a tests that invokes vmm_env::build after a soft restart...")); 
     :       this.log.end_msg(); 
     :    end 
     : while (0);
00121:    end
00122: 
00123:    if (this.step < GEN_CFG) this.gen_cfg();
00124:    if (this.step != GEN_CFG) begin
00125:       
     : do 
     :    if (this.log.start_msg(vmm_log::FAILURE_TYP, vmm_log::FATAL_SEV)) begin 
     :       void'(this.log.text("Extension of vmm_env::gen_cfg() did not call super.gen_cfg().")); 
     :       this.log.end_msg(); 
     :    end 
     : while (0);
00126:    end
00127: 
00128:    this.step = BUILD;
00129:    this.notify.indicate(BUILD);
00130:    if (this.log.start_msg(vmm_log::INTERNAL_TYP , vmm_log::TRACE_SEV )) begin
00131:       void'(this.log.text("Building verification environment..."));
00132:       this.log.end_msg();
00133:    end
00134: endfunction: build
00135: 
00136: 
00137: task vmm_env::reset_dut();
00138:    if (this.soft_restart) begin
00139:       
     : do 
     :    if (this.log.start_msg(vmm_log::FAILURE_TYP, vmm_log::FATAL_SEV)) begin 
     :       void'(this.log.text("Cannot run a tests that invokes vmm_env::cfg_dut_t after a soft restart...")); 
     :       this.log.end_msg(); 
     :    end 
     : while (0);
00140:    end
00141: 
00142:    if (this.step < BUILD) this.build();
00143:    if (this.step != BUILD) begin
00144:       
     : do 
     :    if (this.log.start_msg(vmm_log::FAILURE_TYP, vmm_log::FATAL_SEV)) begin 
     :       void'(this.log.text("Extension of vmm_env::build() did not call super.build().")); 
     :       this.log.end_msg(); 
     :    end 
     : while (0);
00145:    end
00146: 
00147:    this.step = RESET_DUT;
00148:    this.notify.indicate(RESET_DUT);
00149:    if (this.log.start_msg(vmm_log::INTERNAL_TYP , vmm_log::TRACE_SEV )) begin
00150:       void'(this.log.text("Reseting DUT..."));
00151:       this.log.end_msg();
00152:    end
00153: endtask: reset_dut
00154: 
00155: 
00156: task vmm_env::cfg_dut();
00157:    if (this.soft_restart) begin
00158:       
     : do 
     :    if (this.log.start_msg(vmm_log::FAILURE_TYP, vmm_log::FATAL_SEV)) begin 
     :       void'(this.log.text("Cannot run a tests that invokes vmm_env::cfg_dut_t after a soft restart...")); 
     :       this.log.end_msg(); 
     :    end 
     : while (0);
00159:    end
00160: 
00161:    if (this.step < RESET_DUT) this.reset_dut();
00162:    if (this.step != RESET_DUT) begin
00163:       
     : do 
     :    if (this.log.start_msg(vmm_log::FAILURE_TYP, vmm_log::FATAL_SEV)) begin 
     :       void'(this.log.text("Extension of vmm_env::reset_dut() did not call super.reset_dut().")); 
     :       this.log.end_msg(); 
     :    end 
     : while (0);
00164:    end
00165: 
00166:    this.step = CFG_DUT;
00167:    this.notify.indicate(CFG_DUT);
00168:    if (this.log.start_msg(vmm_log::INTERNAL_TYP , vmm_log::TRACE_SEV )) begin
00169:       void'(this.log.text("Configuring..."));
00170:       this.log.end_msg();
00171:    end
00172: endtask: cfg_dut
00173: 
00174: 
00175: task vmm_env::start();
00176:    if (this.step < CFG_DUT) this.cfg_dut();
00177:    if (this.step != CFG_DUT) begin
00178:       
     : do 
     :    if (this.log.start_msg(vmm_log::FAILURE_TYP, vmm_log::FATAL_SEV)) begin 
     :       void'(this.log.text("Extension of vmm_env::cfg_dut() did not call super.cfg_dut().")); 
     :       this.log.end_msg(); 
     :    end 
     : while (0);
00179:    end
00180: 
00181:    this.step = START;
00182:    this.notify.indicate(START);
00183:    if (this.log.start_msg(vmm_log::INTERNAL_TYP , vmm_log::TRACE_SEV )) begin
00184:       void'(this.log.text("Starting verification environment..."));
00185:       this.log.end_msg();
00186:    end
00187: 
00188:    if (this.reset_rng_state) begin
00189:       this.restore_rng_state();
00190:       this.reset_rng_state = 0;
00191:    end
00192:    else this.save_rng_state();
00193: endtask: start
00194: 
00195: 
00196: task vmm_env::wait_for_end();
00197:    if (this.step < START) this.start();
00198:    if (this.step != START) begin
00199:       
     : do 
     :    if (this.log.start_msg(vmm_log::FAILURE_TYP, vmm_log::FATAL_SEV)) begin 
     :       void'(this.log.text("Extension of vmm_env::start() did not call super.start().")); 
     :       this.log.end_msg(); 
     :    end 
     : while (0);
00200:    end
00201: 
00202:    this.step = WAIT_FOR_END;
00203:    this.notify.indicate(WAIT_FOR_END);
00204:    if (this.log.start_msg(vmm_log::INTERNAL_TYP , vmm_log::TRACE_SEV )) begin
00205:       void'(this.log.text("Waiting for end of test..."));
00206:       this.log.end_msg();
00207:    end
00208: endtask: wait_for_end
00209: 
00210: 
00211: task vmm_env::stop();
00212:    if (this.step < WAIT_FOR_END) this.wait_for_end();
00213:    if (this.step != WAIT_FOR_END) begin
00214:       
     : do 
     :    if (this.log.start_msg(vmm_log::FAILURE_TYP, vmm_log::FATAL_SEV)) begin 
     :       void'(this.log.text("Extension of vmm_env::wait_for_end() did not call super.wait_for_end().")); 
     :       this.log.end_msg(); 
     :    end 
     : while (0);
00215:    end
00216: 
00217:    this.step = STOP;
00218:    this.notify.indicate(STOP);
00219:    if (this.log.start_msg(vmm_log::INTERNAL_TYP , vmm_log::TRACE_SEV )) begin
00220:       void'(this.log.text("Stopping verification environment..."));
00221:       this.log.end_msg();
00222:    end
00223: endtask: stop
00224: 
00225: 
00226: task vmm_env::cleanup();
00227:    if (this.step < STOP) this.stop();
00228:    if (this.step != STOP) begin
00229:       
     : do 
     :    if (this.log.start_msg(vmm_log::FAILURE_TYP, vmm_log::FATAL_SEV)) begin 
     :       void'(this.log.text("Extension of vmm_env::stop() did not call super.stop().")); 
     :       this.log.end_msg(); 
     :    end 
     : while (0);
00230:    end
00231: 
00232:    this.step = CLEANUP;
00233:    this.notify.indicate(CLEANUP);
00234:    if (this.log.start_msg(vmm_log::INTERNAL_TYP , vmm_log::TRACE_SEV )) begin
00235:       void'(this.log.text("Cleaning up..."));
00236:       this.log.end_msg();
00237:    end
00238: endtask: cleanup
00239: 
00240: 
00241: task vmm_env::restart(bit reconfig);
00242:    if (!reconfig && !this.soft_restartable) begin
00243:       
     : do 
     :    if (this.log.start_msg(vmm_log::FAILURE_TYP, vmm_log::FATAL_SEV)) begin 
     :       void'(this.log.text("Cannot soft-restart after test that did not call vmm_env::pre_test().")); 
     :       this.log.end_msg(); 
     :    end 
     : while (0);
00244:    end
00245: 
00246:    if (this.step < CLEANUP) this.cleanup();
00247:    if (this.step != CLEANUP) begin
00248:       
     : do 
     :    if (this.log.start_msg(vmm_log::FAILURE_TYP, vmm_log::FATAL_SEV)) begin 
     :       void'(this.log.text("Extension of vmm_env::cleanup() did not call super.cleanup().")); 
     :       this.log.end_msg(); 
     :    end 
     : while (0);
00249:    end
00250: 
00251:    this.notify.indicate(RESTART);
00252:    if (this.log.start_msg(vmm_log::INTERNAL_TYP , vmm_log::TRACE_SEV )) begin
00253:       void'(this.log.text("Restarting..."));
00254:       this.log.end_msg();
00255:    end
00256: 
00257:    this.notify.reset(START);
00258:    this.notify.reset(RESTART);
00259:    this.notify.reset(WAIT_FOR_END);
00260:    this.notify.reset(STOP);
00261:    this.notify.reset(CLEANUP);
00262:    this.notify.reset(REPORT);
00263: 
00264:    if (reconfig) begin
00265:       this.step = 0;
00266:       this.notify.reset(GEN_CFG);
00267:       this.notify.reset(BUILD);
00268:       this.notify.reset(RESET_DUT);
00269:       this.notify.reset(CFG_DUT);
00270:       this.soft_restart = 0;
00271:    end
00272:    else begin
00273:       this.step = RESTARTED;
00274:       this.reset_rng_state = 1;
00275:       this.soft_restart = 1;
00276:    end
00277: 
00278:    set_randstate(this.thread_rng_state_after_new);
00279: endtask: restart
00280: 
00281: 
00282: task vmm_env::report();
00283:    this.log.report("/./", "/./");
00284:    this.notify.indicate(REPORT);
00285: endtask: report
00286: 
00287: 
00288: function void vmm_env::save_rng_state();
00289:    if (this.log.start_msg(vmm_log::INTERNAL_TYP , vmm_log::TRACE_SEV )) begin
00290:       void'(this.log.text("Saving RNG state information..."));
00291:       this.log.end_msg();
00292:    end
00293:    this.thread_rng_state_before_start = get_randstate();
00294: endfunction: save_rng_state
00295: 
00296: 
00297: function void vmm_env::restore_rng_state();
00298:    if (this.log.start_msg(vmm_log::INTERNAL_TYP , vmm_log::TRACE_SEV )) begin
00299:       void'(this.log.text("Restoring RNG state information..."));
00300:       this.log.end_msg();
00301:    end
00302:    set_randstate(this.thread_rng_state_before_start);
00303: endfunction: restore_rng_state