哪种方式描述 uart 接口 modports?

Which way to describe uart interface modports?

我需要创建 uvm_environment uart 接口。除了界面本身,工作几乎完成了。我想要两个 modports,每个都包含作为 rx 的输入和作为 tx 的输出。

 DUT/UVM       if        DUT/UVM
 -------     ------      -------
|in   rx|<--|rx\ /rx|-->|rx  in |
|       |   |   x   |   |       |
|out  tx|-->|tx/ \tx|<--|tx  out|
 -------     ------      --------

我想到了这样的事情:

interface uart_internal_if();
    logic rx,tx;
endinterface
interface uart_if ();
    uart_internal_if if1;
    uart_internal_if if2;

    assign if1.rx = if2.tx;
    assign if2.rx = if1.tx;

    modport device1(input if1.tx, output if1.rx);
    modport device2(input if2.tx, output if2.rx);
endinterface

如果可行,我将拥有相同的 modports,并且我不会费心考虑应该为 DUT 输出哪个引脚,对于 tb env 也是如此。如果我创建名称为 rx1、tx1 的接口,我将不得不始终考虑哪个 modport 应该进入 UVM,这并不好。 问题是,据我所知,我不能在 modports 中使用内部接口,因为我有以下错误:

 near ".": syntax error, unexpected '.', expecting ')' or ','

有没有可能描述这样的事情?

SystemVerilog 有一个名为 modport 表达式 的功能。这类似于 端口表达式,其中端口的名称与其连接的信号不同。

interface uart_if ();
logic l1, l2;

    modport device1(input .rx(l1), output .tx(l2));
    modport device2(input .rx(l2), output .tx(l1));
endinterface

然后无论你连接到哪个modport,你都可以读取rx,并写入tx。

module DUT(uart_if.device1 ut);

// ut.rx is really l1
// ut.tx is really l2

endmodule