【问题标题】:Possible workaround for async negedge reset?异步 negedge 重置的可能解决方法?
【发布时间】:2020-02-14 15:43:01
【问题描述】:

我想要一个带有异步复位信号的寄存器,如下所示:

always @(posedge clk or negedge rst_n)
begin
    if(!rst_n)
        out <= 1'b0
    else
        out <= in
end

我尝试了AsyncReset() 和withReset() 课程。但是生成的代码使用了posedge重置,AsyncReset()的变量不接受!。

有什么解决方法吗?

【问题讨论】:

  • 您是否尝试不使用 negedge 关键字?您可以对任何 rst_n 更改采取行动,而不是专注于任何边缘...(或者至少在 verilog/vhdl 中可以)

标签: reset chisel


【解决方案1】:

虽然您不能直接反转 AsyncReset 类型(通常将逻辑应用于 AsyncReset 是不好的,因为它可能会出现故障),但您可以转换为 Bool 并返回:

  val reset_n = (!reset.asBool).asAsyncReset
  val reg = withReset(reset_n)(RegInit(0.U(8.W)))

可运行示例:https://scastie.scala-lang.org/ERy0qHt2Q3OvWIsp9qiiNg

【讨论】:

    【解决方案2】:

    我认为杰克关于避免故障的快速评论值得更长的解释。

    使用异步复位在设计中创建了第二个时序弧,从复位到结束触发器。复位信号可以随时置位,但需要与时钟同步取消置位,否则触发器会变为亚稳态。

    执行此操作的常用技术是使用重置同步器。
    https://scastie.scala-lang.org/hutch31/EPozcu39QBOmaB5So6fyeA/13

    上面代码中显示的同步器直接在 Verilog 中编码,因为我不知道如何通过不断优化来防止 FIRRTL 优化器被修剪。复位同步的下游逻辑可以是同步或异步复位。

    【讨论】:

    • 感谢您添加这个额外的上下文,重要的是要理解禁止时钟和 AsyncReset 信号上的逻辑有充分的理由,尽管我同意也许我们应该允许反转,因为据我了解这是安全的。
    • 异步复位的反转应该是安全的,但是时钟或异步复位网络通常都不应该有逻辑,因为它们是由 PNR 工具专门处理的。转向同步复位的大部分原因是它消除了将复位视为“特殊”网络的需要。
    猜你喜欢
    • 2015-10-22
    • 1970-01-01
    • 1970-01-01
    • 2017-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-12
    相关资源
    最近更新 更多