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;
你需要更改等待语句来执行...while.
do
begin
//debug print/function/timeout
end
while(assoc_array[index].exists(ABC) && (assoc_array[index][ABC]==1));