Interface 接口中RTL可读性的assign语句在合成中导致赋值或缓冲区

Interface 接口中RTL可读性的assign语句在合成中导致赋值或缓冲区,interface,system-verilog,synthesis,Interface,System Verilog,Synthesis,我们有一个与modports connectin gmodules的接口,看起来像这样: interface test_interface (clk, in1, out1); input logic in1; output logic out1; input logic clk; logic mid1; logic aliased_signal; modport a_to_b ( input in1, input

我们有一个与modports connectin gmodules的接口,看起来像这样:

interface test_interface (clk, in1, out1);
    input logic in1;
    output logic out1;
    input logic clk;
    logic mid1;
    logic aliased_signal;

    modport a_to_b (
        input in1,
        input clk,
        output mid1,
        input aliased_signal
    );

    modport b_to_a (
        input clk,
        input mid1,
        output out1,
        output aliased_signal
    );

endinterface : test_interface

module top(clock, inpad, outpad);
    input logic clock;
    input logic inpad;
    output logic outpad;

    test_interface test_if(.clk(clock), .in1(inpad), .out1(outpad));

    a A0(.a2b(test_if));
    b B0(.b2a(test_if));

endmodule

module a ( test_interface.a_to_b a2b);

    always_ff @(posedge a2b.clk) begin
        a2b.mid1 <= a2b.in1 & a2b.aliased_signal;
    end

endmodule

module b (test_interface.b_to_a b2a);

    assign b2a.aliased_signal = b2a.out1;

    always_ff @(posedge b2a.clk) begin
        b2a.out1 <= ~b2a.mid1;
    end

endmodule
接口测试\u接口(时钟、输入1、输出1);
输入逻辑in1;
输出逻辑out1;
输入逻辑时钟;
逻辑mid1;
逻辑混叠信号;
移动端口a到b(
输入1,
输入时钟,
输出mid1,
输入混叠信号
);
莫德波特b_至a(
输入时钟,
输入mid1,
输出1,
输出混叠信号
);
endinterface:测试接口
模块顶部(时钟、输入、输出);
输入逻辑时钟;
输入逻辑inpad;
输出逻辑输出;
测试接口测试if(.clk(时钟),.in1(inpad),.out1(outpad));
a A0(.a2b(测试u-if));
b B0(.b2a(如果测试));
端模
模块a(测试接口a至a2b);
始终_ff@(posedge a2b.clk)开始
a2b.mid1 b连接正在进行),但如果我连接到mid2 a->c而不是直接使用模糊的_name信号,我会从IUS和DC收到相同的错误

interface test_interface(clk, in1, out1, out2);
    input logic [7:0] in1;
    output logic [3:0] out1;
    output logic [3:0] out2;
    input logic clk;
    logic [7:0] obfuscated_name;
    logic [3:0] mid1;
    logic [3:0] mid2;

    modport a_mp (
        input clk,
        input in1,
        output obfuscated_name
    );

    modport a_to_b (
        input clk,
        input .mid1(obfuscated_name[3:0]),
        output out1
    );

    modport a_to_c (
        input clk,
        input obfuscated_name,
        output out2
    );

endinterface : test_interface

module a ( test_interface.a_mp a_intf);

    always_ff @(posedge a_intf.clk) begin
        a_intf.obfuscated_name <= ~a_intf.in1;
    end

endmodule

module b (test_interface.a_to_b b_intf);

    always_ff @(posedge b_intf.clk) begin
        b_intf.out1 <= b_intf.mid1;
    end

endmodule


module c (test_interface.a_to_c c_intf);

    always_ff @(posedge c_intf.clk) begin
        c_intf.out2 <= ~c_intf.obfuscated_name[7:4];
    end

endmodule



module top( input logic clock,
            input logic [7:0] inpad,
            output logic [3:0] outpad1,
            output logic [3:0] outpad2 );


    test_interface test_if(.clk(clock), .in1(inpad), .out1(outpad1), .out2(outpad2));

    a A0(.a_intf(test_if));
    b B0(.b_intf(test_if));
    c C0(.c_intf(test_if));

endmodule
接口测试接口(时钟、输入1、输出1、输出2);
输入逻辑[7:0]输入1;
输出逻辑[3:0]out1;
输出逻辑[3:0]out2;
输入逻辑时钟;
逻辑[7:0]模糊的名称;
逻辑[3:0]mid1;
逻辑[3:0]mid2;
莫德波特酒店(
输入时钟,
输入1,
输出模糊的\u名称
);
移动端口a到b(
输入时钟,
input.mid1(模糊化的_名称[3:0]),
输出输出1
);
移动端口a_至c(
输入时钟,
输入模糊的_名称,
输出输出2
);
endinterface:测试接口
模块a(测试接口a\U mp a\U intf);
始终_ff@(posedge a_intf.clk)开始

a_intf.obfuscated_nameVerilog中有一个称为端口表达式的功能
。_port的名称(expression_to_be_connected_to_port)
大多数人在他们没有意识到的模块实例端口列表中识别出来,也可以在模块减速端口列表头中使用。这声明了端口的名称以及连接到端口的表达式。这样,可以将较大内部总线的较小部分制作成端口

module DUT(input clk, inout .data(bus[7:0]) );
  wire [31:0] bus;
endmodule
module top;
  reg clock;
  wire [7:0] mydata;
  DUT d1(.data(mydata), .clk(clock) );
endmodule
在SystemVerilog中,您可以对modport表达式执行相同的操作

interface test_interface (clk, in1, out1);
    input logic in1;
    output logic out1;
    input logic clk;
    logic mid1;
    logic aliased_signal;

    modport a_to_b (
        input in1,
        input clk,
        output mid1,
        input .aliased_signal(out1) // modport expression
    );

    modport b_to_a (
        input clk,
        input mid1,
        output out1
    );

endinterface : test_interface

module top( input logic clock,
            input logic inpad,
            output logic outpad );


    test_interface test_if(.clk(clock), .in1(inpad), .out1(outpad));

    a A0(.a2b(test_if));
    b B0(.b2a(test_if));

endmodule

module a ( test_interface.a_to_b a2b);

    always_ff @(posedge a2b.clk) begin
        a2b.mid1 <= a2b.in1 & a2b.aliased_signal; // port reference to alias
    end

endmodule

module b (test_interface.b_to_a b2a);

    always_ff @(posedge b2a.clk) begin
        b2a.out1 <= ~b2a.mid1;
    end

endmodule
接口测试\u接口(时钟、输入1、输出1);
输入逻辑in1;
输出逻辑out1;
输入逻辑时钟;
逻辑mid1;
逻辑混叠信号;
移动端口a到b(
输入1,
输入时钟,
输出mid1,
input.aliased_信号(out1)//modport表达式
);
莫德波特b_至a(
输入时钟,
输入mid1,
输出输出1
);
endinterface:测试接口
模块顶部(输入逻辑时钟,
输入逻辑inpad,
输出逻辑(outpad);
测试接口测试if(.clk(时钟),.in1(inpad),.out1(outpad));
a A0(.a2b(测试u-if));
b B0(.b2a(如果测试));
端模
模块a(测试接口a至a2b);
始终_ff@(posedge a2b.clk)开始

a2b.mid1抱歉,该网站是新用户,正在尝试在评论中显示更新的代码。我更新了原始问题,以包括我正在尝试的内容以及我从IUS和DC得到的错误(VCS似乎对此没有问题)。如果我使用信号的所有位,并将mid1设为8位而不是4位,IUS似乎对它满意:input.mid1(模糊的_名称),但我从DC得到相同的错误,最后,这是关于在合成中避免赋值/缓冲区。哎呀,我想我没有正确连接接口。IUS仍然不喜欢modport表达式.mid1(模糊的_名称[7:4]),因此部件选择不起作用,但一旦我正确连接接口,DC似乎就可以了!在ModelSim/Questa中工作