如何设定默认时钟?

编程语言 2026-07-09

我尝试在代码中使用clocking block(时钟块),但遇到了错误:

Error-[DCNS] 未指定默认时钟块。 testbench.sv, 37; "##(2) ;"。循环延迟运算符需要为模块/接口/程序 'test' 指定一个默认时钟块。

代码的链接在这里:https://www.edaplayground.com/x/wjag,如下所示:

interface dut_if(input logic clk);
  logic [7:0] data;
  logic valid;
  logic ready;
  // Clocking block for the testbench (Driver/Monitor)
  default clocking cb @(posedge clk);
    default input #1step output #2ns;
    output data, valid;
    input  ready;
  endclocking
  // Modport to restrict the testbench to using the clocking block
  modport TB (clocking cb);
endinterface  

module test;
  logic clk;

  dut_if vif(.clk(clk)); 

  initial begin
    clk = 0;
    forever #5 clk = ~clk;    
  end 

  initial begin
    // Synchronize to the clocking event
    @(vif.cb);  
    // Drive signals through the clocking block
    vif.cb.data  <= 8'hA5;
    vif.cb.valid <= 1;  
    // Wait for 2 clock cycles using the cycle delay operator
    ##2;   
    // Sample a signal
    if (vif.cb.ready) 
      $display("DUT is ready at time %t", $time);     
    vif.cb.valid <= 0;
  end 
  initial #50 $finish; 
  initial begin
    $dumpfile("dump.vcd"); 
    $dumpvars;
  end
endmodule

我已经在 "clocking cb @(posedge clk);" 前面添加了 "default" 关键字。也就是,

default clocking cb @(posedge clk);

如果我使用 repeat (2) @(vif.cb);,它可以工作。不过,不管怎样,基于 ##2,该如何解决这个问题?

解决方案

错误信息的意思是,你正在一个没有 clocking 块的作用域中尝试使用 ##

你正在 module 中使用 ##,但在 module 中没有 clocking 块。将 default 关键字添加到 interface 内的 clocking 块中并不能解决错误,因为 ## 不在带有 clocking 块的 interface 内。

这是对 ## 的误用。我建议在你的代码中避免使用它。

正如你所发现的,使用 repeat (2) @(vif.cb); 确实可行。在本例中这是恰当的,并且也与上面的 @(vif.cb); 行保持一致。

站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章