哪种方式描述 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
我需要创建 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