5

我想知道是否有可能以某种方式确定开发人员是否错误地在 UVM 驱动程序内部写入 DUT 输出信号而不是输入信号。我已经尝试过了,没有编译/运行时错误消息。示例在这里(试用是在我的机器上用 Incisive 完成的,后来上传了代码):

http://www.edaplayground.com/x/386

'some_signal' 上的分配模拟 DUT 输出(连续驱动器)。每当我尝试从类中驱动“some_signal”时说信号是多重驱动的,但类驱动程序“获胜”并更新信号时,我会预料到会出现运行时错误。

前段时间,当我刚开始做 SV 时,我玩过 modports。我会在 modport 中声明一些信号作为输入,但我注意到驱动它们仍然是合法的。之后我停止使用它们。显然这是众所周知的事情,正如这篇文章所说:https ://verificationacademy.com/forums/systemverilog/modports-sv

我最近从一位同事那里继承了一些在类中使用 modports 的代码。我制作了以下示例来说明该代码的作用:

http://www.edaplayground.com/x/2W_

我尝试在这两个类中使用 modports,但 ModelSim 抱怨不应该在分层路径中使用 modports。Incisive 的代码没有问题,也没有发出任何警告。ModelSim 错误,以及 2012 年标准中的这句话“为了限制模块内的接口访问,有 modport 列表以及在接口内声明的方向。” 有点暗示 modports 并不是真的打算在类中使用。

有人可以确认 modports 不是去这里的方式吗?另外,有谁知道是否可以以任何方式捕获此类错误(从类中驱动 DUT 输出)?

4

1 回答 1

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 Std 1800-2009 从 25.5 开始:

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

于 2014-02-27T15:27:03.653 回答