2017-05-16 94 views
1

考虑下面的示例代码的任务引用:的SystemVerilog:接口变量中的其他接口

interface I(); 
    logic x; 
    modport slave(input x); 
endinterface 

interface J(I.slave i); 
    logic y; 
    task process; 
     if (i.x) begin 
      // ... 
     end 
     if (y) begin 
      // ... 
     end 
    endtask 
endinterface 

module test(input wire logic clock); 
    I iXXX(); 
    J jXXX(.i(iXXX), .*); 

    always @(posedge clock) begin 
     jXXX.process(); 
    end 
endmodule 

此代码使用Vivado 2017.1模拟器和不使用Vivado 2017.1合成工作当中失败,出现错误

[Synth 8-146] cannot resolve hierarchical name ... 

如果更改if (i.x)if (jXXX.i.x),它确实合成。这对我来说看起来很奇怪。也许有人可以阐明这是否是预期的行为,以及标准对此的看法。

引用jXXX.i.x才有意义,如果该任务的代码粘贴到其中process()调用发生时,有特殊的例外,像y非接口变量(包含在接口)有前置接口实例的名称。目前,我只是投票“编译器bug”。 我目前使用的解决方法是将wire logic HACK_i_x = i.x;添加到接口并引用此模拟和综合的本地线路,如if (HACK_i_x)

回答

0

这看起来像是一个综合工具的bug。其他模拟器也处理你写的代码。来自J内部的分层路径jXXX.是对其自身的向上分层引用。卷土重来,但仍然合法。