限制对类中虚拟接口信号的访问

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输出)是否可以以任何方式被捕获?

Vin*_* VS 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
Run Code Online (Sandbox Code Playgroud)

据我了解,当我们提到信号作为输出时,modport我们只是说信号的方向就像该块的输出。它不关心任何其他块是否驱动相同。(我想标准没有提到对此的任何限制)。我想这就是为什么我们在驱动输入而不是输出时出现错误的原因。

如果 IEEE 标准 1800-2009,则从 25.5 开始:

为了限制模块内的接口访问,有 modport 列表,其中在接口内声明了方向。关键字 modport 表示方向是在模块内部声明的。