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

时间:2014-02-25 17:30:45

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

1 个答案:

答案 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   表示方向声明为模块内部。