Например: подключенные входы-выходы A и B имеют задержку между IO и IO 10 нс. Входы-выходы работают на частоте 500 МГц (период 2 нс).

По умолчанию Verilog использует инерционную задержку, которая действует как фильтр. Поэтому определение соединительного провода как wire #(10ns) io; не сработает, так как это отфильтрует данные.

wire #(10ns) io;

assign io = io_a_en ? a_data_500MHz : 'z;
assign io = io_b_en ? b_data_500MHz : 'z;

Транспортная задержка однонаправленная. Создание одного для каждого направления на вводе-выводе вызовет несколько драйверов и петлю обратной связи.

always @(a) b_reg <= #(10ns) a;
always @(b) a_reg <= #(10ns) b;
assign a = b_reg; // feedback b_reg = b = a_reg = a ... and multi-driver
assign b = a_reg; // feedback a_reg = a = b_reg = b ... and multi-driver

assign a = io_a_en ? a_data_500MHz : 'z;
assign b = io_b_en ? b_data_500MHz : 'z;

Как можно моделировать двустороннюю транспортную задержку?

2
Greg 14 Дек 2017 в 22:06

1 ответ

Лучший ответ

Двунаправленная транспортная задержка может быть достигнута за счет силы водителя с двунаправленной транспортной задержкой. Модель должна назначать сети более слабым драйверам, чем драйверы ввода-вывода. Это даст приоритет реальному драйверу и предотвратит конфликт драйверов.

Чтобы предотвратить петлю обратной связи, используйте мощность возбуждения в качестве квалификатора, чтобы решить, должна ли транспортная задержка назначать исходное значение или высокое Z. Самый простой способ определить мощность привода - использовать %v, см. IEEE Std 1800-2012 § 21.2.1.5 Формат силы

module bidi_delay #( parameter INERTIAL=0, TRANSPORT=10 ) (
    inout a, b
  );

  reg a2b, b2a;
  reg [23:0] a_strength, b_strength;

  always @(a) begin
    $sformat(a_strength, "%v", a);
    a2b <= #(TRANSPORT) (a_strength[23:16] == "S") ? a : 1'bz;
  end
  always @(b) begin
    $sformat(b_strength, "%v", b);
    b2a <= #(TRANSPORT) (b_strength[23:16] == "S") ? b : 1'bz;
  end

  assign (weak0,weak1) #(INERTIAL) a = b2a;
  assign (weak0,weak1) #(INERTIAL) b = a2b;
endmodule

Протестировано на EDAplayground с Aldec Riviera, Icarus Verilog и GPL Cver

5
Greg 18 Дек 2017 в 19:03