【问题标题】:##N delay cycles inside class##N 类内的延迟周期
【发布时间】:2021-05-02 16:00:54
【问题描述】:

在具有默认时钟块的接口内的##N 应该延迟 N 个周期

如果我在接口中有一个类,这似乎不起作用。 LRM 似乎没有指定任何错误,我没有收到任何编译错误

参见下面的 sn-p,其中接口内部有一个访问器类,并且该类有一个用于等待周期的成员。调用此任务似乎不会引入任何延迟

interface my_if (
  input logic clk,
  inout logic valid,
  inout logic[1:0] req );
  
  default clocking cb @(posedge clk);
    inout valid;
    inout req;
  endclocking

  class accessor_c;
    function new();
    endfunction
    
    task wait_cycles(int value);
      ##value;
    endtask
      
  endclass
  
  initial begin
    accessor_c acc;
    acc = new();
    #100;
    $display("%t: call wait", $time);
    acc.wait_cycles(1);
    $display("%t: after wait", $time);
  end
  
endinterface

以上两个显示同时打印。

edaplayground 上的代码,其中直接在界面中等待,而在类中不工作 https://www.edaplayground.com/x/9_u_

【问题讨论】:

    标签: system-verilog


    【解决方案1】:

    你有一个竞争条件——它与 ##value 在一个类中无关。

    竞争是由于您的initial 块中有#100 延迟,这与您的测试台中产生posedge clkalways 块竞争> 在时间 100。所以对wait_cycles 的调用无论是在时钟边缘之前还是之后被调用都处于竞争状态。

    要解决此问题,请将 #100 更改为与 posedge 时钟不一致的值,或者更好地使用 repeat (5) @cb 之类的延迟。

    一般来说,使用repeat(N) @cb 语法比使用##N 语法更好,因为您可以在不允许默认时钟块的地方使用它(例如在包中),并且您可以通过虚拟接口分层访问不同的时钟块.

    【讨论】:

      猜你喜欢
      • 2012-06-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-03
      • 2018-08-22
      • 2019-06-02
      • 1970-01-01
      相关资源
      最近更新 更多