系统verilog UVM:参数化测试类的非过程上下文中包含动态数据的结构

问题描述 投票:0回答:1

SV/UVM 中的以下代码会产生 VCS 编译错误,如代码后所示。

 typedef enum int {
  ABC,
  DEF,
  GHI,
 . . .
 } enum_t

class some_test #(type T=uvm_test) extends T;
 
 `uvm_component_param_utils(some_test#(T))

 bit assoc_array[3][enum_t];


 //bunch of tasks and functions here

 
 task run_phase(uvm_phase phase);
   int index;
  
  //Below wait inside some fork-join and begin-end blocks
  //index calculated
  assoc_array[index].delete(); //Compiler OK here
  assoc_array[index][DEF] = 1; //Compiler OK here
 
  //some more forked threads

  wait(assoc_array[index].exists(ABC) && (assoc_array[index][ABC]==1)); //COMPILER ERROR
 endtask

endclass

错误是:

Error-[DTINPCIL] Dynamic type in non-procedural context
"wait ((this.assoc_array[index].exists(ABC) && (this.assoc_array[index][ABC] == 1))) ;"
  Argument: this.assoc_array[index]
  Structure containing dynamic data and/or used in dynamic arrays may not be 
  used in non-procedural context.

我不明白为什么这是非程序上下文。这与测试是参数化测试有什么关系吗?我正在做这样的“扩展”来实现多重继承。我在 Tudor Timi 的一篇博客中看到了这一点,标题为“Fake it Until you make it - Emulate multiple Heritage in System Verilog”,尽管他的示例实现了其他目标,并且绝对没有进行参数化测试。

其他信息:

在其他一些测试包中,我也有这段代码:

typedef some_test #(some_basic_test) better_test;
system-verilog uvm
1个回答
0
投票

你需要更改等待语句来执行...while.

   do
   begin
     //debug print/function/timeout
   end
   while(assoc_array[index].exists(ABC) && (assoc_array[index][ABC]==1));
© www.soinside.com 2019 - 2024. All rights reserved.