2014-02-25 27 views
5

我想知道是否有可能在错误的情况下,在UVM驱动程序内部开发人员写入DUT输出信号而不是输入信号。我已经试过了,没有编译/运行时错误消息。这个例子是在这里(试奏是在做精辟我的机器上,并在后面的代码上传):限制访问类虚拟接口信号

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输出的类)是否可以被捕获?

+0

我也被modports弄糊涂了,但我想你在这里使用的是钟控块。他们给你同样的问题吗? – nguthrie

+0

好主意,我会尝试一下并发布结果。 –

+0

我做了另一个使用时钟块的游乐场http://www.edaplayground.com/x/2yV如果我尝试写入输入,但只在Incisive中,而不是在EDA Playground上的ModelSim版本中,它会发出错误。 –

回答

1

在vcs中尝试了下面的代码,并得到了下面的错误。

错误 - [MPCBD] Modport端口不能被驱动modp.sv,32 some_package, “vif.some_signal” 端口 'some_signal' 的modport '从' 一直 限制作为输入端口。输入端口不能被驱动。

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我们只想说,信号的方向就像是从该块输出的输出。它并不关心是否有其他区块在驾驶相同的区域(我猜这个标准没有提到这方面的限制)。我想这就是为什么我们得到错误的输入被驱动,而不是输出。

25.5如果IEEE标准1800年至2009年:

要限制在一个模块内的接口接入,有modport列表 与接口内声明的方向。关键字modport 表示方向是在模块内部声明的。

+0

我在Questa的较新版本中尝试过它,它不会发出任何警告,但仍然允许写入modport输入,这会破坏目的。 –

+0

@Tudor:你是否至少要写一个'modport'输入的警告?当你写'你使用'intf.modport.signal'? –

+0

没有,没有警告,没有错误,没有任何东西。就像我在问题中联系起来一样,显然这是因为该标准没有明确说明驱动输入是非法的。对于时钟块,它确实会这样说,并且明确地触发了一个错误。 –