首页 > 解决方案 > 哪种方式来描述 uart 接口 modports?

问题描述

我需要创建 uart 接口的 uvm_environment。工作差不多完成了,除了接口本身。我希望有两个 modport,每个都包含作为 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 ','

可以描述这样的事情吗?

标签: system-veriloguvm

解决方案


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

推荐阅读