System verilog ##类内N个延迟环

System verilog ##类内N个延迟环,system-verilog,System Verilog,##在具有默认时钟块的接口中,N应延迟N个周期 如果我在一个接口中有一个类,那么这似乎不起作用。LRM似乎没有指定任何错误,我也没有得到任何编译错误 请参阅下面的代码段,其中接口中有一个访问器类,该类有一个等待周期的成员。调用此任务似乎不会带来任何延迟 interface my_if ( input logic clk, inout logic valid, inout logic[1:0] req ); default clocking cb @(posedge clk)

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

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

请参阅下面的代码段,其中接口中有一个访问器类,该类有一个等待周期的成员。调用此任务似乎不会带来任何延迟

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
以上两种显示器同时打印

当类内部不工作时,接口中的等待直接起作用的代码
你有一个竞赛条件,它与
##值在一个类中无关

该争用是由于您的
初始
块中存在
#100
延迟,这与您的测试台中的
始终
块竞争,该块在时间100时产生posedge clk。因此,对
wait_cycles
的调用是一场竞赛,无论它是在时钟边缘之前还是之后被调用

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

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