为什么时钟块不阻塞?

Why Clocking block is not blocking?

使用时钟块作为阻塞语句对接口信号进行背靠背分配,但未按预期工作。

对于下面的代码,我希望设置为 1,但没有设置

结果:

在时间 95: 设置为 1

然后不等待时钟块,在时间戳 95 处,移动到下一条语句以设置 0。

需要这方面的帮助

interface intf(input clk);
   logic done;
   clocking smp_cb @(posedge clk); 
   endclocking
endinterface

module top;

   bit clk;
   always #5 clk =~clk;

   intf intf_inst(.*);

   initial begin
      repeat(10)@(posedge clk);
      $display("[%0t] set 1", $realtime);
      assign_intf(1);
      $display("[%0t] set 0", $realtime);
      assign_intf(0);
      //$display("[%0t] set 1", $realtime);
      //assign_intf(1);
      //$display("[%0t] set 0", $realtime);
      //assign_intf(0);
      repeat(10)@(posedge clk);
      $stop;
   end

   task assign_intf(logic val);
      intf_inst.done <= val;
      @( intf_inst.smp_cb);
      //@(posedge intf_inst.clk);
   endtask

   initial $monitor(" Monitor: [%0t] done_sig value %0d", $realtime, intf_inst.done);

endmodule

你的问题是你不应该在同一个进程中混合事件控制 @(posedge clk) 和时钟块事件 @(intf_inst.smp_cb)。如果您打算使用时钟块,那么您与信号的唯一交互应该是通过时钟块。否则,您最终会遇到 raw 信号和时钟块信号之间的竞争条件。

在您的示例中,两个事件同时触发,但不是同时触发。在您调用 assign_intf 任务时,时钟块事件尚未触发。