我一直在阅读UVM: illegal combination of driver and procedural assignment warning并附上回答的论文。 (请考虑在提到的问题中链接的文件)
然而,实现驱动器以驱动接口信号上的复位值而不是时钟块信号,时钟不能保证在复位时运行。
那么如果接口信号被声明为电线,我该如何处理这种情况。
例如 考虑链接问题中的代码。一般情况是
@(vif.cb);
vif.cb.opcode <= value;
即使操作码在接口中声明为net,这也是正确的,因为时钟块将负责正确的分配。但我不能说
@(vif.rst);
vif.cb.opcode <= init_value;
因为我不能保证复位时钟。为了适应这一点,我将不得不改变时钟生成策略。
我也不能说
vif.opcode <= init_value;
使其非法使用网络类型信号的程序性分配
另一种方法是通过复位来控制声明为net的信号,但我认为我必须在接口中声明临时信号。任何人都可以详细说明如何在重置时实现驾驶网络?
答案 0 :(得分:2)
虽然从程序代码中分配网络是非法的,但强制将值赋予它们是合法的。您可以执行以下操作:
@(negedge vif.rst);
force vif.opcode = 0;
奖励:IMO你不应该将opcode
定义为电汇。程序性和持续性驾驶员警告的非法组合是错误的。 SV 2012标准明确指出 14.16.2驱动时钟输出信号:
可以使用程序分配来分配与输出clockvar相关联的信号。什么时候 相关信号是一个变量,程序赋值为变量分配一个新值,并且 变量应保持该值,直到发生另一个赋值(从驱动器到时钟块输出) 或其他程序性任务)。