#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
), я не получаю ни предупреждения, ни ошибки, как указано выше.
Все это согласуется с моей документацией по симулятору для этих опций.