Назначение входного порта на вход в обоих направлениях - PullRequest
0 голосов
/ 21 мая 2018

Для целей моделирования, используя Verilog, я хотел бы создать блок, который имеет только 2 входных порта (скажем, левый и правый) и будет передавать сигналы либо слева направо, либо справа налево.Можно предположить, что блок будет активен только во время перехода и будет ждать входы в течение остального времени.Но я не могу использовать любые другие порты.Таким образом, определение модуля будет примерно таким в теории:

module blackbox(inout left, inout right)
  assign left = right;
  assign right = left;

  specify
    (left => (right:1'b1)) = 7;
    (right => (left:1'b1)) = 8;
  endspecify
endmodule

Есть ли решение для этого?направление после размещения.Например, если блок расположен в одном месте, он всегда будет передавать сигнал слева направо, но в другом месте он может быть справа налево.Можно ли как-то кодировать это внутри модуля?

Спасибо,

Ответы [ 2 ]

0 голосов
/ 21 мая 2018

Вы должны использовать сигналы трех состояний, как в реальном оборудовании:

assign A_inout = direction_is_A_to_B ? A_out : 1'bz;
assign B_inout = direction_is_A_to_B ? 1'bz  : B_out;

Тогда вы можете безопасно подключить A_inout к B_inout;

Вход является копией A_inout, номожет быть яснее явно использовать сигнал:

assign A_in = A_inout;

Обычно все, что делается внутри двунаправленной клавиатуры:

module bi_pad (
    inout  P,
    input  I,
    input  tri,
    output O
);

   assign P = tri ? 1'bz : O;
   assign I = P;

endmodule

Вы можете использовать параметр для определениянаправление, но вы должны знать, когда создается экземпляр блока, в каком направлении он должен быть.Там нет обратной связи, например, от места и инструмента маршрута, чтобы сделать это для вас.

0 голосов
/ 21 мая 2018

В Verilog

module blackbox(inout .left(internal), inout .right(internal));
 wire internal;
  specify
    (left => (right:1'b1)) = 7;
    (right => (left:1'b1)) = 8;
  endspecify
endmodule

или

 module blackbox(inout left, right);
     tran t(left,right); // some simulators might require this to work with specify block
      specify
        (left => (right:1'b1)) = 7;
        (right => (left:1'b1)) = 8;
      endspecify
    endmodule

В SystemVerilog:

 module blackbox(inout left, right)
   alias left = right;
      specify
        (left => (right:1'b1)) = 7;
        (right => (left:1'b1)) = 8;
      endspecify
 endmodule

Для вашего второго вопроса, я не уверен, зачем вамэто для имитационной модели, или как вы будете получать информацию о размещении в список соединений.

...