Как создать асинхронный сброс verilog всегда блокирует с помощью долота

Долото генерирует всегда блоки с только часами в списке чувствительности:

always @posedge(clk) begin
  [...]
end

Можно ли настроить модуль на использование асинхронного сброса и генерировать всегда такой блок?

always @(posedge clk or posedge reset) begin
   [...]
end

1 ответ

Решение

Похоже, что этот вопрос был задан в других местах на веб-сайтах... ответ заключается в том, что у Chisel изначально нет этой функциональности, встроенной в него.

Похоже, что способ сделать это в Chisel заключается в использовании синхронного сброса:

always @posedge(clk) begin
  if (reset) begin
  [...]
  end 
  else 
  [...]
  end
end

Для получения дополнительной информации по этой теме: https://groups.google.com/forum/.

Начиная с Chisel 3.2.0, есть поддержка синхронного, асинхронного и абстрактного типов сброса. В зависимости от явно указанного или предполагаемого типа сброса вы получите канонический синхронный или асинхронный вывод Verilog.

Чтобы попытаться показать это более полно, рассмотрим следующие MultiIOModule который имеет три сброса:

  • Неявный reset вход с абстрактным типом сброса (это "абстрактный сброс")
  • Явный syncReset вход, который имеет Bool типа (это "синхронный сброс")
  • Явный asyncReset вход, который имеет AsyncReset тип (это "асинхронный сброс")

С помощью withResetзатем можно использовать определенные соединения сброса для разных регистров в проекте:

import chisel3._
import chisel3.stage.ChiselStage

class Foo extends MultiIOModule {
  val syncReset  = IO(Input(Bool()      ))
  val asyncReset = IO(Input(AsyncReset()))

  val in          = IO(Input( Bool()))
  val outAbstract = IO(Output(Bool()))
  val outSync     = IO(Output(Bool()))
  val outAsync    = IO(Output(Bool()))

  val regAbstract =                         RegNext(in, init=0.U)
  val regSync     = withReset(syncReset)  { RegNext(in, init=0.U) }
  val regAsync    = withReset(asyncReset) { RegNext(in, init=0.U) }

  outAbstract := regAbstract
  outSync     := regSync
  outAsync    := regAsync
}

Затем при компиляции с помощью этого создается следующий Verilog: (new ChiselStage).emitVerilog(new Foo):

module Foo(
  input   clock,
  input   reset,
  input   syncReset,
  input   asyncReset,
  input   in,
  output  outAbstract,
  output  outSync,
  output  outAsync
);
  reg  regAbstract;
  reg  regSync;
  reg  regAsync;
  assign outAbstract = regAbstract;
  assign outSync = regSync;
  assign outAsync = regAsync;
  always @(posedge clock) begin
    if (reset) begin
      regAbstract <= 1'h0;
    end else begin
      regAbstract <= in;
    end
    if (syncReset) begin
      regSync <= 1'h0;
    end else begin
      regSync <= in;
    end
  end
  always @(posedge clock or posedge asyncReset) begin
    if (asyncReset) begin
      regAsync <= 1'h0;
    end else begin
      regAsync <= in;
    end
  end
endmodule

Примечание: в Chisel 3.2 абстрактный сброс верхнего уровня всегда будет установлен на синхронный сброс. В Chisel 3.3.0 были добавлены две особенности:RequireSyncReset а также RequireAsyncReset. Их можно использовать для изменения типа сброса регистра, подключенного кregAbstractот синхронного к асинхронному. Перекомпилируем дизайн с(new ChiselStage).emitVerilog(new Foo with RequireAsyncReset), меняет regAbstract логика

always @(posedge clock or posedge reset) begin
  if (reset) begin
    regAbstract <= 1'h0;
  end else begin
    regAbstract <= in;
  end
end

Для получения дополнительной информации на веб-сайте Chisel есть дополнительная информация о сбросах.

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