我想知道是否有可能以某种方式弄清楚是否错误地在UVM驱动程序内部开发人员写入DUT输出信号而不是输入信号。我试过这个,没有编译/运行时错误消息。这个例子在这里(尝试在我的机器上的Incisive中完成,代码随后上传):
http://www.edaplayground.com/x/386
'some_signal'上的赋值模拟DUT输出(连续驱动程序)。每当我尝试从类中驱动'some_signal'表示信号被多次驱动时,我就会发现运行时错误,但类驱动程序“获胜”并更新信号。
前段时间,当我刚刚开始做SV时,我玩了modports。我会在modport中声明一些信号作为输入,但我注意到驱动它们仍然是合法的。之后我不再使用它们了。显然这是众所周知的,正如这篇文章所说:https://verificationacademy.com/forums/systemverilog/modports-sv
我最近从同事那里继承了一些代码,这些代码在类中使用了modport。我做了以下示例来说明代码正在做什么:
http://www.edaplayground.com/x/2W_
我尝试在两个类中使用modport,但ModelSim抱怨不应该在分层路径中使用modport。敏锐的代码没有问题,也没有发出任何警告。 ModelSim错误以及2012年标准“限制模块中的接口访问”中的引用,有一些modport列表,其中包含在 接口。“有点暗示modport并不是真的打算在课堂上使用。
有人可以确认modports不是这里的方式吗?此外,是否有人知道这些错误(从类中驱动DUT输出)是否可以以任何方式被捕获?
答案 0 :(得分:1)
在vcs中尝试了以下代码并得到以下错误。
错误 - [MPCBD] Modport端口无法驱动modp.sv,32 some_package, “vif.some_signal”modport'slave'的端口'some_signal'已经存在 限制为输入端口。输入端口无法驱动。
interface some_interface();
bit clk;
logic some_signal;
logic some_signal2;
modport master(input clk, output some_signal);
modport slave(input clk, input some_signal);
modport temp (output some_signal, output some_signal2);
endinterface
package some_package;
class some_master_class;
virtual some_interface.master vif;
task do_something();
@(posedge vif.clk);
vif.some_signal <= 1;
@(posedge vif.clk);
vif.some_signal <= 0;
endtask
endclass
class some_slave_class;
virtual some_interface.slave vif;
task do_something();
forever @(posedge vif.clk);
vif.some_signal = 0;
//$display("some_signal = ", vif.some_signal);
endtask
endclass
endpackage
module temp_1 (some_interface.temp iif);
assign iif.some_signal = 1;
assign iif.some_signal2 = 0;
endmodule
module top();
import some_package::*;
some_interface my_if();
bit clk;
always #1 clk = ~clk;
assign my_if.clk = clk;
temp_1 temp (my_if.temp);
initial begin
some_master_class master = new();
some_slave_class slave = new();
master.vif = my_if.master;
slave.vif = my_if.slave;
fork
master.do_something();
slave.do_something();
join_any
$finish();
end
endmodule
据我所知,当我们在modport
中提到信号作为输出时,我们只是说信号的方向就像这个块的输出。它不关心任何其他块是否正在驱动相同。(我想标准没有提到任何限制)。我猜这就是为什么我们得到驱动输入的错误而不是输出错误。
IEEE标准1800-2009从25.5开始:
要限制模块内的接口访问,有模块列表 在界面中声明的方向。关键字modport 表示方向声明为模块内部。