如何在systemverilog中使用clocking语句?

时间:2016-02-02 14:07:35

标签: system-verilog

现在,我正在尝试在systemverilog中使用clocking语句,如下所示。

interface itf();
...

clocking cb @(posedge clk); 
default input #3ns output #5ns; 

output read,enable,addr; 
input negedge data; 
endclocking 

...
endinterface

我认为,上面使用输出和输入的代码有延迟。 read,enable,addr有5ns延迟,数据延迟3ns。 但它效果不好。你能提出任何建议吗? 如果可以的话,您能告诉我带有该代码的示例代码吗?

我希望看到输入#3ns和输出#5ns的作品 感谢。

UPDATE1

module top();
logic clk;
initial begin
clk =0;
forever #5 clk= ~clk;
end
itf u_itf(.clk(clk));
dut u_dut(u_itf);
tb_u_tb(u_itf);
endmodule

module tb (itf tb);
initial begin
tb.read <= 0;
repeat(3) #10 tb.read <= ~tb.read;
$finish;
end

always @(posedge tb.clk) begin
tb.cb.read <=tb.cb;
if (tb.cb.enable)
tb.data  <= tb.data+1;
end

initial begin 
tb.data =0;
end

endmodule

module dut(itf dut_itf);
always  @(posedge dut_itf.clk) begin
if (dut_itf.read)
dut_itf.enable <= 1;
end

initial begin 
dut_itf.enable <= 0;
end
endmodule

interface itf(input clk);
logic read,enable;
logic [7:0]  addr, data;
modport dut(input read, addr, output data, enable);
modport tb(clocking cb);

clocking cb@(posedge clk);
default input #3ns //output #5ns; //Here is my test point.
output data, addr, read;
input enable;
endclocking


endinterface

正如您可以看到的代码,我想测试一下“默认输入#3ns输出#5ns;” 和“默认输入#3ns //输出#5ns;”

但默认输入#3ns //输出#5ns;不起作用。

另外我们如何证明tb.read值?

UPDATE2。

我是否应该按照以下方式进行修改?

 module tb (itf tb);
 initial begin 
 tb.cb.read <= 0; 
 repeat(3) tb.cb.read <= ~tb.cb.read;
 $finish;
 end 
 always @( tb.cb) begin
 tb.cb.read <=tb.cb; 
 if (tb.cb.enable)
 tb.cb.data <= tb.cb.data+1; 
 end 
 initial begin 
 tb.cb.data =0; 
 end endmodule 

更新3

我明白了时钟声明。 但我想知道什么样的事件使用时钟输入。 时钟输入中使用了什么样的例子?

1 个答案:

答案 0 :(得分:0)

如果您搜索,可以找到许多时钟块示例。这是one。我在您的代码中看到的一些问题是,您正在使用直接非阻塞分配和来自测试平台的时钟块驱动语句同时分配读取信号。为接口定义了使用时钟模块的一般规则,时钟模块信号是您应该与之交互的唯一信号。这包括用于同步的事件控件。您不应该使用#10@(posedge tb.clk) - 只需使用@(tb.cb)