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;
我能够在EDA Playground上使用最少的代码示例重现您的 VCS 编译错误。然而,其他 3 个模拟器不会产生编译错误。
我不明白错误消息。该代码在块中使用
wait
内部调用,这对我来说似乎是一个过程上下文。task
initial
我还尝试了我拥有的更新版本的 VCS,但遇到了同样的错误。您可以联系 Synopsys 寻求帮助。
这是我使用的代码: