В чем разница между интерфейсными сигналами и интерфейсными портами? - PullRequest
0 голосов
/ 30 мая 2019

Предположим, у нас есть такой интерфейс:

interface Memory_i(input Clock);

    Data_t InData;
    Data_t OutData;
    Address_t Address;

    // To memory controller
    modport Master
    (
        input Clock,
        output InData,
        input OutData,
        output Address
    );

    // To memory
    modport Slave
    (
        input Clock,
        input InData,
        output OutData,
        input Address,
    );

endinterface

Есть ли существенная разница между Clock (интерфейсный порт) и, скажем, InData (интерфейсный сигнал)?Я знаю, что эти объекты связаны по-разному, когда создается интерфейс.Но есть ли что-то еще?Я также заметил, что интерфейсные порты часто используются для тактового сигнала.Есть ли причина для этого?

ОБНОВЛЕНИЕ

Я упростил свой интерфейс и сделал два примера, в которых я пытаюсь использовать часы двумя различными способами.У меня есть две слегка отличающиеся схемы RTL, но я не вижу никакой принципиальной разницы между ними.

Часы как порт:

interface CdcSignal_i(input clock);

    logic data;

    // To memory controller
    modport Master
    (
        input clock,
        output data
    );

    // To memory
    modport Slave
    (
        input clock,
        input data
    );

endinterface

module Cdc(
    CdcSignal_i.Slave slave,
    CdcSignal_i.Master master
);

    logic registerS;
    logic registerM;

    always_ff @(posedge slave.clock) begin
        registerS <= slave.data;
    end

    always_ff @(posedge master.clock) begin
        registerM <= registerS;
        master.data <= registerM;
    end

endmodule

module InterfaceTest(
    input logic clock0,
    input logic clock1,
    input logic data0,
    output data1);

    CdcSignal_i signal0(clock0);
    assign signal0.data = data0;

    CdcSignal_i signal1(clock1);
    assign data1 = signal1.data;

    Cdc cdc(signal0, signal1);

endmodule

RTL for clock designed as a port

Часы в качестве сигнала:

interface CdcSignal_i();

    logic data;
     logic clock;

    // To memory controller
    modport Master
    (
        input clock,
        output data
    );

    // To memory
    modport Slave
    (
        input clock,
        input data
    );

endinterface

module Cdc(
    CdcSignal_i.Slave slave,
    CdcSignal_i.Master master
);

    logic registerS;
    logic registerM;

    always_ff @(posedge slave.clock) begin
        registerS <= slave.data;
    end

    always_ff @(posedge master.clock) begin
        registerM <= registerS;
        master.data <= registerM;
    end

endmodule

module InterfaceTest(
    input logic clock0,
    input logic clock1,
    input logic data0,
    output data1);

    CdcSignal_i signal0();
    assign signal0.clock = clock0;
    assign signal0.data = data0;

    CdcSignal_i signal1();
    assign signal1.clock = clock1;
    assign data1 = signal1.data;

    Cdc cdc(signal0, signal1);

endmodule

RTL for clock designed as a signal

1 Ответ

0 голосов
/ 30 мая 2019

Обычно вы видите Clock как входной порт для интерфейса, потому что этот сигнал используется многими другими интерфейсами и экземплярами модуля. С другой стороны, каждый экземпляр вашего интерфейса создает другой экземпляр сигнала InData.

...