Моделирование времени Verilog: проверка времени по сравнению с no_notifier

#verilog

Вопрос:

Для моделирования уровня ворот, которое было аннотировано файлом SDF, при нарушениях настройки/удержания на триггере по умолчанию произойдет следующее:

  • (1) Вывод FF изменится на «X»
  • (2) будет сгенерировано утверждение о нарушении сроков

Но каков эффект notimingcheck стихов no_notifier ? Можете ли вы использовать оба этих флага компиляции Verilog вместе?

Вот мое предположение ниже: (Это правильно или просто неправильно?)

  • когда notimingcheck указано, пункт (2) отключен, и утверждение не будет сгенерировано
  • если no_notifier указано, что пункт (1) отключен, вывод не изменится на «X» (что хорошо для проектирования уровня затвора с несколькими доменами синхронизации).

Правильно или неправильно? или почти правильно?

Ответ №1:

Во-первых, эти два варианта не являются частью стандарта IEEE Std для Verilog (например, 1800-2017). Это означает, что их поведение определяется симулятором, и не все симуляторы гарантированно поддерживают их. Симуляторы, которые я использую в Cadence и Synopsys, действительно поддерживают их.

Во-вторых, поведение уведомителя зависит от того, как они используются в коде Verilog, и они являются необязательными. См. IEEE Std 1800-2017, раздел 31.6 Уведомители: пользовательские ответы на нарушения сроков. Большинство стандартных библиотек ячеек действительно используют их, но вам нужно взглянуть на код Verilog, чтобы увидеть, как они реализованы в вашем случае. Ваш FF может установить значение вывода X, когда уведомитель изменяет значение, но в целом это не относится к проверке времени.

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

 module tb;
    reg  [3:0] addr;
    wire [3:0] addr2 = addr;
    reg ntfy_reg_p;
    reg ntfy_reg_n;

    specify
        $width(posedge addr2, 50, 30, ntfy_reg_p);
        $width(negedge addr2, 50, 30, ntfy_reg_n);
    endspecify

    always @(ntfy_reg_p or ntfy_reg_n) begin
        $display("Error: width violation at %0t", $time);
    end

    initial begin
        $monitor("addr2 = %b, %0t", addr2, $time);
        #100 addr = 4'b0000;
        #40  addr = 4'b0100;    // get violation here
        #100 addr = 4'b0000;
        #100 addr = 4'b1111;
        #10 $finish;
    end
endmodule
 

Когда я запускаю симуляцию без включения каденции, я получаю предупреждение для конкретного симулятора и вижу свое пользовательское сообщение-уведомление Error :

 addr2 = xxxx, 0
addr2 = 0000, 100

Warning!  Timing violation
           $width( negedge addr2[2]:100 NS,  : 140 NS,  50 : 50 NS );
            File: ./tb.sv, line = 9
           Scope: tb
            Time: 140 NS

Error: width violation at 140
addr2 = 0100, 140
addr2 = 0000, 240
addr2 = 1111, 340
 

Когда я запускаю just no_notifier , я получаю предупреждение, но не ошибку. Это означает, что уведомитель был проигнорирован:

 addr2 = xxxx, 0
addr2 = 0000, 100

Warning!  Timing violation
           $width( negedge addr2[2]:100 NS,  : 140 NS,  50 : 50 NS );
            File: ./tb.sv, line = 9
           Scope: tb
            Time: 140 NS

addr2 = 0100, 140
addr2 = 0000, 240
addr2 = 1111, 340
 

Когда я запускаю just notimingchecks , я не получаю ни предупреждения, ни ошибки:

 addr2 = xxxx, 0
addr2 = 0000, 100
addr2 = 0100, 140
addr2 = 0000, 240
addr2 = 1111, 340
 

Когда я запускаю оба ( notimingchecks no_notifier ), я не получаю ни предупреждения, ни ошибки, как указано выше.

Все это согласуется с моей документацией по симулятору для этих опций.