2017-05-16 54 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.是對其自身的向上分層引用。捲土重來,但仍然合法。