Altifigence Academy

14 / 37 · 概念

触发器、enable 与控制优先级

用下一状态表达式定义保持、装载与复位,避免无意的时钟门控。

寄存器存储下一状态函数的结果

将时钟边沿前的值记为 QkQ_k,在边沿采纳的输入记为 DkD_k,更新后的值记为 Qk+1Q_{k+1}。reset 优先、enable 次之的寄存器寄存器 存储多位状态的电路。本课程中的同步寄存器在时钟边沿存储指定输入。了解更多如下。

Qk+1={0rk=1Dkrk=0, ek=1Qkrk=0, ek=0Q_{k+1}=\begin{cases} 0 & r_k=1\\ D_k & r_k=0,\ e_k=1\\ Q_k & r_k=0,\ e_k=0 \end{cases}

enable=0 时,即使输入 D 改变,存储值也保持不变。在 RTL 中省略这一保持路径,与在组合电路中漏写赋值不同;时序块中的保持行为是寄存器规格的一部分。

SystemVerilog
module enabled_register (
  input logic clk, rst, en,
  input logic [7:0] d,
  output logic [7:0] q
);
  always_ff @(posedge clk) begin
    if (rst) q <= 8'b0;
    else if (en) q <= d;
  end
endmodule

此电路采用同步高有效复位。reset 与 enable 在同一边沿均为 1 时,存储值为 0。改变判断顺序会改变功能,因此不能只在注释中写优先级,还应在代码与测试中明确体现。

每列记录一个上升沿上升沿 时钟从 0 变为 1 的瞬间。它不同于表示整个 CLK=1 区间的电平。了解更多的观察结果。输入取自边沿前,名称带 after 的状态取自更新后。列的排列表示采样顺序,并非描绘物理传播延迟传播延迟 从输入变化到输出稳定为正确值所需的时间。逻辑表达式等价与时间特性是两回事。了解更多。初始 Q=0xA5;第一列为保持,第二列为写入,第三列为 reset 与 enable 同时有效。

reset、enable、hold 的优先级
查看波形数据
波形数据:每个字符表示一个区间,点表示保持前一状态,p 表示一个时钟周期。
信号波形总线值
edge2345E0 → E1 → E2 → E3
reset0.10
enable01.0
D2.343C → 99 → 77
Q after234.A5 → 3C → 00

enable 不是直接切断时钟的信号

若随意使用 gated_clk = clk & en 这样的组合表达式作为时钟,en 的变化可能产生窄脉冲或意外边沿。时钟使能 RTL 映射到何种单元,由综合与实现流程决定。用于降低功耗的时钟门控应单独设计,并以合适的单元和时序验证为前提。

reset、load、enable 等控制重叠时,才能显露需要验证的优先级。只逐个打开单一控制并不充分。例如 q=A5、en=0、d=3C 时应保持;下一边沿 en=1 时应存入 3C。

自己试试

从 q=0xA5 开始,经过 rst=1、en=1、d=0x3C 的边沿,再令 rst=0、en=0。两个边沿之后 q 分别是多少?

阅读解释

第一边沿 reset 优先,结果为 0;下一边沿 enable 为 0,因此仍为 0。若把 reset 写在 en 条件内部,可能漏掉 en=0 时的复位,因此也必须单独检查这一组合。

你的选择适用于此浏览器,可随时在页脚更改。