【问题标题】:Interface Modport Connection to Testbench Environment in SystemVerilog接口 Modport 连接到 SystemVerilog 中的测试台环境
【发布时间】: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只是不同的视图。

标签: verilog system-verilog


【解决方案1】:

Modports 只是在声明接口端口或虚拟接口变量或对它们进行分配时限制访问权限。这在 IEEE 1800-2017 LRM 的 25.9 虚拟接口25.10 访问接口对象 部分进行了解释。

基本上,您始终可以将接口类型从 unrestricted 接口实例分配到 modport restricted 端口或变量,但您永远不能反过来进行分配方向(限制到无限制),或从一种 modport 类型到另一种 modport 类型。

【讨论】:

  • 不清楚是否限制为相同 modport 类型之间的受限分配,如 OP 示例(TEST 到 TEST)。在这种情况下会出现 vcs 错误。 nc 和导师没有。
  • 跨工具的不同行为肯定会让这些工具的用户不清楚。 LRM 在我提到的部分中很清楚,modport 是数据类型的一部分,并且部分 6.22.3 赋值兼容 说匹配类型是赋值兼容的。第 25.9 节还做了一个例外,允许不受限制的类型与受限制的类型进行赋值兼容。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-15
  • 1970-01-01
  • 1970-01-01
  • 2021-04-09
  • 1970-01-01
相关资源
最近更新 更多