如何生成异步重置verilog总是用凿子阻塞



Chisel始终生成感应列表中只有时钟的块:

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

是否可以将模块配置为使用异步重置并生成这样的始终块?

always @(posedge clk or posedge reset) begin
[...]
end
3.2.0之前的Chisel版本不支持异步重置。

看起来在Chisel中这样做的方法是使用同步重置:

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

有关该主题的更多讨论:https://groups.google.com/forum/#!主题/凿用户/4cc4SyB5mk8

自Chisel 3.2.0以来,支持同步、异步和抽象重置类型。根据明确指定或推断的重置类型,您将获得规范的同步或异步Verilog输出。

为了更充分地展示这一点,考虑以下MultiIOModule,它有三个重置:

  • 具有抽象重置类型的隐式reset输入(这是"抽象重置")
  • 具有Bool类型的显式syncReset输入(这是"同步重置")
  • 具有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
}

当使用(new ChiselStage).emitVerilog(new Foo):进行编译时,这将生成以下Verilog

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中添加了两个性状:RequireSyncResetRequireAsyncReset。这些可用于将连接到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网站有更多重置信息。

最新更新