我有一个模块,我最初写的如下:
module design_name #(
parameter AWIDTH = 32,
parameter DWIDTH = 32,
...
) (
input wire clk,
input wire rst,
input wire [AWIDTH-1:0] write_addr,
...
);
// logic, etc.
endmodule
当然,我现在想在一个测试平台上测试这个块。我想要使用一个接口,所以我创建了这样一个接口:
interface design_name_if #(
parameter AWIDTH = 32,
...
) (
input clk
);
logic rst;
logic [AWIDTH-1:0] write_addr;
...
modport des (
input rst,
input write_addr,
...
);
endinterface
我想我的问题现在开始了;我如何在我的测试平台中使用这个接口?我目前有:
module tb;
reg clk;
design_name_if intf (clk);
design_name dut (
.clk (intf.clk),
.rst (intf.ndm.rst),
.write_addr (intf.ndm.write_addr),
...
// I don't think the above is correct
initial begin
clk = 0; // or intf.clk = 0; ?
rst = 0;
forever #1 clk = ~clk;
#10
rst = 1;
end
endmodule
我还尝试过其他一些简单的逻辑,比如尝试断言某些信号和其他东西,但我甚至无法让clk启动,在运行模拟时我也无法得到rst断言。如果这很重要,接口将在相同的文件中在tb上面声明。显然,我正在测试的模块位于另一个文件中。我可以通过在测试台内声明所有信号为reg和连线来使测试台不需要接口工作,但是我想使用一个带有任务、功能等的接口。任何帮助都很感谢,谢谢!
发布于 2022-06-26 16:42:44
你们很亲密。只需去掉引用中的modport -- modport
不是作用域,它是端口连接或虚拟接口引用的一组访问权限。
design_name dut (
.clk (intf.clk),
.rst (intf.rst),
.write_addr (intf.write_addr),
...
发布于 2022-06-24 14:37:22
有几个问题:
。
永远#1 clk = ~clk;
语句位于初始块的中间。这将阻止同一初始块中的所有其他语句执行。例如,它永远不会执行#10或rst =1语句。解决方案是使用不同的初始块或始终块驱动时钟(无论您选择何种时钟来使用接口或本地声明)。
初始begin $finish;end
这样,测试就不会使模拟器陷入循环。
https://stackoverflow.com/questions/72745305
复制相似问题