Как описать модпорты интерфейса uart?

Мне нужно создать uvm_environment интерфейса uart. Работа почти сделана, кроме самого интерфейса. Я хочу иметь два модпорта, каждый из которых содержит ввод как 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

Если бы это сработало, у меня были бы одинаковые модпорты, и я бы не беспокоился о том, какой вывод должен быть выведен для DUT и для tb env. Если я создам интерфейс с такими именами, как rx1, tx1, мне придется всегда думать, какой модпорт должен идти в UVM, а это нехорошо. Проблема в том, насколько я понимаю, я не могу использовать внутренние интерфейсы в модпортах, потому что у меня следующая ошибка:

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

Можно ли описать такое?


person Андрей Солодовников    schedule 17.03.2020    source источник


Ответы (1)


В SystemVerilog есть функция, которая называется выражения модпорта. Это похоже на выражения порта, где имя порта отличается от сигнала, к которому он подключен.

interface uart_if ();
logic l1, l2;

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

Затем, к какому бы модпорту вы ни подключились, вы можете читать rx и записывать в tx.

module DUT(uart_if.device1 ut);

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

endmodule
person dave_59    schedule 17.03.2020