Игнорирование нарушений настройки / времени удержания в Modelsim при сохранении функциональности - PullRequest
0 голосов
/ 02 марта 2020

Я пытаюсь смоделировать verilog netlist с модулями, содержащими экземпляры из PDK стандартной библиотеки ячеек CMOS. Вот пример одного модуля:

module seq_edge_rise_det (d_out, d_clk, d_in);

output  d_out;

input  d_clk, d_in;

AD2D1 I10 ( .Z(d_out), .A2(I28QN), .A1(I57Q));

FD1D1 I57 ( .CK(d_clk), .Q(I57Q), .D(d_in), .QN(I57QN));

FD1D1 I28 ( .CK(d_clk), .Q(I28Q), .D(I57Q), .QN(I28QN));

endmodule

Определение стандартных экземпляров ячейки взято из файла Verilog, предоставленного основателем dry, и содержит определения / переменные времени установки и удержания. Вот пример:

`timescale 1ns/1ps
`celldefine

module FD1D1 (Q, QN, D, CK);
output Q, QN;
input  D, CK;
`protect
reg NOTIFIER;

supply1 xSN,xRN;

  buf     I0 (clk, CK);
  udp_fd4 I1 (n0, D, clk, xRN, xSN, NOTIFIER);
  and     I2 (rnsn, xRN, xSN);
  buf     I3 (Q, n0);
  not     I4 (QN, n0);

  specify
    specparam
    tplh$CK$Q     = 1.0,
    tphl$CK$Q     = 1.0,
    tplh$CK$QN    = 1.0,
    tphl$CK$QN    = 1.0,
    tsetup$D$CK   = 1.0,
    thold$D$CK    = 0.5,
    tminpwl$CK    = 1.0,
    tminpwh$CK    = 1.0;

    if (rnsn)
      (posedge CK *> (Q    +: D)) = (tplh$CK$Q,    tphl$CK$Q);
    if (rnsn)
      (posedge CK *> (QN   -: D)) = (tplh$CK$QN,   tphl$CK$QN);
    $setuphold(posedge CK &&& (rnsn == 1), posedge D, tsetup$D$CK, thold$D$CK, NOTIFIER);
    $setuphold(posedge CK &&& (rnsn == 1), negedge D, tsetup$D$CK, thold$D$CK, NOTIFIER);
    $width(negedge CK &&& (rnsn == 1), tminpwl$CK, 0, NOTIFIER);
    $width(posedge CK &&& (rnsn == 1), tminpwh$CK, 0, NOTIFIER); 

   endspecify
`endprotect
endmodule
`endcelldefine

При запуске симуляции с Questa (modelsim) я сталкиваюсь со следующими ошибками:

Ошибка: .... $ hold (posedge CK &&& (rnsn == 1): 47 нс, позиция D: 47 нс, 500 пс); # Время: 47 нс. Итерация: 1 Экземпляр: / seq_main / xI_seq_adc_sram_xfer / xI_seq_control / I6 / I4

Поскольку я не заинтересован в проверке синхронизации модуля, а просто в функциональной симуляции, я хотел бы чтобы Modelsim игнорировал эти ошибки, но сохранял функциональность модуля. Как мне это сделать? В настоящее время из-за этих ошибок выходные данные триггеров получают состояние «X», которое не позволяет мне проверить модуль.

В качестве альтернативы, чтобы запустить симуляцию, PDK также содержит Liberty (.lib) файл с временной информацией о стандартных ячейках. Как можно легко конвертировать .lib файл в .sdf для подачи в Modelsim?

...