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 `include "std_lib/vmm_data_macros_utils.sv" 00024 00025 00026 `define vmm_data_member_begin(_class) \ 00027 \ 00028 protected static _class __vmm_rhs; \ 00029 \ 00030 function void do_all(vmm_data::do_what_e do_what, \ 00031 ref logic [7:0] pack[], \ 00032 const ref logic [7:0] unpack[]); \ 00033 super.__vmm_rhs = this.__vmm_rhs; \ 00034 this.__vmm_status = 1; \ 00035 super.do_all(do_what, pack, unpack); \ 00036 if (super.__vmm_status == 0) return; 00037 00038 `define vmm_data_member_scalar(_name, _do) \ 00039 \ 00040 case (do_what & _do) \ 00041 DO_PRINT: begin \ 00042 $sformat(this.__vmm_image, "%s\n%s _name='h%0h", this.__vmm_image, this.__vmm_prefix, this._name); \ 00043 end \ 00044 DO_COPY: begin \ 00045 __vmm_rhs._name = this._name; \ 00046 end \ 00047 DO_COMPARE: begin \ 00048 if (__vmm_rhs._name !== this._name) begin \ 00049 $sformat(this.__vmm_image, "this._name ('h%0h) !== to._name ('h%0h)", \ 00050 this._name, __vmm_rhs._name); \ 00051 this.__vmm_status = 0; \ 00052 return; \ 00053 end \ 00054 end \ 00055 DO_PACK: begin \ 00056 int start; \ 00057 int count; \ 00058 start = this.__vmm_offset; \ 00059 `vmm_data_member_scalar_count(this._name,count) \ 00060 this.__vmm_maxbits = this._name; \ 00061 `vmm_data_member_scalar_pack(pack,this.__vmm_maxbits,count,this.__vmm_offset) \ 00062 `vmm_data_member_update_offset(this.__vmm_offset,count) \ 00063 this.__vmm_len = this.__vmm_offset; \ 00064 end \ 00065 DO_UNPACK: begin \ 00066 int count; \ 00067 int start; \ 00068 start = this.__vmm_offset; \ 00069 `vmm_data_member_scalar_count(this._name,count) \ 00070 `vmm_data_member_scalar_unpack(unpack,this.__vmm_maxbits,count,this.__vmm_offset) \ 00071 this._name = this.__vmm_maxbits; \ 00072 `vmm_data_member_update_offset(this.__vmm_offset,count) \ 00073 end \ 00074 endcase 00075 00076 `define vmm_data_member_scalar_array(_name, _do) \ 00077 \ 00078 case (do_what & _do) \ 00079 DO_PRINT: begin \ 00080 int size =0; \ 00081 size = $size(this._name); \ 00082 $sformat(this.__vmm_image, "%s\n%s _name[%0d]=", this.__vmm_image, this.__vmm_prefix, size); \ 00083 for (int i = 0; i < size; i++) begin \ 00084 $sformat(this.__vmm_image, "%s 'h%0h", this.__vmm_image, this._name[i]); \ 00085 if (i == 2 && size > 5) begin \ 00086 this.__vmm_image = {this.__vmm_image, " ..."}; \ 00087 i = size - 3; \ 00088 end \ 00089 end \ 00090 end \ 00091 DO_COPY: begin \ 00092 __vmm_rhs._name = this._name; \ 00093 end \ 00094 DO_COMPARE: begin \ 00095 foreach (this._name[i]) begin \ 00096 if (__vmm_rhs._name[i] !== this._name[i]) begin \ 00097 $sformat(this.__vmm_image, "this._name[%0d] ('h%0h) !== to._name[%0d] ('h%0h)", \ 00098 i, this._name[i], i, __vmm_rhs._name[i]); \ 00099 this.__vmm_status = 0; \ 00100 return; \ 00101 end \ 00102 end \ 00103 end \ 00104 DO_PACK: begin \ 00105 int start; \ 00106 int count; \ 00107 bit [31:0] size=0; \ 00108 start = this.__vmm_offset; \ 00109 `vmm_data_member_update_offset(this.__vmm_offset,8) \ 00110 foreach (this._name[j]) begin \ 00111 if ( j == 0 ) \ 00112 `vmm_data_member_scalar_count(this._name[j],count) \ 00113 this.__vmm_maxbits = this._name[j]; \ 00114 `vmm_data_member_scalar_pack(pack,this.__vmm_maxbits,count,this.__vmm_offset) \ 00115 `vmm_data_member_update_offset(this.__vmm_offset,count) \ 00116 size++; \ 00117 end \ 00118 `vmm_data_member_scalar_packint(pack,size,start,0) \ 00119 `vmm_data_member_scalar_packint(pack,count,(start+4),0) \ 00120 this.__vmm_len = this.__vmm_offset; \ 00121 end \ 00122 DO_UNPACK: begin \ 00123 int start; \ 00124 int count; \ 00125 bit [31:0] size = 0; \ 00126 `vmm_data_member_scalar_unpackint(unpack,size,this.__vmm_offset,0) \ 00127 `vmm_data_member_update_offset(this.__vmm_offset,4) \ 00128 `vmm_data_member_scalar_unpackint(unpack,count,this.__vmm_offset,0) \ 00129 `vmm_data_member_update_offset(this.__vmm_offset,4) \ 00130 for (int j=0; j < size; j++) begin \ 00131 `vmm_data_member_scalar_unpack(unpack,this.__vmm_maxbits,count,this.__vmm_offset) \ 00132 this._name[j] = this.__vmm_maxbits; \ 00133 `vmm_data_member_update_offset(this.__vmm_offset,count) \ 00134 end \ 00135 end \ 00136 endcase 00137 00138 00139 `define vmm_data_member_scalar_da(_name, _do) \ 00140 \ 00141 case (do_what & _do) \ 00142 DO_PRINT: begin \ 00143 $sformat(this.__vmm_image, "%s\n%s _name[%0d]=", this.__vmm_image, this.__vmm_prefix, this._name.size()); \ 00144 for (int i = 0; i < this._name.size(); i++) begin \ 00145 $sformat(this.__vmm_image, "%s 'h%0h", this.__vmm_image, this._name[i]); \ 00146 if (i == 2 && this._name.size() > 5) begin \ 00147 this.__vmm_image = {this.__vmm_image, " ..."}; \ 00148 i = this._name.size() - 3; \ 00149 end \ 00150 end \ 00151 end \ 00152 DO_COPY: begin \ 00153 __vmm_rhs._name = new [this._name.size()]; \ 00154 foreach(this._name[i]) __vmm_rhs._name[i]=this._name[i]; \ 00155 end \ 00156 DO_COMPARE: begin \ 00157 if (__vmm_rhs._name.size() !== this._name.size()) begin \ 00158 $sformat(this.__vmm_image, "this._name.size() (%0d) !== to._name.size() (%0d)", \ 00159 this._name.size(), __vmm_rhs._name.size()); \ 00160 this.__vmm_status = 0; \ 00161 return; \ 00162 end \ 00163 foreach (this._name[i]) begin \ 00164 if (__vmm_rhs._name[i] !== this._name[i]) begin \ 00165 $sformat(this.__vmm_image, "this._name[%0d] ('h%0h) !== to._name[%0d] ('h%0h)", \ 00166 i, this._name[i], i, __vmm_rhs._name[i]); \ 00167 this.__vmm_status = 0; \ 00168 return; \ 00169 end \ 00170 end \ 00171 end \ 00172 DO_PACK: begin \ 00173 int start; \ 00174 int count; \ 00175 int index; \ 00176 bit [31:0] size=0; \ 00177 start = this.__vmm_offset; \ 00178 size = this._name.size(); \ 00179 foreach (this._name[j]) begin \ 00180 if ( j == 0) begin \ 00181 `vmm_data_member_scalar_count(this._name[j],count) \ 00182 `vmm_data_member_update_offset(this.__vmm_offset,8) \ 00183 end \ 00184 this.__vmm_maxbits = this._name[j]; \ 00185 `vmm_data_member_scalar_pack(pack,this.__vmm_maxbits,count,this.__vmm_offset) \ 00186 `vmm_data_member_update_offset(this.__vmm_offset,count) \ 00187 end \ 00188 this.__vmm_len = this.__vmm_offset; \ 00189 `vmm_data_member_scalar_packint(pack,size,start,0) \ 00190 `vmm_data_member_scalar_packint(pack,count,(start+4),0) \ 00191 end \ 00192 DO_UNPACK: begin \ 00193 int start; \ 00194 int count; \ 00195 int index; \ 00196 bit [31:0] size = 0; \ 00197 `vmm_data_member_scalar_unpackint(unpack,size,this.__vmm_offset,0) \ 00198 `vmm_data_member_update_offset(this.__vmm_offset,4) \ 00199 `vmm_data_member_scalar_unpackint(unpack,count,this.__vmm_offset,0) \ 00200 `vmm_data_member_update_offset(this.__vmm_offset,4) \ 00201 this._name = new [size]; \ 00202 for (int j=0; j < size; j++) begin \ 00203 `vmm_data_member_scalar_unpack(unpack,this.__vmm_maxbits,count,this.__vmm_offset) \ 00204 this._name[j] = this.__vmm_maxbits; \ 00205 `vmm_data_member_update_offset(this.__vmm_offset,count) \ 00206 end \ 00207 end \ 00208 endcase 00209 00210 00211 `define vmm_data_member_scalar_aa_scalar(_name, _do) \ 00212 \ 00213 case (do_what & _do) \ 00214 DO_PRINT: begin \ 00215 int _count = 0; \ 00216 $sformat(this.__vmm_image, "%s\n%s _name[%0d]=", this.__vmm_image, \ 00217 this.__vmm_prefix, this._name.num()); \ 00218 foreach (this._name[i]) begin \ 00219 if (_count <= 2 || _count >= this._name.num()-2) \ 00220 $sformat(this.__vmm_image, "%s %0d:`h%0h", this.__vmm_image, \ 00221 i, this._name[i]); \ 00222 if (_count == 2 && this._name.num() > 5) begin \ 00223 this.__vmm_image = {this.__vmm_image, " ..."}; \ 00224 end \ 00225 _count++; \ 00226 end \ 00227 end \ 00228 DO_COPY: begin \ 00229 __vmm_rhs._name.delete(); \ 00230 foreach(this._name[i]) begin \ 00231 __vmm_rhs._name[i]=this._name[i]; \ 00232 end \ 00233 end \ 00234 DO_COMPARE: begin \ 00235 if (__vmm_rhs._name.num() !== this._name.num()) begin \ 00236 $sformat(this.__vmm_image, "this._name.num() (%0d) !== to._name.num() (%0d)", \ 00237 this._name.num(), __vmm_rhs._name.num()); \ 00238 this.__vmm_status = 0; \ 00239 return; \ 00240 end \ 00241 foreach (this._name[i]) begin \ 00242 if (!__vmm_rhs._name.exists(i)) begin \ 00243 $sformat(this.__vmm_image, "this._name[%0d] exists but to._name[%0d] does not", \ 00244 i, i); \ 00245 this.__vmm_status = 0; \ 00246 return; \ 00247 end \ 00248 else if (__vmm_rhs._name[i] != this._name[i]) begin \ 00249 $sformat(this.__vmm_image, "this._name[%0d]:'h%0h !== to._name[%0d]:'h%0h", \ 00250 i, this._name[i], i, __vmm_rhs._name[i]); \ 00251 this.__vmm_status = 0; \ 00252 return; \ 00253 end \ 00254 end \ 00255 end \ 00256 DO_PACK: begin \ 00257 int start; \ 00258 int count; \ 00259 int index; \ 00260 int element=0; \ 00261 bit [31:0] size=0; \ 00262 start = this.__vmm_offset; \ 00263 element = this._name.first(index); \ 00264 `vmm_data_member_scalar_count(element,count) \ 00265 element = 0; \ 00266 size = this._name.num(); \ 00267 foreach (this._name[j]) begin \ 00268 this.__vmm_maxbits = this._name[j]; \ 00269 index = j; \ 00270 if (element == 0 ) begin\ 00271 `vmm_data_member_update_offset(this.__vmm_offset,8) \ 00272 element = 1; \ 00273 end \ 00274 `vmm_data_member_scalar_packint(pack,index,this.__vmm_offset,0) \ 00275 `vmm_data_member_update_offset(this.__vmm_offset,4) \ 00276 `vmm_data_member_scalar_pack(pack,this.__vmm_maxbits,count,this.__vmm_offset) \ 00277 `vmm_data_member_update_offset(this.__vmm_offset,count) \ 00278 end \ 00279 this.__vmm_len = this.__vmm_offset; \ 00280 `vmm_data_member_scalar_packint(pack,size,start,0) \ 00281 `vmm_data_member_scalar_packint(pack,count,(start+4),0) \ 00282 end \ 00283 DO_UNPACK: begin \ 00284 int start; \ 00285 int count; \ 00286 int index; \ 00287 bit [31:0] size = 0; \ 00288 start = this.__vmm_offset; \ 00289 `vmm_data_member_scalar_unpackint(unpack,size,this.__vmm_offset,0) \ 00290 `vmm_data_member_update_offset(this.__vmm_offset,4) \ 00291 `vmm_data_member_scalar_unpackint(unpack,count,this.__vmm_offset,0) \ 00292 `vmm_data_member_update_offset(this.__vmm_offset,4) \ 00293 for (int j=0; j < size; j++) begin \ 00294 `vmm_data_member_scalar_unpackint(unpack,index,this.__vmm_offset,0) \ 00295 `vmm_data_member_update_offset(this.__vmm_offset,4) \ 00296 `vmm_data_member_scalar_unpack(unpack,this.__vmm_maxbits,count,this.__vmm_offset) \ 00297 `vmm_data_member_update_offset(this.__vmm_offset,count) \ 00298 this._name[index] = this.__vmm_maxbits; \ 00299 end \ 00300 end \ 00301 endcase 00302 00303 `define vmm_data_member_scalar_aa_string(_name, _do) \ 00304 \ 00305 case (do_what & _do) \ 00306 DO_PRINT: begin \ 00307 int _count = 0; \ 00308 $sformat(this.__vmm_image, "%s\n%s _name[%0d]=", this.__vmm_image, \ 00309 this.__vmm_prefix, this._name.num()); \ 00310 foreach (this._name[i]) begin \ 00311 if (_count <= 2 || _count >= this._name.num()-2) \ 00312 $sformat(this.__vmm_image, "%s \"%s\":'h%0h", this.__vmm_image, i, this._name[i]); \ 00313 if (_count == 2 && this._name.num() > 5) begin \ 00314 this.__vmm_image = {this.__vmm_image, " ..."}; \ 00315 end \ 00316 _count++; \ 00317 end \ 00318 end \ 00319 DO_COPY: begin \ 00320 __vmm_rhs._name.delete(); \ 00321 foreach(this._name[i]) begin \ 00322 __vmm_rhs._name[i] = this._name[i]; \ 00323 end \ 00324 end \ 00325 DO_COMPARE: begin \ 00326 if (__vmm_rhs._name.num() !== this._name.num()) begin \ 00327 $sformat(this.__vmm_image, "this._name.num() (%0d) !== to._name.num() (%0d)", \ 00328 this._name.num(), __vmm_rhs._name.num()); \ 00329 this.__vmm_status = 0; \ 00330 return; \ 00331 end \ 00332 foreach (this._name[i]) begin \ 00333 if(!__vmm_rhs._name.exists(i)) begin \ 00334 $sformat(this.__vmm_image, "this._name[\"%s\"] exists but to._name[\"%s\"] does not", \ 00335 i, i); \ 00336 this.__vmm_status = 0; \ 00337 return; \ 00338 end \ 00339 else if (__vmm_rhs._name[i] != this._name[i]) begin \ 00340 $sformat(this.__vmm_image, "this._name[\"%s\"]:'h%0h !== to._name[\"%s\"]:'h%0h", \ 00341 i, this._name[i], i, __vmm_rhs._name[i]); \ 00342 this.__vmm_status = 0; \ 00343 return; \ 00344 end \ 00345 end \ 00346 end \ 00347 DO_PACK: begin \ 00348 int start; \ 00349 int count; \ 00350 string sindextemp; \ 00351 int sindexcount; \ 00352 string stemp; \ 00353 bit [31:0] size=0; \ 00354 start = this.__vmm_offset; \ 00355 stemp = this._name.first(sindextemp); \ 00356 size = this._name.num(); \ 00357 `vmm_data_member_scalar_packint(pack,size,start,0) \ 00358 `vmm_data_member_update_offset(this.__vmm_offset,4) \ 00359 this.__vmm_maxbits = 0; \ 00360 foreach (this._name[j]) begin \ 00361 this.__vmm_maxbits =0; \ 00362 sindextemp = j; \ 00363 sindexcount = sindextemp.len(); \ 00364 this.__vmm_maxbits = sindextemp; \ 00365 `vmm_data_member_scalar_packint(pack,sindexcount,this.__vmm_offset,0) \ 00366 `vmm_data_member_update_offset(this.__vmm_offset,4) \ 00367 `vmm_data_member_scalar_pack(pack,this.__vmm_maxbits,sindexcount,this.__vmm_offset) \ 00368 `vmm_data_member_update_offset(this.__vmm_offset,sindexcount) \ 00369 this.__vmm_maxbits =0; \ 00370 `vmm_data_member_scalar_count(this._name[j],count) \ 00371 `vmm_data_member_scalar_packint(pack,count,this.__vmm_offset,0) \ 00372 `vmm_data_member_update_offset(this.__vmm_offset,4) \ 00373 this.__vmm_maxbits = this._name[j]; \ 00374 `vmm_data_member_scalar_pack(pack,this.__vmm_maxbits,count,this.__vmm_offset) \ 00375 `vmm_data_member_update_offset(this.__vmm_offset,count) \ 00376 end \ 00377 this.__vmm_len = this.__vmm_offset; \ 00378 end \ 00379 DO_UNPACK: begin \ 00380 int start; \ 00381 int count; \ 00382 string sindextemp; \ 00383 int sindexcount; \ 00384 string stemp; \ 00385 bit [31:0] size=0; \ 00386 this.__vmm_maxbits = 0; \ 00387 start = this.__vmm_offset; \ 00388 `vmm_data_member_scalar_unpackint(unpack,size,this.__vmm_offset,0) \ 00389 `vmm_data_member_update_offset(this.__vmm_offset,4) \ 00390 for (int j=0; j < size; j++) begin \ 00391 `vmm_data_member_scalar_unpackint(unpack,sindexcount,this.__vmm_offset,0) \ 00392 `vmm_data_member_update_offset(this.__vmm_offset,4) \ 00393 `vmm_data_member_scalar_unpack(unpack,this.__vmm_maxbits,sindexcount,this.__vmm_offset) \ 00394 sindextemp = this.__vmm_maxbits; \ 00395 `vmm_data_member_update_offset(this.__vmm_offset,sindexcount) \ 00396 this.__vmm_maxbits = 0; \ 00397 `vmm_data_member_scalar_unpackint(unpack,count,this.__vmm_offset,0) \ 00398 `vmm_data_member_update_offset(this.__vmm_offset,4) \ 00399 `vmm_data_member_scalar_unpack(unpack,this.__vmm_maxbits,count,this.__vmm_offset) \ 00400 this._name[sindextemp] = this.__vmm_maxbits; \ 00401 `vmm_data_member_update_offset(this.__vmm_offset,count) \ 00402 end \ 00403 end \ 00404 endcase 00405 00406 00407 `define vmm_data_member_string(_name, _do) \ 00408 \ 00409 case (do_what & _do) \ 00410 DO_PRINT: begin \ 00411 $sformat(this.__vmm_image, "%s\n%s _name=\"%s\"", this.__vmm_image, this.__vmm_prefix, this._name); \ 00412 end \ 00413 DO_COPY: begin \ 00414 __vmm_rhs._name = this._name; \ 00415 end \ 00416 DO_COMPARE: begin \ 00417 if (__vmm_rhs._name != this._name) begin \ 00418 $sformat(this.__vmm_image, "this._name (\"%s\") !== to._name (\"%s\")", \ 00419 this._name, __vmm_rhs._name); \ 00420 this.__vmm_status = 0; \ 00421 return; \ 00422 end \ 00423 end \ 00424 DO_PACK: begin \ 00425 int start; \ 00426 int count; \ 00427 start = this.__vmm_offset; \ 00428 count = (this._name.len()); \ 00429 this.__vmm_maxbits = 0; \ 00430 `vmm_data_member_scalar_packint(pack,count,this.__vmm_offset,0) \ 00431 `vmm_data_member_update_offset(this.__vmm_offset,4) \ 00432 this.__vmm_maxbits = this._name; \ 00433 `vmm_data_member_scalar_pack(pack,this.__vmm_maxbits,count,this.__vmm_offset) \ 00434 `vmm_data_member_update_offset(this.__vmm_offset,count) \ 00435 this.__vmm_len = this.__vmm_offset; \ 00436 end \ 00437 DO_UNPACK: begin \ 00438 int count; \ 00439 int start; \ 00440 int size; \ 00441 this.__vmm_maxbits = 0; \ 00442 start = this.__vmm_offset; \ 00443 `vmm_data_member_scalar_unpackint(unpack,count,this.__vmm_offset,0) \ 00444 `vmm_data_member_update_offset(this.__vmm_offset,4) \ 00445 `vmm_data_member_scalar_unpack(unpack,this.__vmm_maxbits,count,this.__vmm_offset) \ 00446 this._name = this.__vmm_maxbits; \ 00447 `vmm_data_member_update_offset(this.__vmm_offset,count) \ 00448 end \ 00449 endcase 00450 00451 00452 `define vmm_data_member_string_array(_name, _do) \ 00453 \ 00454 case (do_what & _do) \ 00455 DO_PRINT: begin \ 00456 int size =0; \ 00457 size = $size(this._name); \ 00458 $sformat(this.__vmm_image, "%s\n%s _name[%0d]=", this.__vmm_image, this.__vmm_prefix, size); \ 00459 for (int i = 0; i < size; i++) begin \ 00460 $sformat(this.__vmm_image, "%s \"%s\"", this.__vmm_image, this._name[i]); \ 00461 if (i == 2 && size > 5) begin \ 00462 this.__vmm_image = {this.__vmm_image, " ..."}; \ 00463 i = size - 3; \ 00464 end \ 00465 end \ 00466 end \ 00467 DO_COPY: begin \ 00468 __vmm_rhs._name = this._name; \ 00469 end \ 00470 DO_COMPARE: begin \ 00471 foreach (this._name[i]) begin \ 00472 if (__vmm_rhs._name[i] != this._name[i]) begin \ 00473 $sformat(this.__vmm_image, "this._name[%0d] (%s) !== to._name[%0d] (%s)", \ 00474 i, this._name[i], i, __vmm_rhs._name[i]); \ 00475 this.__vmm_status = 0; \ 00476 return; \ 00477 end \ 00478 end \ 00479 end \ 00480 DO_PACK: begin \ 00481 int start; \ 00482 int count; \ 00483 string stemp; \ 00484 bit [31:0] size=0; \ 00485 start = this.__vmm_offset; \ 00486 `vmm_data_member_update_offset(this.__vmm_offset,4) \ 00487 this.__vmm_maxbits =0; \ 00488 foreach (this._name[j]) begin \ 00489 count = (this._name[j].len()); \ 00490 this.__vmm_maxbits = this._name[j]; \ 00491 `vmm_data_member_scalar_packint(pack,count,this.__vmm_offset,0) \ 00492 `vmm_data_member_update_offset(this.__vmm_offset,4) \ 00493 `vmm_data_member_scalar_pack(pack,this.__vmm_maxbits,count,this.__vmm_offset) \ 00494 `vmm_data_member_update_offset(this.__vmm_offset,count) \ 00495 size++; \ 00496 end \ 00497 `vmm_data_member_scalar_packint(pack,size,start,0) \ 00498 this.__vmm_len = this.__vmm_offset; \ 00499 end \ 00500 DO_UNPACK: begin \ 00501 int count; \ 00502 int start; \ 00503 bit [31:0] size = 0; \ 00504 start = this.__vmm_offset; \ 00505 this.__vmm_maxbits =0; \ 00506 `vmm_data_member_scalar_unpackint(unpack,size,start,0) \ 00507 `vmm_data_member_update_offset(this.__vmm_offset,4) \ 00508 for (int j=0; j < size; j++) begin \ 00509 this.__vmm_maxbits =""; \ 00510 `vmm_data_member_scalar_unpackint(unpack,count,this.__vmm_offset,0) \ 00511 `vmm_data_member_update_offset(this.__vmm_offset,4) \ 00512 `vmm_data_member_scalar_unpack(unpack,this.__vmm_maxbits,count,this.__vmm_offset) \ 00513 `vmm_data_member_update_offset(this.__vmm_offset,count) \ 00514 this._name[j] = this.__vmm_maxbits; \ 00515 this.__vmm_maxbits =""; \ 00516 end \ 00517 end \ 00518 endcase 00519 00520 `define vmm_data_member_string_da(_name, _do) \ 00521 \ 00522 case (do_what & _do) \ 00523 DO_PRINT: begin \ 00524 $sformat(this.__vmm_image, "%s\n%s _name[%0d]=", this.__vmm_image, this.__vmm_prefix, this._name.size()); \ 00525 for (int i = 0; i < this._name.size(); i++) begin \ 00526 $sformat(this.__vmm_image, "%s \"%s\"", this.__vmm_image, this._name[i]); \ 00527 if (i == 2 && this._name.size() > 5) begin \ 00528 this.__vmm_image = {this.__vmm_image, " ..."}; \ 00529 i = this._name.size() - 3; \ 00530 end \ 00531 end \ 00532 end \ 00533 DO_COPY: begin \ 00534 __vmm_rhs._name = new [this._name.size()]; \ 00535 foreach(this._name[i]) __vmm_rhs._name[i] = this._name[i]; \ 00536 end \ 00537 DO_COMPARE: begin \ 00538 if (__vmm_rhs._name.size() !== this._name.size()) begin \ 00539 $sformat(this.__vmm_image, "this._name.size() (%0d) !== to._name.size() (%0d)", \ 00540 this._name.size(), __vmm_rhs._name.size()); \ 00541 this.__vmm_status = 0; \ 00542 return; \ 00543 end \ 00544 foreach (this._name[i]) begin \ 00545 if (__vmm_rhs._name[i] != this._name[i]) begin \ 00546 $sformat(this.__vmm_image, "this._name[%0d] (%s) !== to._name[%0d] (%s)", \ 00547 i, this._name[i], i, __vmm_rhs._name[i]); \ 00548 this.__vmm_status = 0; \ 00549 return; \ 00550 end \ 00551 end \ 00552 end \ 00553 DO_PACK: begin \ 00554 int start; \ 00555 int count; \ 00556 int firstcount; \ 00557 string stemp; \ 00558 bit [31:0] size=0; \ 00559 start = this.__vmm_offset; \ 00560 size = this._name.size(); \ 00561 `vmm_data_member_scalar_packint(pack,size,start,0) \ 00562 `vmm_data_member_update_offset(this.__vmm_offset,4) \ 00563 this.__vmm_maxbits =0; \ 00564 foreach (this._name[j]) begin \ 00565 count = (this._name[j].len()); \ 00566 this.__vmm_maxbits = this._name[j]; \ 00567 `vmm_data_member_scalar_packint(pack,count,this.__vmm_offset,0) \ 00568 `vmm_data_member_update_offset(this.__vmm_offset,4) \ 00569 `vmm_data_member_scalar_pack(pack,this.__vmm_maxbits,count,this.__vmm_offset) \ 00570 `vmm_data_member_update_offset(this.__vmm_offset,count) \ 00571 end \ 00572 this.__vmm_len = this.__vmm_offset; \ 00573 end \ 00574 DO_UNPACK: begin \ 00575 int count; \ 00576 int index; \ 00577 int start; \ 00578 bit [31:0] size = 0; \ 00579 start = this.__vmm_offset; \ 00580 this.__vmm_maxbits =0; \ 00581 `vmm_data_member_scalar_unpackint(unpack,size,start,0) \ 00582 `vmm_data_member_update_offset(this.__vmm_offset,4) \ 00583 this._name = new [size]; \ 00584 for (int j=0; j < size; j++) begin \ 00585 this.__vmm_maxbits =""; \ 00586 `vmm_data_member_scalar_unpackint(unpack,count,this.__vmm_offset,0) \ 00587 `vmm_data_member_update_offset(this.__vmm_offset,4) \ 00588 `vmm_data_member_scalar_unpack(unpack,this.__vmm_maxbits,count,this.__vmm_offset) \ 00589 `vmm_data_member_update_offset(this.__vmm_offset,count) \ 00590 this._name[j] = this.__vmm_maxbits; \ 00591 this.__vmm_maxbits =""; \ 00592 end \ 00593 end \ 00594 endcase 00595 00596 `define vmm_data_member_string_aa_scalar(_name, _do) \ 00597 \ 00598 case (do_what & _do) \ 00599 DO_PRINT: begin \ 00600 int _count = 0; \ 00601 $sformat(this.__vmm_image, "%s\n%s _name[%0d]=", this.__vmm_image, this.__vmm_prefix, this._name.num()); \ 00602 foreach(this._name[i]) begin \ 00603 if (_count <= 2 || _count >= this._name.num()-2) \ 00604 $sformat(this.__vmm_image, "%s %0d:\"%s\"", this.__vmm_image, i, this._name[i]); \ 00605 if (_count == 2 && this._name.num() > 5) begin \ 00606 this.__vmm_image = {this.__vmm_image, " ..."}; \ 00607 end \ 00608 _count++; \ 00609 end \ 00610 $sformat(this.__vmm_image, "%s\"", this.__vmm_image); \ 00611 end \ 00612 DO_COPY: begin \ 00613 __vmm_rhs._name.delete(); \ 00614 foreach(this._name[i]) begin \ 00615 __vmm_rhs._name[i]=this._name[i]; \ 00616 end \ 00617 end \ 00618 DO_COMPARE: begin \ 00619 if (__vmm_rhs._name.num() !== this._name.num()) begin \ 00620 $sformat(this.__vmm_image, "this._name.num() (%0d) !== to._name.num() (%0d)", \ 00621 this._name.num(), __vmm_rhs._name.num()); \ 00622 this.__vmm_status = 0; \ 00623 return; \ 00624 end \ 00625 foreach (this._name[i]) begin \ 00626 if (!__vmm_rhs._name.exists(i)) begin \ 00627 $sformat(this.__vmm_image, "this._name[%0d] exists but to._name[%0d] does not", \ 00628 i, i); \ 00629 this.__vmm_status = 0; \ 00630 return; \ 00631 end \ 00632 else if (__vmm_rhs._name[i] != this._name[i]) begin \ 00633 $sformat(this.__vmm_image, "this._name[%0d] (\"%s\") !== to._name[%0d] (\"%s\")", \ 00634 i, this._name[i], i, __vmm_rhs._name[i]); \ 00635 this.__vmm_status = 0; \ 00636 return; \ 00637 end \ 00638 end \ 00639 end \ 00640 DO_PACK: begin \ 00641 int start; \ 00642 int count; \ 00643 int index; \ 00644 bit [31:0] size=0; \ 00645 start = this.__vmm_offset; \ 00646 this.__vmm_maxbits = 0; \ 00647 size = this._name.num(); \ 00648 `vmm_data_member_scalar_packint(pack,size,start,0) \ 00649 `vmm_data_member_update_offset(this.__vmm_offset,4) \ 00650 foreach (this._name[j]) begin \ 00651 this.__vmm_maxbits = 0; \ 00652 count = (this._name[j].len()); \ 00653 this.__vmm_maxbits = this._name[j]; \ 00654 index = j; \ 00655 `vmm_data_member_scalar_packint(pack,index,this.__vmm_offset,0) \ 00656 `vmm_data_member_update_offset(this.__vmm_offset,4) \ 00657 `vmm_data_member_scalar_packint(pack,count,this.__vmm_offset,0) \ 00658 `vmm_data_member_update_offset(this.__vmm_offset,4) \ 00659 `vmm_data_member_scalar_pack(pack,this.__vmm_maxbits,count,this.__vmm_offset) \ 00660 `vmm_data_member_update_offset(this.__vmm_offset,count) \ 00661 end \ 00662 this.__vmm_len = this.__vmm_offset; \ 00663 end \ 00664 DO_UNPACK: begin \ 00665 int start; \ 00666 int count; \ 00667 int index; \ 00668 bit [31:0] size = 0; \ 00669 start = this.__vmm_offset; \ 00670 `vmm_data_member_scalar_unpackint(unpack,size,start,0) \ 00671 `vmm_data_member_update_offset(this.__vmm_offset,4) \ 00672 this.__vmm_maxbits = 0; \ 00673 for (int j=0; j < size; j++) begin \ 00674 `vmm_data_member_scalar_unpackint(unpack,index,this.__vmm_offset,0) \ 00675 `vmm_data_member_update_offset(this.__vmm_offset,4) \ 00676 `vmm_data_member_scalar_unpackint(unpack,count,this.__vmm_offset,0) \ 00677 `vmm_data_member_update_offset(this.__vmm_offset,4) \ 00678 `vmm_data_member_scalar_unpack(unpack,this.__vmm_maxbits,count,this.__vmm_offset) \ 00679 `vmm_data_member_update_offset(this.__vmm_offset,count) \ 00680 this._name[index] = this.__vmm_maxbits; \ 00681 this.__vmm_maxbits = 0; \ 00682 end \ 00683 end \ 00684 endcase 00685 00686 00687 `define vmm_data_member_string_aa_string(_name, _do) \ 00688 \ 00689 case (do_what & _do) \ 00690 DO_PRINT: begin \ 00691 int _count = 0; \ 00692 $sformat(this.__vmm_image, "%s\n%s _name[%0d]=", this.__vmm_image, this.__vmm_prefix, this._name.num()); \ 00693 foreach (this._name[i]) begin \ 00694 if (_count <= 2 || _count >= this._name.num()-2) \ 00695 $sformat(this.__vmm_image, "%s \"%s\":\"%s\"", this.__vmm_image, i, this._name[i]); \ 00696 if (_count == 2 && this._name.num() > 5) begin \ 00697 this.__vmm_image = {this.__vmm_image, " ..."}; \ 00698 end \ 00699 _count++; \ 00700 end \ 00701 end \ 00702 DO_COPY: begin \ 00703 __vmm_rhs._name.delete(); \ 00704 foreach(this._name[i]) __vmm_rhs._name[i] = this._name[i]; \ 00705 end \ 00706 DO_COMPARE: begin \ 00707 if (__vmm_rhs._name.num() !== this._name.num()) begin \ 00708 $sformat(this.__vmm_image, "this._name.num() (%0d) !== to._name.num() (%0d)", \ 00709 this._name.num(), __vmm_rhs._name.num()); \ 00710 this.__vmm_status = 0; \ 00711 return; \ 00712 end \ 00713 foreach (this._name[i]) begin \ 00714 if (!__vmm_rhs._name.exists(i)) begin \ 00715 $sformat(this.__vmm_image, "this._name[\"%s\"] exists but to._name[\"%s\"] does not", \ 00716 i, i); \ 00717 this.__vmm_status = 0; \ 00718 return; \ 00719 end \ 00720 else if (__vmm_rhs._name[i] != this._name[i]) begin \ 00721 $sformat(this.__vmm_image, "this._name[\"%s\"] (\"%s\") !== to._name[\"%s\"] (\"%s\")", \ 00722 i, this._name[i], i, __vmm_rhs._name[i]); \ 00723 this.__vmm_status = 0; \ 00724 return; \ 00725 end \ 00726 end \ 00727 end \ 00728 DO_PACK: begin \ 00729 int start; \ 00730 int count; \ 00731 string sindextemp; \ 00732 int sindexcount; \ 00733 bit [31:0] size=0; \ 00734 start = this.__vmm_offset; \ 00735 size = this._name.num(); \ 00736 `vmm_data_member_scalar_packint(pack,size,start,0) \ 00737 `vmm_data_member_update_offset(this.__vmm_offset,4) \ 00738 this.__vmm_maxbits = 0; \ 00739 foreach (this._name[j]) begin \ 00740 this.__vmm_maxbits =0; \ 00741 sindextemp = j; \ 00742 sindexcount = sindextemp.len(); \ 00743 this.__vmm_maxbits = sindextemp; \ 00744 `vmm_data_member_scalar_packint(pack,sindexcount,this.__vmm_offset,0) \ 00745 `vmm_data_member_update_offset(this.__vmm_offset,4) \ 00746 `vmm_data_member_scalar_pack(pack,this.__vmm_maxbits,sindexcount,this.__vmm_offset) \ 00747 `vmm_data_member_update_offset(this.__vmm_offset,sindexcount) \ 00748 this.__vmm_maxbits =0; \ 00749 count = this._name[j].len(); \ 00750 `vmm_data_member_scalar_packint(pack,count,this.__vmm_offset,0) \ 00751 `vmm_data_member_update_offset(this.__vmm_offset,4) \ 00752 this.__vmm_maxbits = this._name[j]; \ 00753 `vmm_data_member_scalar_pack(pack,this.__vmm_maxbits,count,this.__vmm_offset) \ 00754 `vmm_data_member_update_offset(this.__vmm_offset,count) \ 00755 end \ 00756 this.__vmm_len = this.__vmm_offset; \ 00757 end \ 00758 DO_UNPACK: begin \ 00759 int start; \ 00760 int count; \ 00761 string sindextemp; \ 00762 int sindexcount; \ 00763 string stemp; \ 00764 bit [31:0] size=0; \ 00765 this.__vmm_maxbits = 0; \ 00766 start = this.__vmm_offset; \ 00767 `vmm_data_member_scalar_unpackint(unpack,size,start,0) \ 00768 `vmm_data_member_update_offset(this.__vmm_offset,4) \ 00769 for (int j=0; j < size; j++) begin \ 00770 this.__vmm_maxbits = 0; \ 00771 `vmm_data_member_scalar_unpackint(unpack,sindexcount,this.__vmm_offset,0) \ 00772 `vmm_data_member_update_offset(this.__vmm_offset,4) \ 00773 `vmm_data_member_scalar_unpack(unpack,this.__vmm_maxbits,sindexcount,this.__vmm_offset) \ 00774 `vmm_data_member_update_offset(this.__vmm_offset,sindexcount) \ 00775 sindextemp = this.__vmm_maxbits; \ 00776 this.__vmm_maxbits = 0; \ 00777 `vmm_data_member_scalar_unpackint(unpack,count,this.__vmm_offset,0) \ 00778 `vmm_data_member_update_offset(this.__vmm_offset,4) \ 00779 `vmm_data_member_scalar_unpack(unpack,this.__vmm_maxbits,count,this.__vmm_offset) \ 00780 `vmm_data_member_update_offset(this.__vmm_offset,count) \ 00781 this._name[sindextemp] = this.__vmm_maxbits; \ 00782 end \ 00783 end \ 00784 endcase 00785 00786 00787 `define vmm_data_member_enum(_name, _do) \ 00788 \ 00789 case (do_what & _do) \ 00790 DO_PRINT: begin \ 00791 $sformat(this.__vmm_image, "%s\n%s _name=%s", this.__vmm_image, this.__vmm_prefix, this._name.name()); \ 00792 end \ 00793 DO_COPY: begin \ 00794 __vmm_rhs._name = this._name; \ 00795 end \ 00796 DO_COMPARE: begin \ 00797 if (__vmm_rhs._name !== this._name) begin \ 00798 $sformat(this.__vmm_image, "this._name (%s) !== to._name (%s)", \ 00799 this._name.name(), __vmm_rhs._name.name()); \ 00800 this.__vmm_status = 0; \ 00801 return; \ 00802 end \ 00803 end \ 00804 DO_PACK: begin \ 00805 int start; \ 00806 int count; \ 00807 string stemp; \ 00808 bit [31:0] size=0; \ 00809 start = this.__vmm_offset; \ 00810 stemp = this._name.name(); \ 00811 count = (stemp.len()); \ 00812 this.__vmm_maxbits = this._name.name(); \ 00813 `vmm_data_member_scalar_packint(pack,count,this.__vmm_offset,0) \ 00814 `vmm_data_member_update_offset(this.__vmm_offset,4) \ 00815 `vmm_data_member_scalar_pack(pack,this.__vmm_maxbits,count,this.__vmm_offset) \ 00816 `vmm_data_member_update_offset(this.__vmm_offset,count) \ 00817 this.__vmm_len = this.__vmm_offset; \ 00818 end \ 00819 DO_UNPACK: begin \ 00820 int count; \ 00821 int start; \ 00822 int size; \ 00823 int index; \ 00824 string stemp; \ 00825 start = this.__vmm_offset; \ 00826 `vmm_data_member_scalar_unpackint(unpack,count,this.__vmm_offset,0) \ 00827 `vmm_data_member_update_offset(this.__vmm_offset,4) \ 00828 `vmm_data_member_scalar_unpack(unpack,this.__vmm_maxbits,count,this.__vmm_offset) \ 00829 `vmm_data_member_update_offset(this.__vmm_offset,count) \ 00830 stemp = this.__vmm_maxbits; \ 00831 index = 0; \ 00832 `vmm_data_member_enum_set_name(this._name,stemp,index) \ 00833 end \ 00834 endcase 00835 00836 00837 `define vmm_data_member_enum_array(_name, _do) \ 00838 \ 00839 case (do_what & _do) \ 00840 DO_PRINT: begin \ 00841 int size =0; \ 00842 size = $size(this._name); \ 00843 $sformat(this.__vmm_image, "%s\n%s _name[%0d]=", this.__vmm_image, this.__vmm_prefix, size); \ 00844 for (int i = 0; i < size; i++) begin \ 00845 $sformat(this.__vmm_image, "%s %s", this.__vmm_image, this._name[i].name()); \ 00846 if (i == 2 && size > 5) begin \ 00847 this.__vmm_image = {this.__vmm_image, " ..."}; \ 00848 i = size - 3; \ 00849 end \ 00850 end \ 00851 end \ 00852 DO_COPY: begin \ 00853 __vmm_rhs._name = this._name; \ 00854 end \ 00855 DO_COMPARE: begin \ 00856 foreach (this._name[i]) begin \ 00857 if (__vmm_rhs._name[i] !== this._name[i]) begin \ 00858 $sformat(this.__vmm_image, "this._name[%0d] (%s) !== to._name[%0d] (%s)", \ 00859 i, this._name[i].name(), i, __vmm_rhs._name[i].name()); \ 00860 this.__vmm_status = 0; \ 00861 return; \ 00862 end \ 00863 end \ 00864 end \ 00865 DO_PACK: begin \ 00866 int start; \ 00867 int count; \ 00868 string stemp; \ 00869 bit [31:0] size=0; \ 00870 start = this.__vmm_offset; \ 00871 `vmm_data_member_update_offset(this.__vmm_offset,4) \ 00872 this.__vmm_maxbits = 0; \ 00873 foreach (this._name[j]) begin \ 00874 stemp = this._name[j].name(); \ 00875 count = (stemp.len()); \ 00876 this.__vmm_maxbits = this._name[j].name(); \ 00877 `vmm_data_member_scalar_packint(pack,count,this.__vmm_offset,0) \ 00878 `vmm_data_member_update_offset(this.__vmm_offset,4) \ 00879 `vmm_data_member_scalar_pack(pack,this.__vmm_maxbits,count,this.__vmm_offset) \ 00880 `vmm_data_member_update_offset(this.__vmm_offset,count) \ 00881 size++; \ 00882 end \ 00883 `vmm_data_member_scalar_packint(pack,size,start,0) \ 00884 this.__vmm_len = this.__vmm_offset; \ 00885 end \ 00886 DO_UNPACK: begin \ 00887 int count; \ 00888 int start; \ 00889 int index; \ 00890 string stemp; \ 00891 bit [31:0] size = 0; \ 00892 start = this.__vmm_offset; \ 00893 `vmm_data_member_scalar_unpackint(unpack,size,start,0) \ 00894 `vmm_data_member_update_offset(this.__vmm_offset,4) \ 00895 this.__vmm_maxbits =0; \ 00896 for (int j=0; j < size; j++) begin \ 00897 `vmm_data_member_scalar_unpackint(unpack,count,this.__vmm_offset,0) \ 00898 `vmm_data_member_update_offset(this.__vmm_offset,4) \ 00899 `vmm_data_member_scalar_unpack(unpack,this.__vmm_maxbits,count,this.__vmm_offset) \ 00900 `vmm_data_member_update_offset(this.__vmm_offset,count) \ 00901 stemp = this.__vmm_maxbits; \ 00902 index = 0; \ 00903 `vmm_data_member_enum_set_name(this._name[j],stemp,index) \ 00904 this.__vmm_maxbits =""; \ 00905 end \ 00906 end \ 00907 endcase 00908 00909 `define vmm_data_member_enum_da(_name, _do) \ 00910 \ 00911 case (do_what & _do) \ 00912 DO_PRINT: begin \ 00913 $sformat(this.__vmm_image, "%s\n%s _name[%0d]=", this.__vmm_image, this.__vmm_prefix, this._name.size()); \ 00914 for (int i = 0; i < this._name.size(); i++) begin \ 00915 $sformat(this.__vmm_image, "%s %s", this.__vmm_image, this._name[i].name()); \ 00916 if (i == 2 && this._name.size() > 5) begin \ 00917 this.__vmm_image = {this.__vmm_image, " ..."}; \ 00918 i = this._name.size() - 3; \ 00919 end \ 00920 end \ 00921 end \ 00922 DO_COPY: begin \ 00923 __vmm_rhs._name = new [this._name.size()]; \ 00924 foreach(this._name[i]) __vmm_rhs._name[i] = this._name[i]; \ 00925 end \ 00926 DO_COMPARE: begin \ 00927 if (__vmm_rhs._name.size() !== this._name.size()) begin \ 00928 $sformat(this.__vmm_image, "this._name.size() (%0d) !== to._name.size() (%0d)", \ 00929 this._name.size(), __vmm_rhs._name.size()); \ 00930 this.__vmm_status = 0; \ 00931 return; \ 00932 end \ 00933 foreach (this._name[i]) begin \ 00934 if (__vmm_rhs._name[i] !== this._name[i]) begin \ 00935 $sformat(this.__vmm_image, "this._name[%0d] (%s) !== to._name[%0d] (%s)", \ 00936 i, this._name[i].name(), i, __vmm_rhs._name[i].name()); \ 00937 this.__vmm_status = 0; \ 00938 return; \ 00939 end \ 00940 end \ 00941 end \ 00942 DO_PACK: begin \ 00943 int start; \ 00944 int count; \ 00945 int index; \ 00946 int element; \ 00947 string stemp; \ 00948 bit [31:0] size=0; \ 00949 start = this.__vmm_offset; \ 00950 size = this._name.size(); \ 00951 `vmm_data_member_scalar_packint(pack,size,start,0) \ 00952 `vmm_data_member_update_offset(this.__vmm_offset,4) \ 00953 this.__vmm_maxbits = 0; \ 00954 foreach (this._name[j]) begin \ 00955 stemp = this._name[j].name(); \ 00956 count = (stemp.len()); \ 00957 this.__vmm_maxbits = this._name[j].name(); \ 00958 `vmm_data_member_scalar_packint(pack,count,this.__vmm_offset,0) \ 00959 `vmm_data_member_update_offset(this.__vmm_offset,4) \ 00960 `vmm_data_member_scalar_pack(pack,this.__vmm_maxbits,count,this.__vmm_offset) \ 00961 `vmm_data_member_update_offset(this.__vmm_offset,count) \ 00962 end \ 00963 this.__vmm_len = this.__vmm_offset; \ 00964 end \ 00965 DO_UNPACK: begin \ 00966 int count; \ 00967 int index; \ 00968 int start; \ 00969 string stemp; \ 00970 bit [31:0] size = 0; \ 00971 start = this.__vmm_offset; \ 00972 `vmm_data_member_scalar_unpackint(unpack,size,start,0) \ 00973 `vmm_data_member_update_offset(this.__vmm_offset,4) \ 00974 this._name = new [size]; \ 00975 this.__vmm_maxbits =0; \ 00976 for (int j=0; j < size; j++) begin \ 00977 this.__vmm_maxbits =""; \ 00978 `vmm_data_member_scalar_unpackint(unpack,count,this.__vmm_offset,0) \ 00979 `vmm_data_member_update_offset(this.__vmm_offset,4) \ 00980 `vmm_data_member_scalar_unpack(unpack,this.__vmm_maxbits,count,this.__vmm_offset) \ 00981 `vmm_data_member_update_offset(this.__vmm_offset,count) \ 00982 stemp = this.__vmm_maxbits; \ 00983 index = 0; \ 00984 `vmm_data_member_enum_set_name(this._name[j],stemp,index) \ 00985 this.__vmm_maxbits =""; \ 00986 end \ 00987 end \ 00988 endcase 00989 00990 00991 `define vmm_data_member_enum_aa_scalar(_name, _do) \ 00992 \ 00993 case (do_what & _do) \ 00994 DO_PRINT: begin \ 00995 int _count = 0; \ 00996 $sformat(this.__vmm_image, "%s\n%s _name[%0d]=", this.__vmm_image, this.__vmm_prefix, this._name.num()); \ 00997 foreach(this._name[i]) begin \ 00998 if (_count <= 2 || _count >= this._name.num()-2) begin \ 00999 $sformat(this.__vmm_image, "%s %0d: %s ", this.__vmm_image, i, this._name[i].name()); \ 01000 if (_count == 2 && this._name.num() > 5) begin \ 01001 this.__vmm_image = {this.__vmm_image, " ..."}; \ 01002 end \ 01003 end \ 01004 _count++; \ 01005 end \ 01006 $sformat(this.__vmm_image, "%s", this.__vmm_image); \ 01007 end \ 01008 DO_COPY: begin \ 01009 __vmm_rhs._name.delete(); \ 01010 foreach(this._name[i]) begin \ 01011 __vmm_rhs._name[i]=this._name[i]; \ 01012 end \ 01013 end \ 01014 DO_COMPARE: begin \ 01015 if (__vmm_rhs._name.num() !== this._name.num()) begin \ 01016 $sformat(this.__vmm_image, "this._name.size() (%0d) !== to._name.size() (%0d)", \ 01017 this._name.num(), __vmm_rhs._name.num()); \ 01018 this.__vmm_status = 0; \ 01019 return; \ 01020 end \ 01021 foreach (this._name[i]) begin \ 01022 if (!__vmm_rhs._name.exists(i)) begin \ 01023 $sformat(this.__vmm_image, "this._name[%0d] exists but to._name[%0d] does not", \ 01024 i, i); \ 01025 this.__vmm_status = 0; \ 01026 return; \ 01027 end \ 01028 else if (__vmm_rhs._name[i] != this._name[i]) begin \ 01029 $sformat(this.__vmm_image, "this._name[%0d] (%s) !== to._name[%0d] (%s)", \ 01030 i, this._name[i].name, i, __vmm_rhs._name[i].name); \ 01031 this.__vmm_status = 0; \ 01032 return; \ 01033 end \ 01034 end \ 01035 end \ 01036 DO_PACK: begin \ 01037 int start; \ 01038 int count; \ 01039 int index; \ 01040 string stemp; \ 01041 bit [31:0] size=0; \ 01042 start = this.__vmm_offset; \ 01043 this.__vmm_maxbits = 0; \ 01044 size = this._name.num(); \ 01045 `vmm_data_member_scalar_packint(pack,size,start,0) \ 01046 `vmm_data_member_update_offset(this.__vmm_offset,4) \ 01047 foreach (this._name[j]) begin \ 01048 this.__vmm_maxbits = 0; \ 01049 stemp = this._name[j].name(); \ 01050 count = (stemp.len()); \ 01051 this.__vmm_maxbits = this._name[j].name(); \ 01052 index = j; \ 01053 `vmm_data_member_scalar_packint(pack,index,this.__vmm_offset,0) \ 01054 `vmm_data_member_update_offset(this.__vmm_offset,4) \ 01055 `vmm_data_member_scalar_packint(pack,count,this.__vmm_offset,0) \ 01056 `vmm_data_member_update_offset(this.__vmm_offset,4) \ 01057 `vmm_data_member_scalar_pack(pack,this.__vmm_maxbits,count,this.__vmm_offset) \ 01058 `vmm_data_member_update_offset(this.__vmm_offset,count) \ 01059 end \ 01060 this.__vmm_len = this.__vmm_offset; \ 01061 end \ 01062 DO_UNPACK: begin \ 01063 int count; \ 01064 int start; \ 01065 int index=0; \ 01066 string stemp; \ 01067 bit [31:0] size = 0; \ 01068 start = this.__vmm_offset; \ 01069 `vmm_data_member_scalar_unpackint(unpack,size,start,0) \ 01070 `vmm_data_member_update_offset(this.__vmm_offset,4) \ 01071 this.__vmm_maxbits =0; \ 01072 for (int j=0; j < size; j++) begin \ 01073 this.__vmm_maxbits =0; \ 01074 `vmm_data_member_scalar_unpackint(unpack,index,this.__vmm_offset,0) \ 01075 `vmm_data_member_update_offset(this.__vmm_offset,4) \ 01076 `vmm_data_member_scalar_unpackint(unpack,count,this.__vmm_offset,0) \ 01077 `vmm_data_member_update_offset(this.__vmm_offset,4) \ 01078 `vmm_data_member_scalar_unpack(unpack,this.__vmm_maxbits,count,this.__vmm_offset) \ 01079 `vmm_data_member_update_offset(this.__vmm_offset,count) \ 01080 stemp = this.__vmm_maxbits; \ 01081 count = 0; \ 01082 `vmm_data_member_enum_set_name(this._name[index],stemp,count) \ 01083 this.__vmm_maxbits =""; \ 01084 end \ 01085 end \ 01086 endcase 01087 01088 01089 01090 `define vmm_data_member_enum_aa_string(_name, _do) \ 01091 \ 01092 case (do_what & _do) \ 01093 DO_PRINT: begin \ 01094 int _count = 0; \ 01095 $sformat(this.__vmm_image, "%s\n%s _name[%0d]=", this.__vmm_image, this.__vmm_prefix, this._name.num()); \ 01096 foreach(this._name[i]) begin \ 01097 if (_count <= 2 || _count >= this._name.num()-2) begin \ 01098 $sformat(this.__vmm_image, "%s \"%s\":%s", this.__vmm_image, i, this._name[i].name); \ 01099 if (_count == 2 && this._name.num() > 5) begin \ 01100 this.__vmm_image = {this.__vmm_image, " ..."}; \ 01101 end \ 01102 end \ 01103 _count++; \ 01104 end \ 01105 end \ 01106 DO_COPY: begin \ 01107 __vmm_rhs._name.delete(); \ 01108 foreach (this._name[i]) begin \ 01109 __vmm_rhs._name[i] = this._name[i]; \ 01110 end \ 01111 end \ 01112 DO_COMPARE: begin \ 01113 if (__vmm_rhs._name.num() !== this._name.num()) begin \ 01114 $sformat(this.__vmm_image, "this._name.size() (%0d) !== to._name.size() (%0d)", \ 01115 this._name.num(), __vmm_rhs._name.num()); \ 01116 this.__vmm_status = 0; \ 01117 return; \ 01118 end \ 01119 foreach (this._name[i]) begin \ 01120 if (!__vmm_rhs._name.exists(i)) begin \ 01121 $sformat(this.__vmm_image, "this._name[\"%s\"] exists but to._name[\"%s\"] does not", \ 01122 i, i); \ 01123 this.__vmm_status = 0; \ 01124 return; \ 01125 end \ 01126 else if (__vmm_rhs._name[i] != this._name[i]) begin \ 01127 $sformat(this.__vmm_image, "this._name[\"%s\"] (%s) !== to._name[\"%s\"] (%s)", \ 01128 i, this._name[i].name, i, __vmm_rhs._name[i].name); \ 01129 this.__vmm_status = 0; \ 01130 return; \ 01131 end \ 01132 end \ 01133 end \ 01134 DO_PACK: begin \ 01135 int start; \ 01136 int count; \ 01137 int index; \ 01138 string sindextemp; \ 01139 int sindexcount; \ 01140 string stemp; \ 01141 bit [31:0] size=0; \ 01142 start = this.__vmm_offset; \ 01143 stemp = this._name.first(sindextemp); \ 01144 index = 0; \ 01145 size = this._name.num(); \ 01146 `vmm_data_member_scalar_packint(pack,size,start,0) \ 01147 `vmm_data_member_update_offset(this.__vmm_offset,4) \ 01148 this.__vmm_maxbits = 0; \ 01149 foreach (this._name[j]) begin \ 01150 this.__vmm_maxbits =0; \ 01151 sindextemp = j; \ 01152 sindexcount = sindextemp.len(); \ 01153 this.__vmm_maxbits = sindextemp; \ 01154 `vmm_data_member_scalar_packint(pack,sindexcount,this.__vmm_offset,0) \ 01155 `vmm_data_member_update_offset(this.__vmm_offset,4) \ 01156 `vmm_data_member_scalar_pack(pack,this.__vmm_maxbits,sindexcount,this.__vmm_offset) \ 01157 `vmm_data_member_update_offset(this.__vmm_offset,sindexcount) \ 01158 this.__vmm_maxbits =0; \ 01159 stemp = this._name[j].name(); \ 01160 count = (stemp.len()); \ 01161 `vmm_data_member_scalar_packint(pack,count,this.__vmm_offset,0) \ 01162 `vmm_data_member_update_offset(this.__vmm_offset,4) \ 01163 this.__vmm_maxbits = this._name[j].name(); \ 01164 `vmm_data_member_scalar_pack(pack,this.__vmm_maxbits,count,this.__vmm_offset) \ 01165 `vmm_data_member_update_offset(this.__vmm_offset,count) \ 01166 end \ 01167 this.__vmm_len = this.__vmm_offset; \ 01168 end \ 01169 DO_UNPACK: begin \ 01170 int start; \ 01171 int count; \ 01172 int index; \ 01173 string sindextemp; \ 01174 int sindexcount; \ 01175 string stemp; \ 01176 bit [31:0] size=0; \ 01177 index = 0; \ 01178 start = this.__vmm_offset; \ 01179 `vmm_data_member_scalar_unpackint(unpack,size,start,0) \ 01180 `vmm_data_member_update_offset(this.__vmm_offset,4) \ 01181 this.__vmm_maxbits = 0; \ 01182 for (int j=0; j < size; j++) begin \ 01183 this.__vmm_maxbits = 0; \ 01184 `vmm_data_member_scalar_unpackint(unpack,sindexcount,this.__vmm_offset,0) \ 01185 `vmm_data_member_update_offset(this.__vmm_offset,4) \ 01186 `vmm_data_member_scalar_unpack(unpack,this.__vmm_maxbits,sindexcount,this.__vmm_offset) \ 01187 `vmm_data_member_update_offset(this.__vmm_offset,sindexcount) \ 01188 sindextemp = this.__vmm_maxbits; \ 01189 this.__vmm_maxbits = 0; \ 01190 `vmm_data_member_scalar_unpackint(unpack,count,this.__vmm_offset,0) \ 01191 `vmm_data_member_update_offset(this.__vmm_offset,4) \ 01192 `vmm_data_member_scalar_unpack(unpack,this.__vmm_maxbits,count,this.__vmm_offset) \ 01193 `vmm_data_member_update_offset(this.__vmm_offset,count) \ 01194 stemp = this.__vmm_maxbits; \ 01195 index = 0; \ 01196 `vmm_data_member_enum_set_name(this._name[sindextemp],stemp,index) \ 01197 this.__vmm_maxbits =""; \ 01198 end \ 01199 end \ 01200 endcase 01201 01202 01203 `define vmm_data_member_handle(_name, _do) \ 01204 \ 01205 case (do_what & _do) \ 01206 DO_PRINT: begin \ 01207 if ( _name == null ) begin \ 01208 `vmm_warning(this.log, " vmm_data _name object does not exist, no action"); \ 01209 end \ 01210 else begin \ 01211 string _prefix = this.__vmm_prefix; \ 01212 $sformat(this.__vmm_image, "%s\n%s _name is %s", this.__vmm_image, this.__vmm_prefix, \ 01213 (this._name == null) ? "null" : "<ref>"); \ 01214 this.__vmm_prefix = _prefix; \ 01215 end \ 01216 end \ 01217 DO_COPY: begin \ 01218 if ( _name == null ) begin \ 01219 `vmm_warning(this.log, " vmm_data _name object does not exist, no action"); \ 01220 end \ 01221 else begin \ 01222 __vmm_rhs._name = this._name; \ 01223 end \ 01224 end \ 01225 DO_COMPARE: begin \ 01226 string diff; \ 01227 if ( _name == null ) begin \ 01228 `vmm_warning(this.log, " vmm_data _name object does not exist, no action"); \ 01229 end \ 01230 else begin \ 01231 if (this._name != __vmm_rhs._name) begin \ 01232 this.__vmm_image = "this._name !== to._name"; \ 01233 this.__vmm_status = 0; \ 01234 return; \ 01235 end \ 01236 end \ 01237 end \ 01238 DO_PACK: begin \ 01239 if ( _name == null ) begin \ 01240 `vmm_warning(this.log, " vmm_data _name object does not exist, no action"); \ 01241 end \ 01242 else begin \ 01243 end \ 01244 end \ 01245 DO_UNPACK: begin \ 01246 this._name = null; \ 01247 end \ 01248 endcase 01249 01250 01251 `define vmm_data_member_handle_array(_name, _do) \ 01252 \ 01253 case (do_what & _do) \ 01254 DO_PRINT: begin \ 01255 int size =0; \ 01256 size = $size(this._name); \ 01257 $sformat(this.__vmm_image, "%s\n%s _name[%0d]=", this.__vmm_image, this.__vmm_prefix, size); \ 01258 for (int i = 0; i < size; i++) begin \ 01259 $sformat(this.__vmm_image, "%s %s", this.__vmm_image, \ 01260 (this._name[i] == null) ? "null" : "<ref>"); \ 01261 if (i == 2 && size > 5) begin \ 01262 this.__vmm_image = {this.__vmm_image, " ..."}; \ 01263 i = size - 3; \ 01264 end \ 01265 end \ 01266 end \ 01267 DO_COPY: begin \ 01268 __vmm_rhs._name = this._name; \ 01269 end \ 01270 DO_COMPARE: begin \ 01271 foreach (this._name[i]) begin \ 01272 if (this._name[i] != __vmm_rhs._name[i]) begin \ 01273 $sformat(this.__vmm_image, "this._name[%0d] !== to._name[%0d]", i, i); \ 01274 this.__vmm_status = 0; \ 01275 return; \ 01276 end \ 01277 end \ 01278 end \ 01279 DO_PACK: begin \ 01280 end \ 01281 DO_UNPACK: begin \ 01282 foreach (this._name[i]) begin \ 01283 this._name[i] = null; \ 01284 end \ 01285 end \ 01286 endcase 01287 01288 01289 `define vmm_data_member_handle_da(_name, _do) \ 01290 \ 01291 case (do_what & _do) \ 01292 DO_PRINT: begin \ 01293 $sformat(this.__vmm_image, "%s\n%s _name[%0d]=", this.__vmm_image, this.__vmm_prefix, this._name.size()); \ 01294 for (int i = 0; i < this._name.size(); i++) begin \ 01295 $sformat(this.__vmm_image, "%s %s", this.__vmm_image, \ 01296 (this._name[i] == null) ? "null" : "<ref>"); \ 01297 if (i == 2 && this._name.size() > 5) begin \ 01298 this.__vmm_image = {this.__vmm_image, " ..."}; \ 01299 i = this._name.size() - 3; \ 01300 end \ 01301 end \ 01302 end \ 01303 DO_COPY: begin \ 01304 __vmm_rhs._name = new[this._name.size()]; \ 01305 foreach(this._name[i]) begin \ 01306 __vmm_rhs._name[i] = this._name[i]; \ 01307 end \ 01308 end \ 01309 DO_COMPARE: begin \ 01310 if (__vmm_rhs._name.size() !== this._name.size()) begin \ 01311 $sformat(this.__vmm_image, "this._name.size() (%0d) !== to._name.size() (%0d)", \ 01312 this._name.size(), __vmm_rhs._name.size()); \ 01313 this.__vmm_status = 0; \ 01314 return; \ 01315 end \ 01316 foreach (this._name[i]) begin \ 01317 if (this._name[i] != __vmm_rhs._name[i]) begin \ 01318 $sformat(this.__vmm_image, "this._name[%0d] !== to._name[%0d]", i, i); \ 01319 this.__vmm_status = 0; \ 01320 return; \ 01321 end \ 01322 end \ 01323 end \ 01324 DO_PACK: begin \ 01325 end \ 01326 DO_UNPACK: begin \ 01327 foreach (this._name[i]) begin \ 01328 this._name[i] = null; \ 01329 end \ 01330 end \ 01331 endcase 01332 01333 01334 `define vmm_data_member_handle_aa_scalar(_name, _do) \ 01335 \ 01336 case (do_what & _do) \ 01337 DO_PRINT: begin \ 01338 int _count = 0; \ 01339 $sformat(this.__vmm_image, "%s\n%s _name[%0d]=", this.__vmm_image, this.__vmm_prefix, this._name.num()); \ 01340 foreach(this._name[i]) begin \ 01341 if (_count <= 2 || _count >= this._name.num()-2) \ 01342 $sformat(this.__vmm_image, "%s %0d: %s", this.__vmm_image, i,(this._name[i] == null) ? "null" : "<ref>"); \ 01343 if (_count== 2 && this._name.num() > 5) begin \ 01344 this.__vmm_image = {this.__vmm_image, "\n..."}; \ 01345 end \ 01346 _count++; \ 01347 end \ 01348 end \ 01349 DO_COPY: begin \ 01350 __vmm_rhs._name.delete(); \ 01351 foreach(this._name[i]) begin \ 01352 __vmm_rhs._name[i] = new; \ 01353 __vmm_rhs._name[i] = this._name[i]; \ 01354 end \ 01355 end \ 01356 DO_COMPARE: begin \ 01357 if (__vmm_rhs._name.num() !== this._name.num()) begin \ 01358 $sformat(this.__vmm_image, "this._name.num() (%0d) !== to._name.num() (%0d)", \ 01359 this._name.num(), __vmm_rhs._name.num()); \ 01360 this.__vmm_status = 0; \ 01361 return; \ 01362 end \ 01363 foreach (this._name[i]) begin \ 01364 if (!__vmm_rhs._name.exists(i)) begin \ 01365 $sformat(this.__vmm_image, "this._name[%0d] exists but to._name[%0d] does not", i, i); \ 01366 this.__vmm_status = 0; \ 01367 return; \ 01368 end \ 01369 if (this._name[i] != __vmm_rhs._name[i]) begin \ 01370 $sformat(this.__vmm_image, "this._name[%0d] !== to._name[%0d]", i, i); \ 01371 this.__vmm_status = 0; \ 01372 return; \ 01373 end \ 01374 end \ 01375 end \ 01376 DO_PACK: begin \ 01377 end \ 01378 DO_UNPACK: begin \ 01379 foreach (this._name[i]) begin \ 01380 this._name[i] = null; \ 01381 end \ 01382 end \ 01383 endcase 01384 01385 01386 `define vmm_data_member_handle_aa_string(_name, _do) \ 01387 \ 01388 case (do_what & _do) \ 01389 DO_PRINT: begin \ 01390 int _count = 0; \ 01391 $sformat(this.__vmm_image, "%s\n%s _name[%0d]=", this.__vmm_image, this.__vmm_prefix, this._name.num()); \ 01392 foreach(this._name[i]) begin \ 01393 if (_count <= 2 || _count >= this._name.num()-2) \ 01394 $sformat(this.__vmm_image, "%s \"%s\": %s", this.__vmm_image, i,(this._name[i] == null) ? "null" : "<ref>"); \ 01395 if (_count== 2 && this._name.num() > 5) begin \ 01396 this.__vmm_image = {this.__vmm_image, "\n..."}; \ 01397 end \ 01398 _count++; \ 01399 end \ 01400 end \ 01401 DO_COPY: begin \ 01402 __vmm_rhs._name.delete(); \ 01403 foreach(this._name[i]) begin \ 01404 __vmm_rhs._name[i] = new; \ 01405 __vmm_rhs._name[i] = this._name[i]; \ 01406 end \ 01407 end \ 01408 DO_COMPARE: begin \ 01409 if (__vmm_rhs._name.num() !== this._name.num()) begin \ 01410 $sformat(this.__vmm_image, "this._name.num() (%0d) !== to._name.num() (%0d)", \ 01411 this._name.num(), __vmm_rhs._name.num()); \ 01412 this.__vmm_status = 0; \ 01413 return; \ 01414 end \ 01415 foreach (this._name[i]) begin \ 01416 if (!__vmm_rhs._name.exists(i)) begin \ 01417 $sformat(this.__vmm_image, "this._name[\"%s\"] exists but to._name[\"%s\"] does not", i, i); \ 01418 this.__vmm_status = 0; \ 01419 return; \ 01420 end \ 01421 if (this._name[i] != __vmm_rhs._name[i]) begin \ 01422 $sformat(this.__vmm_image, "this._name[\"%s\"] !== to._name[\"%s\"]", i, i); \ 01423 this.__vmm_status = 0; \ 01424 return; \ 01425 end \ 01426 end \ 01427 end \ 01428 DO_PACK: begin \ 01429 end \ 01430 DO_UNPACK: begin \ 01431 foreach (this._name[i]) begin \ 01432 this._name[i] = null; \ 01433 end \ 01434 end \ 01435 endcase 01436 01437 01438 `define vmm_data_member_vmm_data(_name, _do, _how) \ 01439 \ 01440 case (do_what & _do) \ 01441 DO_PRINT: begin \ 01442 if ( _name == null ) begin \ 01443 `vmm_warning(this.log, " do-print 1jvmm_data _name object does not exist, no action"); \ 01444 end \ 01445 else begin \ 01446 string _prefix = this.__vmm_prefix; \ 01447 $sformat(this.__vmm_image, "%s\n%s", this.__vmm_image, this._name.psdisplay({this.__vmm_prefix, " _name: "})); \ 01448 this.__vmm_prefix = _prefix; \ 01449 end \ 01450 end \ 01451 DO_COPY: begin \ 01452 if (_name == null) begin \ 01453 `vmm_warning(this.log, " do-copy 1vmm_data _name object does not exist, no action"); \ 01454 end \ 01455 else begin \ 01456 case (_how & HOW_TO_COPY) \ 01457 DO_REFCOPY: begin \ 01458 __vmm_rhs._name = this._name; \ 01459 end \ 01460 DO_DEEPCOPY: begin \ 01461 $cast(__vmm_rhs._name, this._name.copy()); \ 01462 end \ 01463 endcase \ 01464 end \ 01465 end \ 01466 DO_COMPARE: begin \ 01467 if (_name == null) begin \ 01468 `vmm_warning(this.log, " do-ccompare 1 vmm_data _name object does not exist, no action"); \ 01469 end \ 01470 else begin \ 01471 case (_how & HOW_TO_COMPARE) \ 01472 DO_REFCOMPARE: begin \ 01473 if (this._name != __vmm_rhs._name) begin \ 01474 $sformat(this.__vmm_image, "this._name !== to._name"); \ 01475 this.__vmm_status = 0; \ 01476 return; \ 01477 end \ 01478 end \ 01479 DO_DEEPCOMPARE: begin \ 01480 string diff; \ 01481 if (!this._name.compare(__vmm_rhs._name, diff)) begin \ 01482 $sformat(this.__vmm_image, "this._name !== to._name: %s ", diff); \ 01483 this.__vmm_status = 0; \ 01484 return; \ 01485 end \ 01486 end \ 01487 endcase \ 01488 end \ 01489 end \ 01490 DO_PACK: begin \ 01491 int count=0; \ 01492 if (_name == null) begin \ 01493 `vmm_warning(this.log, " vmm_data _name object does not exist, no action"); \ 01494 end \ 01495 else begin \ 01496 count = this._name.byte_pack(pack, this.__vmm_offset, this.__vmm_kind); \ 01497 `vmm_data_member_update_offset(this.__vmm_offset,count) \ 01498 end \ 01499 end \ 01500 DO_UNPACK: begin \ 01501 int count=0; \ 01502 this._name = new(); \ 01503 count = this._name.byte_unpack(unpack, this.__vmm_offset, this.__vmm_len, this.__vmm_kind); \ 01504 `vmm_data_member_update_offset(this.__vmm_offset,count) \ 01505 end \ 01506 endcase 01507 01508 01509 `define vmm_data_member_vmm_data_array(_name, _do, _how) \ 01510 \ 01511 case (do_what & _do) \ 01512 DO_PRINT: begin \ 01513 int size =0; \ 01514 string _prefix = this.__vmm_prefix; \ 01515 size = $size(this._name); \ 01516 for (int i = 0; i < size; i++) begin \ 01517 string pf; \ 01518 $sformat(pf, "%s _name[%0d]: ", this.__vmm_prefix, i); \ 01519 $sformat(this.__vmm_image, "%s\n%s", this.__vmm_image, this._name[i].psdisplay(pf)); \ 01520 if (i == 2 && size > 5 ) begin \ 01521 this.__vmm_image = {this.__vmm_image, "\n", _prefix, "..."}; \ 01522 i = size -3; \ 01523 end \ 01524 end \ 01525 this.__vmm_prefix = _prefix; \ 01526 end \ 01527 DO_COPY: begin \ 01528 case (_how & HOW_TO_COPY) \ 01529 DO_REFCOPY: begin \ 01530 __vmm_rhs._name = this._name; \ 01531 foreach (this._name[i]) begin \ 01532 __vmm_rhs._name[i] = this._name[i]; \ 01533 end \ 01534 end \ 01535 DO_DEEPCOPY: begin \ 01536 __vmm_rhs._name = this._name; \ 01537 foreach(this._name[i]) begin \ 01538 $cast(__vmm_rhs._name[i], this._name[i].copy()); \ 01539 end \ 01540 end \ 01541 endcase \ 01542 end \ 01543 DO_COMPARE: begin \ 01544 string diff; \ 01545 case (_how & HOW_TO_COMPARE) \ 01546 DO_REFCOMPARE: begin \ 01547 foreach (this._name[i]) begin \ 01548 if (this._name[i] != __vmm_rhs._name[i]) begin \ 01549 $sformat(this.__vmm_image, "this._name[%0d] !== to._name[%0d]", i, i); \ 01550 this.__vmm_status = 0; \ 01551 return; \ 01552 end \ 01553 end \ 01554 end \ 01555 DO_DEEPCOMPARE: begin \ 01556 foreach(this._name[i]) begin \ 01557 if (!this._name[i].compare(__vmm_rhs._name[i],diff)) begin \ 01558 $sformat(this.__vmm_image, "this._name[%0d] !== to._name[%0d]: %s", i, i, diff); \ 01559 this.__vmm_status = 0; \ 01560 return; \ 01561 end \ 01562 end \ 01563 end \ 01564 endcase \ 01565 end \ 01566 DO_PACK: begin \ 01567 int start; \ 01568 int count; \ 01569 bit [31:0] size=0; \ 01570 start = this.__vmm_offset; \ 01571 `vmm_data_member_update_offset(this.__vmm_offset,4) \ 01572 this.__vmm_maxbits = 0; \ 01573 foreach (this._name[j]) begin \ 01574 count = this._name[j].byte_pack(pack, this.__vmm_offset, this.__vmm_kind); \ 01575 `vmm_data_member_update_offset(this.__vmm_offset,count) \ 01576 size++; \ 01577 end \ 01578 `vmm_data_member_scalar_packint(pack,size,start,0) \ 01579 this.__vmm_len = this.__vmm_offset; \ 01580 end \ 01581 DO_UNPACK: begin \ 01582 int count; \ 01583 int start; \ 01584 int index; \ 01585 string stemp; \ 01586 bit [31:0] size = 0; \ 01587 start = this.__vmm_offset; \ 01588 `vmm_data_member_scalar_unpackint(unpack,size,start,0) \ 01589 `vmm_data_member_update_offset(this.__vmm_offset,4) \ 01590 this.__vmm_maxbits =0; \ 01591 for (int j=0; j < size; j++) begin \ 01592 this._name[j] = new(); \ 01593 count = this._name[j].byte_unpack(unpack, this.__vmm_offset, this.__vmm_len, this.__vmm_kind); \ 01594 `vmm_data_member_update_offset(this.__vmm_offset,count) \ 01595 end \ 01596 end \ 01597 endcase 01598 01599 01600 `define vmm_data_member_vmm_data_da(_name, _do, _how) \ 01601 \ 01602 case (do_what & _do) \ 01603 DO_PRINT: begin \ 01604 string _prefix = this.__vmm_prefix; \ 01605 for (int i = 0; i < this._name.size(); i++) begin \ 01606 string pf; \ 01607 $sformat(pf, "%s _name[%0d]: ", this.__vmm_prefix, i); \ 01608 $sformat(this.__vmm_image, "%s\n%s", this.__vmm_image, this._name[i].psdisplay(pf)); \ 01609 if (i == 2 && this._name.size() > 5) begin \ 01610 this.__vmm_image = {this.__vmm_image, "\n", _prefix, "..."}; \ 01611 i = this._name.size() - 3; \ 01612 end \ 01613 end \ 01614 this.__vmm_prefix = _prefix; \ 01615 end \ 01616 DO_COPY: begin \ 01617 case (_how & HOW_TO_COPY) \ 01618 DO_REFCOPY: begin \ 01619 __vmm_rhs._name = new [this._name.size()]; \ 01620 foreach (this._name[i]) begin \ 01621 __vmm_rhs._name[i] = this._name[i]; \ 01622 end \ 01623 end \ 01624 DO_DEEPCOPY: begin \ 01625 __vmm_rhs._name = new [this._name.size()]; \ 01626 foreach(this._name[i]) begin \ 01627 $cast(__vmm_rhs._name[i], this._name[i].copy()); \ 01628 end \ 01629 end \ 01630 endcase \ 01631 end \ 01632 DO_COMPARE: begin \ 01633 string diff; \ 01634 if (__vmm_rhs._name.size() !== this._name.size()) begin \ 01635 $sformat(this.__vmm_image, "this._name.size() (%0d) !== to._name.size() (%0d)", \ 01636 this._name.size(), __vmm_rhs._name.size()); \ 01637 this.__vmm_status = 0; \ 01638 return; \ 01639 end \ 01640 case (_how & HOW_TO_COMPARE) \ 01641 DO_REFCOMPARE: begin \ 01642 foreach (this._name[i]) begin \ 01643 if (this._name[i] != __vmm_rhs._name[i]) begin \ 01644 $sformat(this.__vmm_image, "this._name[%0d] !== to._name[%0d]", i, i); \ 01645 this.__vmm_status = 0; \ 01646 return; \ 01647 end \ 01648 end \ 01649 end \ 01650 DO_DEEPCOMPARE: begin \ 01651 foreach(this._name[i]) begin \ 01652 if (!this._name[i].compare(__vmm_rhs._name[i],diff)) begin \ 01653 $sformat(this.__vmm_image, "this._name[%0d] !== to._name[%0d]: %s", i, i, diff); \ 01654 this.__vmm_status = 0; \ 01655 return; \ 01656 end \ 01657 end \ 01658 end \ 01659 endcase \ 01660 end \ 01661 DO_PACK: begin \ 01662 int start; \ 01663 int count; \ 01664 int index; \ 01665 int element; \ 01666 string stemp; \ 01667 bit [31:0] size=0; \ 01668 start = this.__vmm_offset; \ 01669 size = this._name.size(); \ 01670 `vmm_data_member_scalar_packint(pack,size,start,0) \ 01671 `vmm_data_member_update_offset(this.__vmm_offset,4) \ 01672 this.__vmm_maxbits = 0; \ 01673 foreach (this._name[j]) begin \ 01674 count = this._name[j].byte_pack(pack, this.__vmm_offset, this.__vmm_kind); \ 01675 `vmm_data_member_update_offset(this.__vmm_offset,count) \ 01676 end \ 01677 this.__vmm_len = this.__vmm_offset; \ 01678 end \ 01679 DO_UNPACK: begin \ 01680 int count; \ 01681 int start; \ 01682 int index; \ 01683 string stemp; \ 01684 bit [31:0] size = 0; \ 01685 start = this.__vmm_offset; \ 01686 `vmm_data_member_scalar_unpackint(unpack,size,start,0) \ 01687 `vmm_data_member_update_offset(this.__vmm_offset,4) \ 01688 this.__vmm_maxbits =0; \ 01689 foreach (this._name[j]) begin \ 01690 this._name[j] = new(); \ 01691 count = this._name[j].byte_unpack(unpack, this.__vmm_offset, this.__vmm_len, this.__vmm_kind); \ 01692 `vmm_data_member_update_offset(this.__vmm_offset,count) \ 01693 end \ 01694 end \ 01695 endcase 01696 01697 `define vmm_data_member_vmm_data_aa_scalar(_name, _do, _how) \ 01698 \ 01699 case (do_what & _do) \ 01700 DO_PRINT: begin \ 01701 int _count = 0; \ 01702 string _prefix = this.__vmm_prefix; \ 01703 foreach (this._name[i]) begin \ 01704 if (_count <= 2 || _count >= this._name.num()-2) begin \ 01705 string pf; \ 01706 $sformat(pf, "%s _name[%0d]", this.__vmm_prefix, i); \ 01707 $sformat(this.__vmm_image, "%s\n%s", this.__vmm_image, this._name[i].psdisplay(pf)); \ 01708 if (_count== 2 && this._name.num() > 5) begin \ 01709 this.__vmm_image = {this.__vmm_image, "\n", _prefix, "..."}; \ 01710 end \ 01711 _count++; \ 01712 end \ 01713 end \ 01714 this.__vmm_prefix = _prefix; \ 01715 end \ 01716 DO_COPY: begin \ 01717 case (_how & HOW_TO_COPY) \ 01718 DO_REFCOPY: begin \ 01719 __vmm_rhs._name.delete(); \ 01720 foreach (this._name[i]) begin \ 01721 __vmm_rhs._name[i] = this._name[i]; \ 01722 end \ 01723 end \ 01724 DO_DEEPCOPY: begin \ 01725 __vmm_rhs._name.delete(); \ 01726 foreach(this._name[i]) begin \ 01727 $cast(__vmm_rhs._name[i], this._name[i].copy()); \ 01728 end \ 01729 end \ 01730 endcase \ 01731 end \ 01732 DO_COMPARE: begin \ 01733 string diff; \ 01734 if (__vmm_rhs._name.num() !== this._name.num()) begin \ 01735 $sformat(this.__vmm_image, "this._name.num() (%0d) !== to._name.num() (%0d)", \ 01736 this._name.num(), __vmm_rhs._name.num()); \ 01737 this.__vmm_status = 0; \ 01738 return; \ 01739 end \ 01740 case (_how & HOW_TO_COMPARE) \ 01741 DO_REFCOMPARE: begin \ 01742 __vmm_rhs._name.delete(); \ 01743 foreach (this._name[i]) begin \ 01744 if (!__vmm_rhs._name.exists(i)) begin \ 01745 $sformat(this.__vmm_image, "this._name[%0d] exists but to._name[%0d] does not", i, i); \ 01746 this.__vmm_status = 0; \ 01747 return; \ 01748 end \ 01749 if (this._name[i] != __vmm_rhs._name[i]) begin \ 01750 $sformat(this.__vmm_image, "this._name[%0d] !== to._name[%0d]", i, i); \ 01751 this.__vmm_status = 0; \ 01752 return; \ 01753 end \ 01754 end \ 01755 end \ 01756 DO_DEEPCOMPARE: begin \ 01757 __vmm_rhs._name.delete(); \ 01758 foreach(this._name[i]) begin \ 01759 if (!__vmm_rhs._name.exists(i)) begin \ 01760 $sformat(this.__vmm_image, "this._name[%0d] exists but to._name[%0d] does not", i, i); \ 01761 this.__vmm_status = 0; \ 01762 return; \ 01763 end \ 01764 if (!this._name[i].compare(__vmm_rhs._name[i], diff)) begin \ 01765 $sformat(this.__vmm_image, "this._name[%0d] !== to._name[%0d]: %s", i, i, diff); \ 01766 this.__vmm_status = 0; \ 01767 return; \ 01768 end \ 01769 end \ 01770 end \ 01771 endcase \ 01772 end \ 01773 DO_PACK: begin \ 01774 int start; \ 01775 int count; \ 01776 int index; \ 01777 string stemp; \ 01778 bit [31:0] size=0; \ 01779 start = this.__vmm_offset; \ 01780 this.__vmm_maxbits = 0; \ 01781 size = this._name.num(); \ 01782 `vmm_data_member_scalar_packint(pack,size,start,0) \ 01783 `vmm_data_member_update_offset(this.__vmm_offset,4) \ 01784 foreach (this._name[j]) begin \ 01785 this.__vmm_maxbits = 0; \ 01786 index = j; \ 01787 `vmm_data_member_scalar_packint(pack,index,this.__vmm_offset,0) \ 01788 `vmm_data_member_update_offset(this.__vmm_offset,4) \ 01789 count = this._name[j].byte_pack(pack, this.__vmm_offset, this.__vmm_kind); \ 01790 `vmm_data_member_update_offset(this.__vmm_offset,count) \ 01791 end \ 01792 this.__vmm_len = this.__vmm_offset; \ 01793 end \ 01794 DO_UNPACK: begin \ 01795 int count; \ 01796 int start; \ 01797 int index=0; \ 01798 string stemp; \ 01799 bit [31:0] size = 0; \ 01800 start = this.__vmm_offset; \ 01801 `vmm_data_member_scalar_unpackint(unpack,size,start,0) \ 01802 `vmm_data_member_update_offset(this.__vmm_offset,4) \ 01803 this.__vmm_maxbits =0; \ 01804 for (int j=0; j < size; j++) begin \ 01805 this.__vmm_maxbits =0; \ 01806 `vmm_data_member_scalar_unpackint(unpack,index,this.__vmm_offset,0) \ 01807 `vmm_data_member_update_offset(this.__vmm_offset,4) \ 01808 this._name[index] = new(); \ 01809 count = this._name[index].byte_unpack(unpack, this.__vmm_offset, this.__vmm_len, this.__vmm_kind); \ 01810 `vmm_data_member_update_offset(this.__vmm_offset,count) \ 01811 end \ 01812 end \ 01813 endcase 01814 01815 01816 `define vmm_data_member_vmm_data_aa_string(_name, _do, _how) \ 01817 \ 01818 case (do_what & _do) \ 01819 DO_PRINT: begin \ 01820 int _count = 0; \ 01821 string _prefix = this.__vmm_prefix; \ 01822 foreach (this._name[i]) begin \ 01823 if (_count <= 2 || _count >= this._name.num()-2) begin \ 01824 string pf; \ 01825 $sformat(pf, "%s _name[\"%s\"]", this.__vmm_prefix, i); \ 01826 $sformat(this.__vmm_image, "%s\n%s", this.__vmm_image, this._name[i].psdisplay(pf)); \ 01827 if (_count== 2 && this._name.num() > 5) begin \ 01828 this.__vmm_image = {this.__vmm_image, "\n", _prefix, "..."}; \ 01829 end \ 01830 _count++; \ 01831 end \ 01832 end \ 01833 this.__vmm_prefix = _prefix; \ 01834 end \ 01835 DO_COPY: begin \ 01836 case (_how & HOW_TO_COPY) \ 01837 DO_REFCOPY: begin \ 01838 this.__vmm_rhs._name.delete(); \ 01839 foreach (this._name[i]) begin \ 01840 this.__vmm_rhs._name[i] = this._name[i]; \ 01841 end \ 01842 end \ 01843 DO_DEEPCOPY: begin \ 01844 this.__vmm_rhs._name.delete(); \ 01845 foreach(this._name[i]) begin \ 01846 $cast(this.__vmm_rhs._name[i], this._name[i].copy()); \ 01847 end \ 01848 end \ 01849 endcase \ 01850 end \ 01851 DO_COMPARE: begin \ 01852 string diff; \ 01853 if (this.__vmm_rhs._name.num() !== this._name.num()) begin \ 01854 $sformat(this.__vmm_image, "this._name.num() (%0d) !== to._name.num() (%0d)", \ 01855 this._name.num(), this.__vmm_rhs._name.num()); \ 01856 this.__vmm_status = 0; \ 01857 return; \ 01858 end \ 01859 case (_how & HOW_TO_COMPARE) \ 01860 DO_REFCOMPARE: begin \ 01861 this.__vmm_rhs._name.delete(); \ 01862 foreach (this._name[i]) begin \ 01863 if (!this.__vmm_rhs._name.exists(i)) begin \ 01864 $sformat(this.__vmm_image, "this._name[\"%s\"] exists but to._name[\"%s\"] does not", i, i); \ 01865 this.__vmm_status = 0; \ 01866 return; \ 01867 end \ 01868 if (this._name[i] != this.__vmm_rhs._name[i]) begin \ 01869 $sformat(this.__vmm_image, "this._name[%0d] !== to._name[%0d]", i, i); \ 01870 this.__vmm_status = 0; \ 01871 return; \ 01872 end \ 01873 end \ 01874 end \ 01875 DO_DEEPCOMPARE: begin \ 01876 this.__vmm_rhs._name.delete(); \ 01877 foreach(this._name[i]) begin \ 01878 if (!this.__vmm_rhs._name.exists(i)) begin \ 01879 $sformat(this.__vmm_image, "this._name[\"%s\"] exists but to._name[\"%s\"] does not", i, i); \ 01880 this.__vmm_status = 0; \ 01881 return; \ 01882 end \ 01883 if (!this._name[i].compare(this.__vmm_rhs._name[i], diff)) begin \ 01884 $sformat(this.__vmm_image, "this._name[\"%s\"] !== to._name[\"%s\"]: %s", i, i, diff); \ 01885 this.__vmm_status = 0; \ 01886 return; \ 01887 end \ 01888 end \ 01889 end \ 01890 endcase \ 01891 end \ 01892 DO_PACK: begin \ 01893 int start; \ 01894 int count; \ 01895 int index; \ 01896 string sindextemp; \ 01897 int sindexcount; \ 01898 string stemp; \ 01899 bit [31:0] size=0; \ 01900 start = this.__vmm_offset; \ 01901 stemp = this._name.first(sindextemp); \ 01902 index = 0; \ 01903 size = this._name.num(); \ 01904 `vmm_data_member_scalar_packint(pack,size,start,0) \ 01905 `vmm_data_member_update_offset(this.__vmm_offset,4) \ 01906 this.__vmm_maxbits = 0; \ 01907 foreach (this._name[j]) begin \ 01908 this.__vmm_maxbits =0; \ 01909 sindextemp = j; \ 01910 sindexcount = sindextemp.len(); \ 01911 this.__vmm_maxbits = sindextemp; \ 01912 `vmm_data_member_scalar_packint(pack,sindexcount,this.__vmm_offset,0) \ 01913 `vmm_data_member_update_offset(this.__vmm_offset,4) \ 01914 `vmm_data_member_scalar_pack(pack,this.__vmm_maxbits,sindexcount,this.__vmm_offset) \ 01915 `vmm_data_member_update_offset(this.__vmm_offset,sindexcount) \ 01916 this.__vmm_maxbits =0; \ 01917 count = this._name[j].byte_pack(pack, this.__vmm_offset, this.__vmm_kind); \ 01918 `vmm_data_member_update_offset(this.__vmm_offset,count) \ 01919 end \ 01920 this.__vmm_len = this.__vmm_offset; \ 01921 end \ 01922 DO_UNPACK: begin \ 01923 int start; \ 01924 int count; \ 01925 int index; \ 01926 string sindextemp; \ 01927 int sindexcount; \ 01928 string stemp; \ 01929 bit [31:0] size=0; \ 01930 index = 0; \ 01931 start = this.__vmm_offset; \ 01932 `vmm_data_member_scalar_unpackint(unpack,size,start,0) \ 01933 `vmm_data_member_update_offset(this.__vmm_offset,4) \ 01934 this.__vmm_maxbits = 0; \ 01935 for (int j=0; j < size; j++) begin \ 01936 this.__vmm_maxbits = 0; \ 01937 `vmm_data_member_scalar_unpackint(unpack,sindexcount,this.__vmm_offset,0) \ 01938 `vmm_data_member_update_offset(this.__vmm_offset,4) \ 01939 `vmm_data_member_scalar_unpack(unpack,this.__vmm_maxbits,sindexcount,this.__vmm_offset) \ 01940 `vmm_data_member_update_offset(this.__vmm_offset,sindexcount) \ 01941 sindextemp = this.__vmm_maxbits; \ 01942 this.__vmm_maxbits = 0; \ 01943 this._name[sindextemp] = new(); \ 01944 count = this._name[sindextemp].byte_unpack(unpack, this.__vmm_offset, this.__vmm_len, this.__vmm_kind); \ 01945 `vmm_data_member_update_offset(this.__vmm_offset,count) \ 01946 end \ 01947 end \ 01948 endcase 01949 01950 01951 `define vmm_data_member_user_defined(_name) \ 01952 \ 01953 this.__vmm_status = this.do_''_name(do_what, this.__vmm_prefix, this.__vmm_image, \ 01954 this.__vmm_rhs, \ 01955 this.__vmm_kind, this.__vmm_offset, pack, unpack); \ 01956 if (__vmm_status == 0) return; 01957 01958 01959 `define vmm_data_member_end(_class) \ 01960 endfunction \ 01961 \ 01962 static vmm_log log = new("_class", "class"); \ 01963 \ 01964 function new(vmm_log log = null); \ 01965 super.new((log == null) ? this.log : log); \ 01966 endfunction \ 01967 \ 01968 virtual function vmm_data allocate(); \ 01969 _class i = new; \ 01970 return i; \ 01971 endfunction \ 01972 \ 01973 virtual function bit is_valid(bit silent = 1, \ 01974 int kind = -1); \ 01975 return 1; \ 01976 endfunction \ 01977 \ 01978 virtual function string psdisplay(string prefix = ""); \ 01979 $sformat(this.__vmm_image, "%s(``_class (%0d.%0d.%0d)):", prefix, \ 01980 this.stream_id, this.scenario_id, this.data_id); \ 01981 this.__vmm_done_user = 1; \ 01982 psdisplay = this.do_psdisplay(prefix); \ 01983 if (this.__vmm_done_user) return psdisplay; \ 01984 \ 01985 this.__vmm_prefix = prefix; \ 01986 this.do_all(DO_PRINT, __vmm_bytes, __vmm_bytes); \ 01987 return this.__vmm_image; \ 01988 endfunction \ 01989 \ 01990 virtual function vmm_data copy(vmm_data to = null); \ 01991 _class cpy; \ 01992 \ 01993 this.__vmm_done_user = 1; \ 01994 copy = this.do_copy(to); \ 01995 if (this.__vmm_done_user) return copy; \ 01996 \ 01997 if (to == null) cpy = new; \ 01998 else if (!$cast(cpy, to)) begin \ 01999 `vmm_fatal(this.log, "Cannot copy to non-_class instance"); \ 02000 return null; \ 02001 end \ 02002 \ 02003 super.copy_data(cpy); \ 02004 this.__vmm_rhs = cpy; \ 02005 this.do_all(DO_COPY, __vmm_bytes, __vmm_bytes); \ 02006 \ 02007 return cpy; \ 02008 endfunction \ 02009 \ 02010 virtual function bit compare( vmm_data to, \ 02011 output string diff, \ 02012 input int kind = -1); \ 02013 _class cp; \ 02014 \ 02015 this.__vmm_done_user = 1; \ 02016 compare = this.do_compare(to, diff, kind); \ 02017 if (this.__vmm_done_user) return compare; \ 02018 \ 02019 if (!$cast(cp, to)) begin \ 02020 `vmm_fatal(this.log, "Cannot compare to non-_class instance"); \ 02021 return 0; \ 02022 end \ 02023 \ 02024 this.__vmm_rhs = cp; \ 02025 this.__vmm_kind = kind; \ 02026 this.do_all(DO_COMPARE, __vmm_bytes, __vmm_bytes); \ 02027 diff = this.__vmm_image; \ 02028 \ 02029 return this.__vmm_status; \ 02030 endfunction \ 02031 \ 02032 virtual function int unsigned byte_pack(ref logic [7:0] bytes[], \ 02033 input int unsigned offset = 0, \ 02034 input int kind = -1); \ 02035 this.__vmm_done_user = 1; \ 02036 byte_pack = this.do_byte_pack(bytes, offset, kind); \ 02037 if (this.__vmm_done_user) return byte_pack; \ 02038 \ 02039 this.__vmm_offset = offset; \ 02040 this.__vmm_kind = kind; \ 02041 this.do_all(DO_PACK, bytes, __vmm_bytes); \ 02042 \ 02043 return this.__vmm_offset - offset; \ 02044 endfunction \ 02045 \ 02046 virtual function int unsigned byte_unpack(const ref logic [7:0] bytes[], \ 02047 input int unsigned offset = 0, \ 02048 input int len = -1, \ 02049 input int kind = -1); \ 02050 this.__vmm_done_user = 1; \ 02051 byte_unpack = this.do_byte_unpack(bytes, offset, len, kind); \ 02052 if (this.__vmm_done_user) return byte_unpack; \ 02053 \ 02054 this.__vmm_offset = offset; \ 02055 this.__vmm_kind = kind; \ 02056 this.do_all(DO_UNPACK, __vmm_bytes, bytes); \ 02057 \ 02058 return this.__vmm_offset - offset; \ 02059 endfunction 02060 02061 02062 `define vmm_data_byte_size(_max, _n) \ 02063 virtual function int unsigned byte_size(int kind = -1); \ 02064 this.__vmm_done_user = 1; \ 02065 byte_size = this.do_byte_size(kind); \ 02066 if (this.__vmm_done_user) return byte_size; \ 02067 \ 02068 return _n; \ 02069 endfunction: byte_size \ 02070 \ 02071 virtual function int unsigned max_byte_size(int kind = -1); \ 02072 this.__vmm_done_user = 1; \ 02073 max_byte_size = this.do_max_byte_size(kind); \ 02074 if (this.__vmm_done_user) return max_byte_size; \ 02075 \ 02076 return _max; \ 02077 endfunction 02078