SystemVerilog:在另一个接口的任务中引用的接口变量

时间:2017-05-16 13:33:46

标签: verilog system-verilog xilinx vivado

请考虑以下示例代码:

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(包含在interface)具有前置接口实例的名称。目前,我只是投票支持“编译器错误”。 我目前使用的解决方法是将wire logic HACK_i_x = i.x;添加到界面并引用像if (HACK_i_x)这样模拟和合成的本地线。

1 个答案:

答案 0 :(得分:0)

这对我来说似乎是一个综合工具错误。其他模拟器也处理您编写的代码。来自jXXX.内部的分层路径J是对其自身的向上分层引用。令人费解,但仍然合法。