现在,我正在尝试在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的作品 感谢。
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值?
我是否应该按照以下方式进行修改?
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
我明白了时钟声明。 但我想知道什么样的事件使用时钟输入。 时钟输入中使用了什么样的例子?
答案 0 :(得分:0)
如果您搜索,可以找到许多时钟块示例。这是one。我在您的代码中看到的一些问题是,您正在使用直接非阻塞分配和来自测试平台的时钟块驱动语句同时分配读取信号。为接口定义了使用时钟模块的一般规则,时钟模块信号是您应该与之交互的唯一信号。这包括用于同步的事件控件。您不应该使用#10
或@(posedge tb.clk)
- 只需使用@(tb.cb)
。