如何使用凿子生成异步重置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