如何使用凿子生成异步重置verilog always块

如何使用凿子生成异步重置verilog always块,verilog,fpga,chisel,Verilog,Fpga,Chisel,凿子始终生成只有时钟在敏感度列表中的块: always @posedge(clk) begin [...] end 是否可以将模块配置为使用异步重置并生成这样的always块 always @(posedge clk or posedge reset) begin [...] end 3.2.0之前的凿子版本不支持异步重置 在凿子中执行此操作的方法似乎是使用同步重置: always @posedge(clk) begin if (reset) begin [...] e

凿子始终生成只有时钟在敏感度列表中的块:

always @posedge(clk) begin
  [...]
end
是否可以将模块配置为使用异步重置并生成这样的always块

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

3.2.0之前的凿子版本不支持异步重置

在凿子中执行此操作的方法似乎是使用同步重置:

always @posedge(clk) begin
  if (reset) begin
  [...]
  end 
  else 
  [...]
  end
end
有关此主题的更多讨论,请参见:

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

试图更充分地显示这一点,考虑下面的<代码> MuliIOMoDule<代码>,它有三个重置:

  • 隐式
    reset
    输入,具有抽象重置类型(这是“抽象重置”)
  • 显式
    syncReset
    输入,具有
    Bool
    类型(这是“同步重置”)
  • 显式
    asyncReset
    输入,具有
    asyncReset
    类型(这是“异步重置”)
使用带重置的
,特定的重置连接可用于设计中的不同寄存器:

import.3_
导入凿子3.stage.givestage
类Foo扩展了多IOmodule{
val syncReset=IO(输入(Bool())
val asyncReset=IO(输入(asyncReset()))
val in=IO(输入(Bool())
val outAbstract=IO(输出(Bool())
val outSync=IO(输出(Bool())
val outAsync=IO(输出(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-stage)。emitVerilog(new-Foo)


欲了解更多信息,.

Hi,将
与RequireAsyncReset一起递归地影响子模块?混合使用可能会产生这种效果。顶部的抽象重置被强制为
AsyncReset
。然后,连接到此重置行的子模块将转换为
AsyncReset
(或者,如果将
AsyncReset
连接到
Bool
),则会导致失败。似乎只有默认的
reset
受此特性影响。在顶级模块中明确声明为
Reset()
的重置不受
RequireAsyncReset
特性的影响,并触发firrtl错误
抽象重置不允许作为顶级输入:io.rst
。有什么解决方法吗?或者让这些顶级重置为它们应该的重置类型(
Bool
AsynReset
),或者,如果您确实希望在顶级中进行抽象重置,并试图生成不同的版本,则使用带有具体重置类型的
RawModule
包装器,并与抽象重置进行连接。这对你的情况有用吗?
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
always @(posedge clock or posedge reset) begin
  if (reset) begin
    regAbstract <= 1'h0;
  end else begin
    regAbstract <= in;
  end
end