【问题标题】:SystemVerilog: Interface variable referenced in task of another interfaceSystemVerilog:在另一个接口的任务中引用的接口变量
【发布时间】:2017-05-16 13:33:45
【问题描述】:

考虑以下示例代码:

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 Simulator 运行,使用 Vivado 2017.1 Synthesis 运行失败并出现错误

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

如果您将if (i.x) 更改为if (jXXX.i.x),它 合成。这对我来说似乎完全奇怪。也许有人可以阐明这是否是预期行为以及标准对此有何规定。

如果将任务代码粘贴到发生process() 调用的位置,则引用jXXX.i.x 是有意义的,但像y 这样的非接口变量(包含在接口中)的名称为前置接口实例。目前,我只会投票支持“编译器错误”。 我目前使用的解决方法是将wire logic HACK_i_x = i.x; 添加到接口并引用此本地线,例如模拟和合成的if (HACK_i_x)

【问题讨论】:

    标签: verilog system-verilog xilinx vivado


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-08-02
      相关资源
      最近更新 更多