Tud*_*imi 5 system-verilog uvm
我想知道是否有可能以某种方式弄清楚是否错误地在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输出)是否可以以任何方式被捕获?
在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
Run Code Online (Sandbox Code Playgroud)
据我了解,当我们提到信号作为输出时,modport我们只是说信号的方向就像该块的输出。它不关心任何其他块是否驱动相同。(我想标准没有提到对此的任何限制)。我想这就是为什么我们在驱动输入而不是输出时出现错误的原因。
如果 IEEE 标准 1800-2009,则从 25.5 开始:
为了限制模块内的接口访问,有 modport 列表,其中在接口内声明了方向。关键字 modport 表示方向是在模块内部声明的。