如何设定默认时钟?
我尝试在代码中使用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导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。