FPGA线上课程平台|最全栈的FPGA学习平台|FPGA工程师认证培训
登录
首页-所有问题-其他-正文

数字IC笔试高频题:如何用Verilog实现一个低功耗的时钟门控(Clock Gating)单元?

芯片爱好者小王芯片爱好者小王
其他
1个月前
0
0
58
准备数字IC设计的笔试,看到很多资料都提到低功耗设计是重点,其中时钟门控经常考。我知道大概原理,但具体用Verilog实现一个稳健的时钟门控单元时,有哪些需要注意的细节?比如如何避免毛刺(glitch)、如何同步使能信号、常见的电路结构是什么?希望能得到一个可以用于笔试的标准写法。
芯片爱好者小王

芯片爱好者小王

这家伙真懒,几个字都不愿写!
126871.70K
分享:
做数字IC或FPGA,35岁危机真的存在吗?资深工程师的核心竞争力是什么?上一篇
想做一个和“智慧农业”或“环境监测”相关的FPGA毕设,有什么具体的实现思路吗?下一篇
回答列表总数:6
  • 数字电路初学者

    数字电路初学者

    低功耗设计里,时钟门控是关键,但实现不好会引入功能问题。除了楼上说的锁存器+与门结构,笔试时可能还会问同步使能信号的问题。实际设计中,使能信号(en)通常来自同步时钟域,但为了绝对避免毛刺,最好再经过一个同步器(两级触发器)同步到主时钟clk,然后再送给时钟门控单元。这样虽然增加了一点延迟,但更稳健。代码可以扩展为:module clock_gating_sync (input clk, input async_en, output gated_clk); reg [1:0] sync_reg; reg en_latched; always @(posedge clk) sync_reg <= {sync_reg[0], async_en}; // 两级同步 always @(clk or sync_reg[1]) if (!clk) en_latched <= sync_reg[1]; assign gated_clk = clk & en_latched; endmodule。另一个常见考点是门控时钟的测试:由于门控时钟在使能无效时被关闭,扫描链测试会出问题。所以笔试可能会问如何解决,答案是使用测试模式信号(test_mode)旁路门控,在测试时让时钟直接通过。实现就是在与门之前加一个选择器:assign gated_clk = test_mode ? clk : (clk & en_latched)。把这些细节都答上,就显得很专业了。

    1个月前
  • 数字IC萌新

    数字IC萌新

    笔试里考时钟门控,核心就两点:功能正确和避免毛刺。标准写法是用一个锁存器(Latch)来锁住使能信号,再用与门输出门控时钟。为什么用锁存器不用触发器?因为用触发器会在时钟上升沿采样使能,如果使能信号在时钟高电平时变化,会导致输出时钟出现毛刺或半个周期。锁存器在时钟低电平时透明,能确保使能信号在整个时钟高电平期间稳定。Verilog代码很简单:module clock_gating (input clk, input en, output gated_clk); reg en_latched; always @(clk or en) if (!clk) en_latched <= en; assign gated_clk = clk & en_latched; endmodule。注意这里用always块描述了一个电平敏感的锁存器。笔试时把这个电路图画出来(一个低电平透明的锁存器加一个与门),再把代码写出来,基本分就拿到了。别忘了提一句:综合时需要设置避免将锁存器优化掉,通常用综合指令(如`// synopsys dc_script`)或调用工艺库里的标准时钟门控单元(ICG)。

    1个月前
  • 嵌入式学习者

    嵌入式学习者

    老兄,笔试考这个你别想复杂了。面试官就想看你懂不懂 latch-based gating 和 glitch-free。我分享个我常用的写法,重点是把组合逻辑和锁存分开写,更清晰:

    module clock_gate (
    input clk,
    input enable,
    output reg gclk
    );
    wire en_sync;
    reg latch_out;

    // 可选:同步使能信号,避免亚稳态
    sync_flop u_sync (.clk(clk), .din(enable), .dout(en_sync));

    // 电平敏感的锁存器,clk为低时透明
    always @() begin
    if (~clk)
    latch_out = en_sync; // 注意这里用阻塞赋值模拟锁存行为
    end

    // 门控时钟输出
    always @() begin
    gclk = clk & latch_out;
    end
    endmodule

    注意点:
    1. 锁存器部分用 always @() 和阻塞赋值,是描述电平敏感锁存的常见写法,笔试时可能要求你解释为什么不用非阻塞。
    2. 使能信号同步一般用两级触发器,但笔试时可能只让你画电路图,写代码时提一句就行。
    3. 绝对不要在 clk 的上升沿用 enable 直接与 clk,那样会产生毛刺,一写就扣分。

    最后记住,低功耗设计里时钟门控是关掉不用的模块时钟,你还可以提一下综合工具通常有集成单元(ICG),实际项目不用手写,但笔试得会。

    1个月前
  • 电路板调试员

    电路板调试员

    笔试里让你写时钟门控,核心就两点:防毛刺和同步使能。最稳妥的写法是教科书式的“与门-锁存器”结构。给你个可直接背的模板:

    module clk_gating (
    input clk,
    input en,
    input test_mode, // 可选项,用于测试
    output gated_clk
    );
    reg en_latch;
    always @(clk or en) begin
    if (!clk) // 注意这里是低电平锁存
    en_latch <= en;
    end
    assign gated_clk = clk && (en_latch || test_mode); // test_mode 旁路门控
    endmodule

    关键细节:锁存器用 clk 低电平时采样 en,这样在 clk 高电平期间 en_latch 稳定,避免了与门输出毛刺。笔试时一定写清楚注释,强调低电平锁存的原因。如果题目要求同步使能,可以在 en 输入前加一级 D 触发器同步,但注意这会引入一个周期延迟。

    1个月前
  • EE学生一枚

    EE学生一枚

    低功耗设计里时钟门控确实是笔试常客。除了基本结构,面试官可能还想看你考虑同步和亚稳态的问题。使能信号(enable)通常来自时钟域,但为了更稳健,最好先把它用 clk 同步一拍再送给门控单元,避免亚稳态传播。

    一个更完整的实现可以分成两步:先同步使能,再门控。

    module clock_gating_sync (
    input clk,
    input async_enable,
    output gated_clk
    );
    reg sync_enable;
    reg enable_latched;

    // 同步使能信号
    always @(posedge clk) begin
    sync_enable <= async_enable;
    end

    // 锁存器在时钟低电平时锁存同步后的使能
    always @() begin
    if (!clk) begin
    enable_latched = sync_enable;
    end
    end

    assign gated_clk = clk && enable_latched;
    endmodule

    注意点:锁存器部分用 always @() 和 if (!clk) 是常见的描述方式,综合工具能识别。但有些公司笔试可能要求避免 latch,那你可以说明实际中会用标准单元库里的 ICG cell,前端设计这样写只是行为级描述。另外,如果使能信号已经和 clk 同步,那同步寄存器可以省略,但为了通用性加上去更安全。笔试时可以根据题目要求选择写哪种。

    1个月前
  • 单片机初学者

    单片机初学者

    笔试里问这个,核心是让你写出一个带同步使能、无毛刺的时钟门控单元。别直接用组合逻辑与门,那样使能信号变化时会在时钟上产生毛刺。标准做法是用一个锁存器(latch)在时钟下降沿锁存使能信号,再用这个锁存输出和时钟做与操作。这样能确保使能切换只发生在时钟低电平期间,输出时钟就不会有毛刺了。

    Verilog 实现的话,可以这样写:

    module clock_gating (
    input clk,
    input enable,
    output gated_clk
    );
    reg enable_latched;
    always @(clk or enable) begin
    if (!clk) begin
    enable_latched <= enable;
    end
    end
    assign gated_clk = clk && enable_latched;
    endmodule

    注意这里用了电平敏感的锁存器(always @(clk or enable)),综合工具通常会识别成标准的 ICG(Integrated Clock Gating)单元。笔试时写这个结构,再解释下为什么用 latch 以及如何避免毛刺,基本就稳了。

    1个月前
我要回答answer.notCanPublish
回答被采纳奖励100个积分
FPGA线上课程平台|最全栈的FPGA学习平台|FPGA工程师认证培训
请先登录