真实面经题目 · 原创解析
Verilog 怎么写才能综合成 D 触发器?
这题考 RTL 时序模板,回答重点是用边沿触发 always 块、寄存器变量和非阻塞赋值描述 D 到 Q 的同步采样。
出现于:汇顶科技 · 数字 IC 设计
真实面经题目 · 原创解析
这题考 RTL 时序模板,回答重点是用边沿触发 always 块、寄存器变量和非阻塞赋值描述 D 到 Q 的同步采样。
要综合成 D 触发器,核心写法是用 `always @(posedge clk)` 或带异步复位边沿的时序 always 块,在时钟边沿把 D 赋给寄存器 Q。Q 必须是 reg 或 logic 类型,时序赋值用非阻塞赋值。若有复位,把复位分支写清楚;若有 enable,就在时钟边沿内部判断 enable,不使能时保持原值。不要用电平敏感 `always @(*)` 描述寄存器,也不要分支不完整导致锁存器。综合工具看到边沿敏感和寄存器赋值,就会映射成触发器。
D 触发器是在时钟有效边沿采样 D,并在 Q 上保持到下一次边沿。RTL 中要用边沿敏感事件控制描述这个采样行为,而不是组合逻辑敏感列表。
同步复位写在时钟边沿内部,异步复位把复位边沿加入敏感列表。使能信号也写在时钟边沿内部;不使能时没有赋新值,综合为带使能的触发器或等价结构。
时序块里用非阻塞赋值能表达同一时钟边沿寄存器同时更新,避免多个寄存器级联时仿真顺序和硬件行为不一致。
电平敏感 always、组合块分支不完整或条件保持可能综合成锁存器。面试时要主动说明触发器和锁存器的写法差异。
module dff_en_rst (
input wire clk,
input wire rst_n,
input wire en,
input wire d,
output reg q
);
always @(posedge clk or negedge rst_n) begin
if (!rst_n) begin
q <= 1'b0;
end else if (en) begin
q <= d;
end
end
endmodule 异步复位把复位边沿放入敏感列表,复位不等时钟生效;同步复位只对时钟边沿敏感,在时钟边沿内部判断复位。
非阻塞赋值表达寄存器在同一时钟边沿同时更新,避免仿真中因语句顺序造成和真实硬件不同的行为。
我会至少做仿真、lint、综合后资源检查、时序约束和 STA;涉及跨时钟域还要做 CDC 检查,涉及板级接口还要结合时序裕量和实测波形验证。