System verilog ##类内N个延迟环
##在具有默认时钟块的接口中,N应延迟N个周期 如果我在一个接口中有一个类,那么这似乎不起作用。LRM似乎没有指定任何错误,我也没有得到任何编译错误 请参阅下面的代码段,其中接口中有一个访问器类,该类有一个等待周期的成员。调用此任务似乎不会带来任何延迟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)
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
语法更好,因为您可以在不允许默认时钟块的情况下使用它(如在包中),并且可以通过虚拟接口分层访问不同的时钟块