Каким образом описать интерфейс модов UART? - PullRequest
1 голос

Мне нужно создать 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 то же самое для ТБ env. Если я создаю интерфейс с именами, такими как rx1, tx1, мне нужно всегда думать, какой модпорт должен go для UVM, и это не хорошо. Проблема в том, что, как я понимаю, я не могу использовать внутренние интерфейсы в модпортах, потому что у меня следующая ошибка:

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

Можно ли описать такую ​​вещь?

1 Ответ

2 голосов
/ 17 марта 2020

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
...