OpenCores
URL https://opencores.org/ocsvn/uart2bus_testbench/uart2bus_testbench/trunk

Subversion Repositories uart2bus_testbench

[/] [uart2bus_testbench/] [trunk/] [tb/] [uvm_src/] [dpi/] [uvm_hdl_inca.c] - Blame information for rev 16

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 16 HanySalah
//----------------------------------------------------------------------
2
//   Copyright 2007-2013 Cadence Design Systems, Inc.
3
//   Copyright 2009-2010 Mentor Graphics Corporation
4
//   Copyright 2010-2011 Synopsys, Inc.
5
//   All Rights Reserved Worldwide
6
//
7
//   Licensed under the Apache License, Version 2.0 (the
8
//   "License"); you may not use this file except in
9
//   compliance with the License.  You may obtain a copy of
10
//   the License at
11
//
12
//       http://www.apache.org/licenses/LICENSE-2.0
13
//
14
//   Unless required by applicable law or agreed to in
15
//   writing, software distributed under the License is
16
//   distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
17
//   CONDITIONS OF ANY KIND, either express or implied.  See
18
//   the License for the specific language governing
19
//   permissions and limitations under the License.
20
//----------------------------------------------------------------------
21
 
22
// use -DINCA_EXTENDED_PARTSEL_SUPPORT to use extended support for vpi_handle_by_name
23
 
24
#include "vhpi_user.h"
25
#include "vpi_user.h"
26
#include "veriuser.h"
27
#include "svdpi.h"
28
#include <malloc.h>
29
#include <string.h>
30
#include <stdio.h>
31
 
32
static void m_uvm_error(const char *ID, const char *msg, ...);
33
static int uvm_hdl_set_vlog(char *path, p_vpi_vecval value, PLI_INT32 flag);
34
static void m_uvm_get_object_handle(const char* path, vhpiHandleT *handle,int *language);
35
static int uvm_hdl_get_vlog(char *path, p_vpi_vecval value, PLI_INT32 flag);
36
static int uvm_hdl_max_width();
37
 
38
// static print buffer
39
static char m_uvm_temp_print_buffer[1024];
40
 
41
/*
42
 * UVM HDL access C code.
43
 *
44
 */
45
static void m_uvm_get_object_handle(const char* path, vhpiHandleT *handle,int *language)
46
{
47
  *handle = vhpi_handle_by_name(path, 0);
48
 
49
  if(*handle)
50
          *language = vhpi_get(vhpiLanguageP, *handle);
51
}
52
 
53
// returns 0 if the name is NOT a slice
54
// returns 1 if the name is a slice
55
static int is_valid_path_slice(const char* path) {
56
          char *path_ptr = (char *) path;
57
          int path_len;
58
 
59
#ifdef INCA_EXTENDED_PARTSEL_SUPPORT
60
          return 0;
61
#endif
62
 
63
          path_len = strlen(path);
64
          path_ptr = (char*)(path+path_len-1);
65
 
66
          if (*path_ptr != ']')
67
            return 0;
68
 
69
          while(path_ptr != path && *path_ptr != ':' && *path_ptr != '[')
70
            path_ptr--;
71
 
72
          if (path_ptr == path || *path_ptr != ':')
73
            return 0;
74
 
75
          while(path_ptr != path && *path_ptr != '[')
76
            path_ptr--;
77
 
78
          if (path_ptr == path || *path_ptr != '[')
79
            return 0;
80
 
81
          return 1;
82
}
83
 
84
static int uvm_hdl_set_vlog_partsel(char *path, p_vpi_vecval value, PLI_INT32 flag)
85
{
86
  char *path_ptr = path;
87
  int path_len;
88
  svLogicVecVal bit_value;
89
 
90
  if(!is_valid_path_slice(path)) return 0;
91
  path_len = strlen(path);
92
  path_ptr = (char*)(path+path_len-1);
93
 
94
  if (*path_ptr != ']')
95
    return 0;
96
 
97
  while(path_ptr != path && *path_ptr != ':' && *path_ptr != '[')
98
    path_ptr--;
99
 
100
  if (path_ptr == path || *path_ptr != ':')
101
    return 0;
102
 
103
  while(path_ptr != path && *path_ptr != '[')
104
    path_ptr--;
105
 
106
  if (path_ptr == path || *path_ptr != '[')
107
    return 0;
108
 
109
  int lhs, rhs, width, incr;
110
 
111
  // extract range from path
112
  if (sscanf(path_ptr,"[%u:%u]",&lhs, &rhs)) {
113
    char index_str[20];
114
    int i;
115
    path_ptr++;
116
    path_len = (path_len - (path_ptr - path));
117
    incr = (lhs>rhs) ? 1 : -1;
118
    width = (lhs>rhs) ? lhs-rhs+1 : rhs-lhs+1;
119
 
120
    // perform set for each individual bit
121
    for (i=0; i < width; i++) {
122
      sprintf(index_str,"%u]",rhs);
123
      strncpy(path_ptr,index_str,path_len);
124
      svGetPartselLogic(&bit_value,value,i,1);
125
      rhs += incr;
126
      if (uvm_hdl_set_vlog_partsel(path,&bit_value,flag)==0) {
127
          if(uvm_hdl_set_vlog(path,&bit_value,flag)==0) { return 0; };
128
      }
129
    }
130
    return 1;
131
  }
132
  return 0;
133
}
134
 
135
 
136
/*
137
 * Given a path with part-select, break into individual bit accesses
138
 * path = pointer to user string
139
 * value = pointer to logic vector
140
 * flag = deposit vs force/release options, etc
141
 */
142
static int uvm_hdl_get_vlog_partsel(char *path, p_vpi_vecval value, PLI_INT32 flag)
143
{
144
  char *path_ptr = path;
145
  int path_len;
146
  svLogicVecVal bit_value;
147
 
148
  path_len = strlen(path);
149
  path_ptr = (char*)(path+path_len-1);
150
 
151
  if (*path_ptr != ']')
152
    return 0;
153
 
154
  while(path_ptr != path && *path_ptr != ':' && *path_ptr != '[')
155
    path_ptr--;
156
 
157
  if (path_ptr == path || *path_ptr != ':')
158
    return 0;
159
 
160
  while(path_ptr != path && *path_ptr != '[')
161
    path_ptr--;
162
 
163
  if (path_ptr == path || *path_ptr != '[')
164
    return 0;
165
 
166
  int lhs, rhs, width, incr;
167
 
168
  // extract range from path
169
  if (sscanf(path_ptr,"[%u:%u]",&lhs, &rhs)) {
170
    char index_str[20];
171
    int i;
172
    path_ptr++;
173
    path_len = (path_len - (path_ptr - path));
174
    incr = (lhs>rhs) ? 1 : -1;
175
    width = (lhs>rhs) ? lhs-rhs+1 : rhs-lhs+1;
176
    bit_value.aval = 0;
177
    bit_value.bval = 0;
178
    for (i=0; i < width; i++) {
179
      svLogic logic_bit;
180
      sprintf(index_str,"%u]",rhs);
181
      strncpy(path_ptr,index_str,path_len);
182
 
183
      if(uvm_hdl_get_vlog_partsel(path,&bit_value,flag) == 0) {
184
          if(uvm_hdl_get_vlog(path,&bit_value,flag)==0) { return 0; }
185
      }
186
 
187
      logic_bit = svGetBitselLogic(&bit_value,0);
188
      svPutPartselLogic(value,bit_value,i,1);
189
      rhs += incr;
190
    }
191
    return 1;
192
  } else {
193
          return 0;
194
  }
195
}
196
 
197
static void clear_value(p_vpi_vecval value) {
198
    int chunks;
199
    int maxsize = uvm_hdl_max_width();
200
    chunks = (maxsize-1)/32 + 1;
201
    for(int i=0;i<chunks-1; ++i) {
202
      value[i].aval = 0;
203
      value[i].bval = 0;
204
    }
205
}
206
 
207
/*
208
 * This C code checks to see if there is PLI handle
209
 * with a value set to define the maximum bit width.
210
 *
211
 * This function should only get called once or twice,
212
 * its return value is cached in the caller.
213
 *
214
 */
215
static int UVM_HDL_MAX_WIDTH = 0;
216
static int uvm_hdl_max_width()
217
{
218
  if(!UVM_HDL_MAX_WIDTH) {
219
    vpiHandle ms;
220
    s_vpi_value value_s = { vpiIntVal, { 0 } };
221
    ms = vpi_handle_by_name((PLI_BYTE8*) "uvm_pkg::UVM_HDL_MAX_WIDTH", 0);
222
    vpi_get_value(ms, &value_s);
223
    UVM_HDL_MAX_WIDTH= value_s.value.integer;
224
  }
225
  return UVM_HDL_MAX_WIDTH;
226
}
227
 
228
 
229
/*
230
 * Given a path, look the path name up using the PLI,
231
 * and set it to 'value'.
232
 */
233
static int uvm_hdl_set_vlog(char *path, p_vpi_vecval value, PLI_INT32 flag)
234
{
235
  static int maxsize = -1;
236
  vpiHandle r;
237
  s_vpi_value value_s = { vpiIntVal, { 0 } };
238
  s_vpi_time  time_s = { vpiSimTime, 0, 0, 0.0 };
239
 
240
  r = vpi_handle_by_name(path, 0);
241
 
242
  if(r == 0)
243
    {
244
      m_uvm_error("UVM/DPI/HDL_SET","set: unable to locate hdl path (%s)\n Either the name is incorrect, or you may not have PLI/ACC visibility to that name",
245
              path);
246
      return 0;
247
    }
248
  else
249
    {
250
      if(maxsize == -1)
251
        maxsize = uvm_hdl_max_width();
252
 
253
      if (flag == vpiReleaseFlag) {
254
        // FIXME
255
        //size = vpi_get(vpiSize, r);
256
        //value_p = (p_vpi_vecval)(malloc(((size-1)/32+1)*8*sizeof(s_vpi_vecval)));
257
        //value = &value_p;
258
      }
259
      value_s.format = vpiVectorVal;
260
      value_s.value.vector = value;
261
      vpi_put_value(r, &value_s, &time_s, flag);
262
      //if (value_p != NULL)
263
      //  free(value_p);
264
      if (value == NULL) {
265
        value = value_s.value.vector;
266
      }
267
    }
268
 
269
  vpi_release_handle(r);
270
 
271
  return 1;
272
}
273
 
274
static vhpiEnumT vhpiEnumTLookup[4] = {vhpi0,vhpi1,vhpiZ,vhpiX}; // idx={b[0],a[0]}
275
static vhpiEnumT vhpi2val(int aval,int bval) {
276
  int idx=(((bval<<1) || (aval&1)) && 3);
277
  return vhpiEnumTLookup[idx];
278
}
279
 
280
static int uvm_hdl_set_vhdl(char* path, p_vpi_vecval value, PLI_INT32 flag)
281
{
282
  static int maxsize = -1;
283
  int size, chunks, bit, i, j, aval, bval;
284
  vhpiValueT value_s;
285
  vhpiHandleT r = vhpi_handle_by_name(path, 0);
286
 
287
  if(maxsize == -1) maxsize = uvm_hdl_max_width();
288
  if(maxsize == -1) maxsize = 1024;
289
 
290
  size = vhpi_get(vhpiSizeP, r);
291
  if(size > maxsize)
292
    {
293
      m_uvm_error("UVM/DPI/VHDL_SET","hdl path %s is %0d bits, but the current maximum size is %0d. You may redefine it using the compile-time flag: -define UVM_HDL_MAX_WIDTH=<value>", path, size,maxsize);
294
 
295
      tf_dofinish();
296
    }
297
  chunks = (size-1)/32 + 1;
298
 
299
  value_s.format = vhpiObjTypeVal;
300
  value_s.bufSize = 0;
301
  value_s.value.str = NULL;
302
 
303
  vhpi_get_value(r, &value_s);
304
 
305
  switch(value_s.format)
306
    {
307
    case vhpiEnumVal:
308
      {
309
        value_s.value.enumv = vhpi2val(value[0].aval,value[0].bval);
310
        break;
311
      }
312
    case vhpiEnumVecVal:
313
      {
314
        value_s.bufSize = size*sizeof(int);
315
        value_s.value.enumvs = (vhpiEnumT *)malloc(size*sizeof(int));
316
 
317
        vhpi_get_value(r, &value_s);
318
        chunks = (size-1)/32 + 1;
319
 
320
        bit = 0;
321
        for(i=0;i<chunks && bit<size; ++i)
322
          {
323
            aval = value[i].aval;
324
            bval = value[i].bval;
325
 
326
            for(j=0;j<32 && bit<size; ++j)
327
              {
328
                value_s.value.enumvs[size-bit-1]= vhpi2val(aval,bval);
329
                aval>>=1; bval>>=1;
330
                bit++;
331
              }
332
          }
333
        break;
334
      }
335
    default:
336
      {
337
        m_uvm_error("UVM/DPI/VHDL_SET","Failed to set value to hdl path %s (unexpected type: %0d)", path, value_s.format);
338
        tf_dofinish();
339
        return 0;
340
      }
341
    }
342
 
343
  vhpi_put_value(r, &value_s, flag);
344
 
345
  if(value_s.format == vhpiEnumVecVal)
346
    {
347
      free(value_s.value.enumvs);
348
    }
349
  return 1;
350
}
351
 
352
/*
353
 * Given a path, look the path name up using the PLI
354
 * and return its 'value'.
355
 */
356
static int uvm_hdl_get_vlog(char *path, p_vpi_vecval value, PLI_INT32 flag)
357
{
358
  static int maxsize = -1;
359
  int i, size, chunks;
360
  vpiHandle r;
361
  s_vpi_value value_s;
362
 
363
  r = vpi_handle_by_name(path, 0);
364
 
365
  if(r == 0)
366
    {
367
      m_uvm_error("UVM/DPI/VLOG_GET","unable to locate hdl path (%s)\n Either the name is incorrect, or you may not have PLI/ACC visibility to that name",path);
368
      // Exiting is too harsh. Just return instead.
369
      // tf_dofinish();
370
      return 0;
371
    }
372
  else
373
    {
374
      if(maxsize == -1)
375
        maxsize = uvm_hdl_max_width();
376
 
377
      size = vpi_get(vpiSize, r);
378
      if(size > maxsize)
379
        {
380
          m_uvm_error("UVM/DPI/VLOG_GET","hdl path '%s' is %0d bits, but the maximum size is %0d.  You can increase the maximum via a compile-time flag: +define+UVM_HDL_MAX_WIDTH=<value>",
381
                  path,size,maxsize);
382
          //tf_dofinish();
383
 
384
          vpi_release_handle(r);
385
 
386
          return 0;
387
        }
388
      chunks = (size-1)/32 + 1;
389
 
390
      value_s.format = vpiVectorVal;
391
      vpi_get_value(r, &value_s);
392
      /*dpi and vpi are reversed*/
393
      for(i=0;i<chunks; ++i)
394
        {
395
          value[i].aval = value_s.value.vector[i].aval;
396
          value[i].bval = value_s.value.vector[i].bval;
397
        }
398
    }
399
  //vpi_printf("uvm_hdl_get_vlog(%s,%0x)\n",path,value[0].aval);
400
 
401
  vpi_release_handle(r);
402
 
403
  return 1;
404
}
405
 
406
static int uvm_hdl_get_vhdl(char* path, p_vpi_vecval value)
407
{
408
  static int maxsize = -1;
409
  int i, j, size, chunks, bit, aval, bval, rtn;
410
  vhpiValueT value_s;
411
  vhpiHandleT r = vhpi_handle_by_name(path, 0);
412
 
413
  if(maxsize == -1) maxsize = uvm_hdl_max_width();
414
  if(maxsize == -1) maxsize = 1024;
415
 
416
  size = vhpi_get(vhpiSizeP, r);
417
  if(size > maxsize)
418
    {
419
          m_uvm_error("UVM/DPI/HDL_SET","hdl path %s is %0d bits, but the maximum size is %0d, redefine using -define UVM_HDL_MAX_WIDTH=<value>", path, size,maxsize);
420
      tf_dofinish();
421
    }
422
  chunks = (size-1)/32 + 1;
423
  value_s.format = vhpiObjTypeVal;
424
  value_s.bufSize = 0;
425
  value_s.value.str = NULL;
426
 
427
  rtn = vhpi_get_value(r, &value_s);
428
 
429
  if(vhpi_check_error(0) != 0)
430
    {
431
          m_uvm_error("UVM/DPI/VHDL_GET","Failed to get value from hdl path %s",path);
432
      tf_dofinish();
433
      return 0;
434
    }
435
 
436
  switch (value_s.format)
437
    {
438
    case vhpiIntVal:
439
      {
440
        value[0].aval = value_s.value.intg;
441
        value[0].bval = 0;
442
        break;
443
      }
444
    case vhpiEnumVal:
445
      {
446
        switch(value_s.value.enumv)
447
          {
448
          case vhpiU:
449
          case vhpiW:
450
          case vhpiX:
451
            {
452
              value[0].aval = 1; value[0].bval = 1; break;
453
            }
454
          case vhpiZ:
455
            {
456
              value[0].aval = 0; value[0].bval = 1; break;
457
            }
458
          case vhpi0:
459
          case vhpiL:
460
          case vhpiDontCare:
461
            {
462
              value[0].aval = 0; value[0].bval = 0; break;
463
            }
464
          case vhpi1:
465
          case vhpiH:
466
            {
467
              value[0].aval = 1; value[0].bval = 0; break;
468
            }
469
          }
470
        break;
471
      }
472
    case vhpiEnumVecVal:
473
      {
474
        value_s.bufSize = size;
475
        value_s.value.str = (char*)malloc(size);
476
        rtn = vhpi_get_value(r, &value_s);
477
        if (rtn > 0) {
478
          value_s.value.str = (char*)realloc(value_s.value.str, rtn);
479
          value_s.bufSize = rtn;
480
          vhpi_get_value(r, &value_s);
481
        }
482
        for(i=0; i<((maxsize-1)/32+1); ++i)
483
          {
484
            value[i].aval = 0;
485
            value[i].bval = 0;
486
          }
487
        bit = 0;
488
        for(i=0;i<chunks && bit<size; ++i)
489
          {
490
            aval = 0;
491
            bval = 0;
492
            for(j=0;(j<32) && (bit<size); ++j)
493
              {
494
                aval<<=1; bval<<=1;
495
                switch(value_s.value.enumvs[bit])
496
                  {
497
                  case vhpiU:
498
                  case vhpiW:
499
                  case vhpiX:
500
                    {
501
                      aval |= 1;
502
                      bval |= 1;
503
                      break;
504
                    }
505
                  case vhpiZ:
506
                    {
507
                      bval |= 1;
508
                      break;
509
                    }
510
                  case vhpi0:
511
                  case vhpiL:
512
                  case vhpiDontCare:
513
                    {
514
                      break;
515
                    }
516
                  case vhpi1:
517
                  case vhpiH:
518
                    {
519
                      aval |= 1;
520
                      break;
521
                    }
522
                  }
523
                bit++;
524
              }
525
            value[i].aval = aval;
526
            value[i].bval = bval;
527
            free (value_s.value.str);
528
          }
529
        break;
530
      }
531
    default:
532
      {
533
          m_uvm_error("UVM/DPI/VHDL_GET","Failed to get value from hdl path %s (unexpected type: %0d)", path, value_s.format);
534
 
535
        tf_dofinish();
536
        return 0;
537
      }
538
    }
539
  return 1;
540
}
541
 
542
/*
543
 * Given a path, look the path name up using the PLI,
544
 * but don't set or get. Just check.
545
 *
546
 * Return 0 if NOT found.
547
 * Return 1 if found.
548
 */
549
int uvm_hdl_check_path(char *path)
550
{
551
  vhpiHandleT handle;
552
  int language;
553
 
554
  m_uvm_get_object_handle(path,&handle,&language);
555
 
556
  return (handle!=0);
557
}
558
 
559
static void m_uvm_error(const char *id, const char *msg, ...) {
560
                va_list argptr;
561
                va_start(argptr,msg);
562
                vsprintf(m_uvm_temp_print_buffer,msg, argptr);
563
                va_end(argptr);
564
            m_uvm_report_dpi(M_UVM_ERROR,
565
                         (char *) id,
566
                         &m_uvm_temp_print_buffer[0],
567
                         M_UVM_NONE,
568
                         (char*) __FILE__,
569
                         __LINE__);
570
}
571
/*
572
 * Given a path, look the path name up using the PLI
573
 * or the FLI, and return its 'value'.
574
 */
575
int uvm_hdl_read(char *path, p_vpi_vecval value)
576
{
577
                vhpiHandleT handle;
578
                int language;
579
 
580
                if(is_valid_path_slice(path)) {
581
                        clear_value(value);
582
                        return uvm_hdl_get_vlog_partsel(path, value, vpiNoDelay);
583
                }
584
 
585
                m_uvm_get_object_handle(path,&handle,&language);
586
                switch(language) {
587
                        case vhpiVerilog:  return uvm_hdl_get_vlog(path, value, vpiNoDelay);
588
                        case vhpiVHDL: return uvm_hdl_get_vhdl(path, value);
589
                        default:m_uvm_error("UVM/DPI/NOBJ1","name %s cannot be resolved to a hdl object (vlog,vhdl,vlog-slice)",path); return 0;
590
                }
591
}
592
 
593
/*
594
 * Given a path, look the path name up using the PLI
595
 * or the FLI, and set it to 'value'.
596
 */
597
int uvm_hdl_deposit(char *path, p_vpi_vecval value)
598
{
599
        vhpiHandleT handle;
600
        int language;
601
 
602
        if(is_valid_path_slice(path))
603
                return uvm_hdl_set_vlog_partsel(path, value, vpiNoDelay);
604
 
605
        m_uvm_get_object_handle(path,&handle,&language);
606
        switch(language) {
607
                case vhpiVerilog:  return uvm_hdl_set_vlog(path, value, vpiNoDelay);
608
                case vhpiVHDL: return uvm_hdl_set_vhdl(path, value, vhpiDepositPropagate);
609
                default:m_uvm_error("UVM/DPI/NOBJ2","name %s cannot be resolved to a hdl object (vlog,vhdl,vlog-slice)",path); return 0;
610
        }
611
}
612
 
613
 
614
/*
615
 * Given a path, look the path name up using the PLI
616
 * or the FLI, and set it to 'value'.
617
 */
618
int uvm_hdl_force(char *path, p_vpi_vecval value)
619
{
620
        vhpiHandleT handle;
621
        int language;
622
 
623
        if(is_valid_path_slice(path))
624
                return uvm_hdl_set_vlog_partsel(path, value, vpiForceFlag);
625
 
626
        m_uvm_get_object_handle(path,&handle,&language);
627
        switch(language) {
628
                case vhpiVerilog:  return uvm_hdl_set_vlog(path, value, vpiForceFlag);
629
                case vhpiVHDL: return uvm_hdl_set_vhdl(path, value, vhpiForcePropagate);
630
                default:m_uvm_error("UVM/DPI/NOBJ3","name %s cannot be resolved to a hdl object (vlog,vhdl,vlog-slice)",path); return 0;
631
        }
632
}
633
 
634
 
635
/*
636
 * Given a path, look the path name up using the PLI
637
 * or the FLI, and release it.
638
 */
639
int uvm_hdl_release_and_read(char *path, p_vpi_vecval value)
640
{
641
        vhpiHandleT handle;
642
        int language;
643
 
644
        if(is_valid_path_slice(path)) {
645
                uvm_hdl_set_vlog_partsel(path, value, vpiReleaseFlag);
646
                clear_value(value);
647
                return uvm_hdl_get_vlog_partsel(path, value, vpiNoDelay);
648
        }
649
 
650
        m_uvm_get_object_handle(path,&handle,&language);
651
        switch(language) {
652
                case vhpiVerilog:      uvm_hdl_set_vlog(path, value, vpiReleaseFlag); return uvm_hdl_get_vlog(path, value, vpiNoDelay);
653
                case vhpiVHDL:    uvm_hdl_set_vhdl(path, value, vhpiReleaseKV); return uvm_hdl_get_vhdl(path, value);
654
                default:m_uvm_error("UVM/DPI/NOBJ4","name %s cannot be resolved to a hdl object (vlog,vhdl,vlog-slice)",path); return 0;
655
        }
656
}
657
 
658
/*
659
 * Given a path, look the path name up using the PLI
660
 * or the FLI, and release it.
661
 */
662
int uvm_hdl_release(char *path)
663
{
664
        s_vpi_vecval value;
665
        vhpiHandleT handle;
666
        int language;
667
 
668
        if(is_valid_path_slice(path))
669
                return uvm_hdl_set_vlog_partsel(path, &value, vpiReleaseFlag);
670
 
671
        m_uvm_get_object_handle(path,&handle,&language);
672
        switch(language) {
673
                case vhpiVerilog:  return uvm_hdl_set_vlog(path, &value, vpiReleaseFlag);
674
                case vhpiVHDL: return uvm_hdl_set_vhdl(path, &value, vhpiReleaseKV);
675
                default:m_uvm_error("UVM/DPI/NOBJ5","name %s cannot be resolved to a hdl object (vlog,vhdl,vlog-slice)",path); return 0;
676
        }
677
}

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.