2

凿子总是在灵敏度列表中生成只有时钟的块:

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

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

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

2 回答 2

4

3.2.0 之前的 Chisel 版本不支持异步复位。

看起来在 Chisel 中执行此操作的方法是使用同步重置:

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

有关该主题的更多讨论: https ://groups.google.com/forum/#!topic/chisel-users/4cc4SyB5mk8

于 2015-04-21T12:47:21.557 回答
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 中,添加了两个特征: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 网站上有更多关于重置的信息。

于 2020-05-20T16:58:32.730 回答