【问题标题】:How to initialize clocking block signals at reset如何在复位时初始化时钟块信号
【发布时间】:2015-01-03 19:48:43
【问题描述】:

我一直在阅读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,但我认为为此我必须在接口中声明临时信号。谁能详细说明如何在重置时实现驱动网?

【问题讨论】:

  • 恐怕你必须在这里更具体一些。显示导致您出现问题的代码。
  • 我希望现在问题能正确阐述,让我知道是否应该添加更多细节,谢谢

标签: system-verilog uvm


【解决方案1】:

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

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

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

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

【讨论】:

  • 所以我们基本上在等待更新和适应 SV 2012 标准的工具。现在,我将相应地在接口网络上使用力,并尝试使用逻辑信号创建另一个分支,以便我们拥有正确的功能。谢谢
  • @wisemonkey 实际上,我用logic 进行了尝试,它在没有警告的情况下工作。您链接的问题中的警告一定来自其他地方(设置与具有时钟块和连续分配的设置不完全相同)。
  • @wisemonkey 但是 w.r.t.等待容纳标准,这是真的。我认为没有任何工具能够 100% 实现它。
  • 感谢您试用,我使用的代码不完全相同。但是情况相似,我收到了 Incisive 的警告,我应该用最新的 Questa 尝试一下,看看会发生什么。
猜你喜欢
  • 2013-06-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多