加clock gate的基本原则是什么,怎么验证。
一般clock gate的基本原则是什么?
比如说,什么情况加clock gate合适,按面积大小,寄存器个数,或者其它?
en信号必需考虑那些条件?
还有什么其它的注意事项?
最重要的, 怎么做verification?
个人意见,供参考~
clock gate 为了低功耗。在不影响功能的情况下,尽量搞gate吧。当然是不是要考虑实现的难度。
至于verification ,有个思路
假设 gate_en --------------
| |
A1 A2
clock err |
----------
B1
clock right |
--------------------
B1
A1~A2是gate en 有效
出错的gate是clock的上升沿在这个区间内出现了。如果没出现认为正确。
这样就剩下几个时间做个减法判断 B1-A1>B1-A2则正确
不知道有没有说清楚~,个人愚见,可能有错误~
always @(posedge clk)
if(en)
data <= data_next
如果data位数比较多(》3?),就可以加clock gate
en去控制clk_gater 的使能
这种style的代码都是工具自动帮你做self clock gating的
fine-grained的clock gate, 让工具自己加就好了。 但是工具必定不可能太智能吧,更高level的clock gate 应该还是需要手工去加吧。
好想法,就是在使能clockgate和不使能clockgate的情况下做RTL<->RTL的Formal Verification。
还有没有其它的主流的验证方法啊?
clock gate不仅降低功耗而且会减小面积。不过clock gate的级数过多会导致大的latency。
隐式的clock gate不需要专门验证,属于formal的一个功能。
为啥会减小面积啊,比加clock gate前不是逻辑增加了么。。。
简单点可以看有gating的寄存器占的百分比
复杂点可以结合toggle rate计算功耗
目前的大部分formal工具都是验证组合逻辑,clock gate涉及时序逻辑,一般都是绕过
的。
时序逻辑formal的可以参考calypto的slec
你说的是时钟的源头
一gating,一大堆都gating了
always @(posedge clk)
if (en)
dout[127:0] <= din;
实际等效于:
assign tmp[127:0] = en? din : dout;
always @(posedge clk)
dout[127:0] <= tmp;
一共有128个mux2
换成clock gate:
assign clk_dout = en? clk : 1'b0; //伪代码
always @(posedge clk_dout)
dout[127:0] <= din;
同学习,所以没有enable 的reg bus 不能做clock gating。。。。
clock gating虽然是低功耗设计,但是加太多反而会浪费功耗的。PowerArtist可以帮你分析clock gating的efficiency,帮你比较加了clock gating节省的功耗跟引入的功耗的差值。当然还会告诉你哪里该加clock gate但是忘记加了。
请问apache对于CG优化前后的rtl是怎么做一致性检查的?
每个公司都有一致性检查的Flow,即便apache做检查了,也还是要去用s或者c家的tool再验证一下的,所以现在我们不检查。
哦,PowerArtist是在RTL做CG优化,还是像power compiler一样在网表上做?
RTL level计算和优化功耗,并且可以挑选最差的vector直接给后端做IR验证。
就是吃进RTL,吐出RTL?
那第三方的formal工具很难搞定前后两版RTL的一致性检查吧?
工具会产生类似SVF的guide文件给第三方formal工具吗?