System Verilog: распространение эффектов блока синхронизации

Рассмотрим следующий фрагмент кода SV:

module clocks();

  logic a ;
  bit  clk =0;

  initial begin
    forever  #1ns clk = ~clk ;
  end



  clocking cb@(posedge clk);
    default input #1step output negedge;
    output a;
  endclocking

  initial begin
    @(cb);
    #100ps;
    cb.a <= 1 ;
    @(cb);
    #100ps;
    cb.a <= 0 ;
    repeat(10) @(cb);
  end

endmodule
A signal changes after 100ps after the clocking block event through an output synchronous drive. I observe a different behavior while running it with two EDA simulators. With the first simulator, the clocking block output a acts on the second posedge, with the signal changing on the second falling edge. You can see the image below. First simulator

С другой стороны, во втором имитаторе выходной сигнал блока синхронизации воздействует на ПЕРВЫЙ тактовый сигнал, и эффекты можно увидеть на первом спадающем фронте тактового сигнала. Вы можете увидеть изображение ниже. Второй симулятор

Если, с другой стороны, я изменяю задержку перекоса вывода, используя задержку меньше (примерно 10 пс), чем задержка 100 пс, второй симулятор ведет себя как первый (сигнал a изменяется после второго posedge с перекосом вывода 10ps).

Какой из двух симуляторов более соответствует стандарту IEEE 1800-2017 SV? На мой взгляд, по моему представлению о стандарте, первый тренажер более послушен.

Шкала времени установлена ​​на 1 фс, чтобы избежать проблем, связанных с разрешением симулятора.


person atadocca    schedule 24.03.2021    source источник


Ответы (1)


Второй симулятор (с неожиданным поведением negedge) - это VCS. Я нашел следующую информацию о Solvnet:

Улучшенное поведение блока синхронизации, когда перекос является negedge / posedge. По умолчанию VCS переопределяет событие синхронизации с перекосом, когда перекос задан как posedge / negedge. Однако вы можете использовать параметр -ntb_opts no_cb_edge_override, чтобы избежать переопределения события синхронизации на входе, выходе и входе. Ниже приводится поведение этой опции в разных направлениях синхронизации: • Вход: значение выбирается с указанной задержкой перекоса синхронизации перед событием синхронизации, и обновление происходит в событии синхронизации. • Выходные данные: выходные данные обновляются с указанной задержкой перекоса синхронизации после события синхронизации. 1

Не знаю, почему у VCS такое поведение, но с флагом -ntb_opts no_cb_edge_override моделирование запускается как в Questa.

person atadocca    schedule 24.03.2021