Как сгенерировать асинхронный сброс Verilog всегда блокирует долотом

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

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

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

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

person FabienM    schedule 21.04.2015    source источник


Ответы (2)


Начиная с 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.

person seldridge    schedule 20.05.2020
comment
Привет, будет ли with RequireAsyncReset рекурсивно влиять на подмодули? - person Hoohoo; 18.06.2020
comment
Смешивание этого, вероятно, будет иметь такой эффект. Абстрактный сброс в верхней части принудительно AsyncReset. Субмодули, подключенные к этой линии сброса, будут затем преобразованы в AsyncReset (или приведут к сбою, если вы подключите AsyncReset к Bool). - person seldridge; 18.06.2020
comment
похоже, что эта черта влияет только на значение по умолчанию reset. Сбросы, которые были явно объявлены как Reset() в модуле верхнего уровня, не затрагиваются чертой RequireAsyncReset и вызывают первую ошибку Abstract Reset not allowed as top-level input: io.rst. Любое обходное решение? - person Hoohoo; 23.06.2020
comment
Либо сделайте эти сбросы верхнего уровня типом сброса, которым они должны быть (Bool или AsynReset), либо, если вы хотите абстрактный сброс на верхнем уровне и пытаетесь создать разные версии, используйте оболочку RawModule с конкретными типами сброса и сделайте подключения к вашим абстрактным сбросам. Подойдет ли это для вашей ситуации? - person seldridge; 23.06.2020

Версии Chisel до 3.2.0 не поддерживают асинхронный сброс.

Похоже, в Chisel это можно сделать с помощью синхронных сбросов:

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

Дополнительные обсуждения по теме: https://groups.google.com/forum/#!topic/chisel-users/4cc4SyB5mk8

person Russell    schedule 21.04.2015