Возможный обходной путь для сброса необходимости asyn c? - PullRequest
2 голосов
/ 14 февраля 2020

Я хотел бы иметь регистр с асинхронным c сигналом сброса, например:

always @(posedge clk or negedge rst_n)
begin
    if(!rst_n)
        out <= 1'b0
    else
        out <= in
end

Я пробовал классы AsyncReset() и withReset(). Тем не менее, сгенерированный код использует сброс настроек и переменная AsyncReset() не принимает !.

Есть ли обходной путь для этого?

Ответы [ 2 ]

2 голосов
/ 19 февраля 2020

Мне показалось, что быстрый комментарий Джека о том, как избежать сбоев, заслуживает более подробного объяснения.

Использование асинхронного сброса создает второй тактовый элемент c в дизайне, от сброса до конечного флопа. Сигнал сброса может быть заявлен в любое время, но его необходимо деактивировать синхронно с часами, иначе флоп может стать метастабильным.

Обычный способ сделать это - использовать синхронизатор сброса.
https://scastie.scala-lang.org/hutch31/EPozcu39QBOmaB5So6fyeA/13

Синхронизатор, показанный в приведенном выше коде, кодируется непосредственно в Verilog как Я не знаю, как удержать оптимизатор FIRRTL от постоянной оптимизации. Лог c после сброса syn c может быть либо syn c, либо asyn c reset.

2 голосов
/ 14 февраля 2020

Хотя вы не можете напрямую инвертировать тип AsyncReset (обычно применение logi c к AsyncReset плохо, поскольку оно может давать сбой), вы можете привести к типу Bool и обратно:

  val reset_n = (!reset.asBool).asAsyncReset
  val reg = withReset(reset_n)(RegInit(0.U(8.W)))

Runnable пример: https://scastie.scala-lang.org/ERy0qHt2Q3OvWIsp9qiiNg

...