在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 11835|回复: 25

[求助] 关于RTL中Feedthroughs的问题

[复制链接]
发表于 2011-7-18 14:58:27 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

x
最近在看《Principles of VLSI RTL Design》,书中提到一种 Feedthoughs 现象,是不是翻译成 馈通,它的解释是  3个触发器移位触发器,
A-B-C,如果在一个clock周期内,A直接到C,就是feedthouhs。

其中,它提到一个例子,

always @(posedge clk)
q1<=d;

always @(posedge clk_div)
q2<=q1;


always @(posedge clk)
clk_div<=~clk_div;

这种情况下,有可能d直接到q2,发生feedthougs现象。如果将clk_div改为阻塞赋值,就不会发生feedthoughs现象。

可是我将这里个代码综合后结果一样,有谁帮我解释下 到底feedthoughs是什么,对RTL设计有什么影响。

                               
登录/注册后可看大图

无标题.jpg
 楼主| 发表于 2011-7-18 19:31:15 | 显示全部楼层
没人回答,还是没问清楚
发表于 2011-7-18 20:31:24 | 显示全部楼层
不要轻易地用前一级的输出作为后一级的clock。
实际电路中,clk_div肯定比clk有延迟。
如果做得不好,clk_div到达后一级的延迟有可能比q1到达下一级的延迟要大。
这种情况下,clk上升沿使d传播到q1,并使clk_div产生上升沿。
而由于clk_div的延迟更大,所以刚到达下一级的q1立刻在clk_div的上升沿下被送到了q2端。
我理解这应该就是你说的Feedthroughs问题。
发表于 2011-7-20 23:36:09 | 显示全部楼层
本帖最后由 xiaocanmeng 于 2011-7-21 14:31 编辑

DC综合应该极有可能综合出一样的电路。
但是simulation的话由于非阻塞赋值的原因以及仿真时间队列流,clk_div的上升沿肯定在clk上升沿之后,因此会产生feedthrough。这回产生simulation和综合的mismatch。
有机会可以做个小实验试一试。
发表于 2011-7-21 13:56:20 | 显示全部楼层
仿真了一下,果然会发生所谓的feedthrough啊。
Copy of ScreenClip.bmp
发表于 2011-7-21 13:58:22 | 显示全部楼层
module test1(clk,d,rstn,q2);
input clk,d,rstn;
output q2;
reg q2,q1;
reg clk_div=0;
always @(posedge clk)
q1<=d;

always @(posedge clk_div)
q2<=q1;


//always @(posedge clk)
always @(posedge clk or negedge rstn)
        if(~rstn) clk_div<=1'b0;
        else clk_div<=~clk_div;
endmodule
发表于 2011-7-21 13:59:03 | 显示全部楼层
`timescale 1ns/1ns
module tb;
reg d,clk,rstn;
wire q2;
test1 u_test1(clk,d,rstn,q2);
initial begin
        $fsdbDumpfile("test1.fsdb");
        $fsdbDumpvars;
        d=1'b0;
        rstn=1'b1;
        #7 rstn=1'b0;
        #10 rstn=1'b1;
        #1 d=1'b1;
        #20 d=1'b0;
        #10 d=1'b1;
        #20 d=1'b0;
        #20 d=1'b1;
        #10 d=1'b0;
        #100 $finish;
end
initial begin
        clk=0;
        forever #5 clk=~clk;
end
endmodule
发表于 2011-7-21 14:34:40 | 显示全部楼层
如果用阻塞赋值写clk_div的话,clk_div先于q1之前更新,然后产生了一个clk_div的上升沿,会触发q2的更新,可能clk和clk_div的上升沿可以认为是同一时间点,这样q1和q2同时更新,所以不会产生feedthrough。
只是猜测。
发表于 2011-7-21 17:26:29 | 显示全部楼层
当使用分频后的子时钟(divide clock)去取样源时钟(source clock)的数据(data),不可避免的会出现馈通现象(feedthrough phenomenon),也可能会出现时序违约(timing violation),除非对某一条路径做延迟处理,加入足够的延迟单元(delay cell)或者缓冲器(buffer)
发表于 2011-7-21 23:48:55 | 显示全部楼层
这个是个好帖子啊,留名观看……
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /2 下一条

小黑屋| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-6-12 00:26 , Processed in 0.028573 second(s), 8 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表