【发布时间】:2020-05-05 18:26:30
【问题描述】:
我有一个简单的仲裁器设计,它授予两个请求中的一个优先于第一个请求。我想将它连接到在 SystemVerilog 中设计的测试台。我想通过两个位置的接口将我的环境连接到我的 DUT:1)连接到监控总线的监视器 2)。给驱动程序,驱动相关的测试用例。
对于这两个连接,我定义了两个modports。我已经在顶层模块中实例化了我的 DUT 和接口,并尝试使用虚拟接口传递对这两个 modports 的引用。但是,我收到如下编译时错误:
** 错误:Environment.sv(8):从类型“虚拟接口 arb_if”非法分配类型“虚拟接口 arbi_if”:虚拟接口类型“arbi_if”不能分配类型“arb_if”。
不同的代码如下:
arb_if.sv
interface arb_if(
input clk
);
logic [1:0] request;
logic [1:0] grant;
logic rst;
clocking cb @(posedge clk);
input grant;
output request;
endclocking
modport TEST(clocking cb, output rst);
modport ARBI(input clk, grant, output rst, request);
modport MONT(input clk, grant, rst, request);
endinterface
环境.sv
class Environment;
virtual arbi_if af;
virtual arbi_if.TEST aft;
virtual arbi_if.TEST afm;
function new(virtual arb_if af);
this.af = af;
this.aft = af.TEST;
this.afm = af.MONT;
endfunction
endclass
test.sv
`include "Environment.sv"
class test;
Environment env;
virtual arb_if af;
function new(virtual arb_if afi);
this.af = afi; // Compiler complains for this line.
endfunction
...
endclass
tb_top.sv
module tb_top;
reg clk;
initial
begin
clk = 0;
forever #5 clk = ~clk;
end
arb_if arbif(clk);
arb a(arbif);
test ta(arbif);
endmodule
总之,我想知道如何将 modports 的引用从顶级模块传递给不同的类? 上面的代码已经被修剪成一个最小的工作示例。
【问题讨论】:
-
你将你的界面命名为
arb_if,但在Evironment.sv中它是arbi_if。 -
另外,这里的标准有点模糊。目前还不清楚
this.aft = af.TEST;是否可以使用,但是this.aft = af;是可以的。 -
@Serge 感谢您指出错误。事实上,这是错误。但是,我仍然想知道当两个接口不同时,监视器和驱动程序将如何连接到同一个 DUT:一个我们提供为 arb_if.TEST,另一个提供为 arb_if.MONT。至少编译器/模拟器如何知道我将 DUT 连接到相同的引脚但连接到两个不同的组件。
-
还是一样的界面,modports只是不同的视图。