文章目录
clk gating主要用于低功耗,本文主要从verilog的使用方法上进行介绍,仅供参考。~~~
1.2 clk gating
原理为clk_en使能之后才会将clk_in输出,减少子模块动态翻转,但是clock_en的使用并不是异步使用,在clk_in为低电平时同步进clk_in时钟域。具体原因见时序图。
module e203_clkgate (
input clk_in,
input test_mode,
input clock_en,
output clk_out
);
reg enb;
always@(*)
if (!clk_in)
enb = (clock_en | test_mode);
assign clk_out = enb & clk_in;
endmodule
clk_en一开始与clk_in为异步关系,直接与操作的话可能导致某些clk输出时钟周期不完整,例如导致clk_1时钟出错。当采用同步之后的enb信号之后,输出的clk_2的每一个时钟周期都是完整的时钟。
易错点:采用上述方法一般会在时钟之间引入延时,ASIC设计时Synopsys会考虑这一延时作相应优化。
当FPGA设计时直接用逻辑如此设计时,存在仿真与上板结果不一致的可能,一种是利用内置clk_gate原语解决,或者直接采用pass through的方法clk_out=clk_in。
参考文档
【1】https://github.com/Lichee-Pi/Tang_E203_Mini/blob/master/src/e203_clkgate.v