Утверждение PSL для конвейера с переменной задержкой

Я пытаюсь написать утверждение PSL, которое проверяет, соответствует ли количество утверждений на входе количеству утверждений на выходе.

Например:

.

На входе все может произойти в любое время, и вывод может быть заявлен в любое время. Точное время неизвестно и тоже не важно. Я хочу убедиться, что никакая информация не пропадает.

Я придумал следующее утверждение PSL, чтобы проверить это. Это сильное утверждение, означающее, что в конце теста все утверждения должны быть "завершены".

assert always { input='1' |-> {[*] ; output='1'} }!;

Например, следующее должно быть ошибкой, но этот PSL проходит:

Я заметил, что это утверждение не является сильным, потому что разные входные утверждения могут соответствовать одному и тому же выходному утверждению. Например:

Каким будет хороший способ реализовать такой PSL? Очевидно, я также могу проверить это другими способами (подсчет входных и выходных утверждений), но есть ли способ сделать это с помощью PSL? Есть ли эквивалентная проверка, которую я мог бы реализовать с помощью SVA?

1 ответ

Возможно, мне здесь что-то не хватает, но почему бы просто не реализовать счетчики и не сравнить их в конце теста?

always @(posedge clk) bgein
  if (reset) begin
    counter_in <= 0;
    counter_out <= 0;
  end else begin
    if (input_) counter_in++;
    if (output_) counter_out++;
  end
end 
final begin
  assert (counter_in == counter_out);
end

даже если вы переполнитесь, он все равно будет работать.

Другие вопросы по тегам