Как создать асинхронный сброс 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 есть дополнительная информация о сбросах.