如何在复位时初始化时钟模块信号

时间:2015-01-03 19:48:43

标签: system-verilog uvm

我一直在阅读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的信号,但我认为我必须在接口中声明临时信号。任何人都可以详细说明如何在重置时实现驾驶网络?

1 个答案:

答案 0 :(得分:2)

虽然从程序代码中分配网络是非法的,但强制将值赋予它们是合法的。您可以执行以下操作:

@(negedge vif.rst);
force vif.opcode = 0;

奖励:IMO你不应该将opcode定义为电汇。程序性和持续性驾驶员警告的非法组合是错误的。 SV 2012标准明确指出 14.16.2驱动时钟输出信号

  

可以使用程序分配来分配与输出clockvar相关联的信号。什么时候   相关信号是一个变量,程序赋值为变量分配一个新值,并且   变量应保持该值,直到发生另一个赋值(从驱动器到时钟块输出)   或其他程序性任务)。