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

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

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 96570|回复: 131

[原创] Verilog基本电路设计之一(单bit跨时钟域同步)

[复制链接]
发表于 2016-6-15 17:31:46 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 杰克淡定 于 2016-6-21 19:37 编辑

     看到坛子里不少朋友,对于基本数字电路存在这样那样的疑惑,本人决定开贴,介绍数字电路最常见的模块单元,希望给初学者带来帮助,也欢迎大佬们前来拍砖。如果想要做数字设计,下面这些电路是一定会碰到的,也是所有大型IP,SOC设计必不可少的基础,主要包括异步信号的同步处理,同步FIFO,异步FIFO,时钟无缝切换,信号滤波debounce等等,后面会根据大家反馈情况再介绍新电路。
     首先介绍异步信号的跨时钟域同步问题。一般分为单bit的控制信号同步,以及多bit的数据信号同步。多bit的信号同步会使用异步FIFO完成,而单bit的信号同步,又是时钟无缝切换电路以及异步FIFO电路的设计基础,这里先介绍单bit信号同步处理。

     clka域下的信号signal_a,向异步的clkb域传递时,会产生亚稳态问题。所有的亚稳态,归根结底就是setup/hold时间不满足导致。在同一个时钟域下的信号,综合以及布线工具可以在data路径或者clock路径上插入buffer使得每一个DFF的setup/hold时间都满足;但是当signal_a在clkb域下使用时,由于clka与clkb异步,它们的相位关系不确定,那么在clkb的时钟沿到来时,无法确定signal_a此时是否处于稳定无变化状态,也即setup/hold时间无法确定,从而产生亚稳态。这种异步信号在前后端流程里面是无法做时序分析的,也就是静态时序分析里常说的false_path。

      消除亚稳态,就是采用多级DFF来采样来自另一个时钟域的信号,级数越多,同步过来的信号越稳定。对于频率很高的设计,建议至少用三级DFF,而两级DFF同步则是所有异步信号处理的最基本要求。

       单bit的信号跨时钟域同步,又分成电平信号同步以及脉冲信号同步。电平信号,就是说clka下的信号signal_a在clkb看来,是一个很宽的信号,会保持多个clkb的时钟周期,一定能被clkb采到。这种情况,只需要使用clkb用至少两级DFF连续抓signal_a即可,特别需要强调的是,此时signal_a必须是clka下的寄存器信号,如果signal_a是clka下的组合逻辑信号,一定要先在clka下用DFF抓一拍,再使用两级DFF向clkb传递。这是因为clka下的组合逻辑信号会有毛刺,在clka下使用时会由setup/hold时间保证毛刺不会被clka采到,但由于异步相位不确定,组合逻辑的毛刺却极有可能被clkb采到。电平信号的同步处理,一般用于知道确定的时钟频率大小关系或者极慢时钟下的信号向极快时钟域传递时使用,简单处理如下:

always @ (posedge clkb or negedge rst_n)
begin
    if (!rst_n) begin
       levl_b_d1 <= #DLY 1'b0;
       levl_b_d2 <= #DLY 1'b0;
       levl_b_d3 <= #DLY 1'b0;
    end
    else begin
       levl_b_d1 <= #DLY levl_a_in;
       levl_b_d2 <= #DLY levl_b_d1;
       levl_b_d3 <= #DLY levl_b_d2;
    end
end

assign puls_b_pos = levl_b_d2 & (~levl_b_d3);
assign puls_b_neg = levl_b_d3 & (~levl_b_d2);
assign levl_b_out  = levl_b_d2;

上面三个输出分别是经过同步之后,clkb下可以使用的0变1脉冲信号,1变0脉冲信号以及电平信号。再次强调:levl_a_in必须是clka的DFF信号

下面是更常见的,clka下的脉冲信号,同步到clkb时钟域下,它对于clka与clkb的时钟频率关系没有任何限制,快到慢,慢到快都没问题。其主要原理就是先把脉冲信号在clka下展宽,变成电平信号,再向clkb传递,当确认clkb已经“看见”信号同步过去之后,再清掉clka下的电平信号。脉冲信号同步处理电路,有两个地方使用了上面的电平信号同步处理原则,请仔细揣摩原因。详细见下面的RTL,其中省略了信号定义声明:


module sync_pulse (
                  // input
                  rst_n             , // system reset
                  clka               , // clockA
                  clkb               , // clockB
                  puls_a_in       , // pulse input from clka
                  // output
                  puls_b_out     , // pulse output in clkb
                  levl_b_out        // level output in clkb
                  );

parameter         DLY      =  1   ; //

always @ (posedge clka or negedge rst_n)
begin
    if (rst_n == 1'b0)
        signal_a <= # DLY 1'b0 ;
    else if (puls_a_in)
        signal_a <= # DLY 1'b1 ;
    else if (signal_b1_a2)
        signal_a <= # DLY 1'b0 ;
    else ;
end

always @ (posedge clkb or negedge rst_n)
begin
    if (rst_n == 1'b0)
        signal_b <= # DLY 1'b0 ;
    else
        signal_b <= # DLY signal_a ;
end

always @ (posedge clkb or negedge rst_n)
begin
    if (rst_n == 1'b0) begin
        signal_b_b1 <= # DLY 1'b0 ;
        signal_b_b2 <= # DLY 1'b0 ;
    end
    else begin
        signal_b_b1 <= # DLY signal_b ;
        signal_b_b2 <= # DLY signal_b_b1 ;
    end
end

always @ (posedge clka or negedge rst_n)
begin
    if (rst_n == 1'b0) begin
        signal_b1_a1 <= # DLY 1'b0 ;
        signal_b1_a2 <= # DLY 1'b0 ;
    end
    else begin
        signal_b1_a1 <= # DLY signal_b_b1 ;
        signal_b1_a2 <= # DLY signal_b1_a1 ;
    end
end

assign puls_b_out = signal_b_b1 & (~signal_b_b2) ;
assign levl_b_out = signal_b_b1 ;

endmodule

下一篇讲时钟切换电路。

留下一个思考题:clka下的同一个寄存器信号signal_a,电平宽度对clkb而言足够长,如果同时调用两个相同的电平同步模块向clkb时钟传递,分别得到levl_b1和levl_b2,那么在clkb时钟域下看到的lev_b1和levl_b2信号是否一样?
这个问题是实际设计中一不小心就会犯错的,如果能够想明白正确回答这个问题,异步信号的理解就可以过关了。
发表于 2016-6-15 21:36:18 | 显示全部楼层
本帖最后由 silencefpga 于 2016-6-15 23:14 编辑

基本赞成楼主的看法,不过两级同步器是建立在一个特定的条件上面的:假设clkb的 是周期为T,那么必须满足 第一级Tco + 第一级输出数据恢复稳定时间 + 第一级触发器输出到第二级触发器输入端的路径传输延时为Tnet + 第二级的Tsu < T 才可以避免亚稳态的发生,满足不了这个条件就是打N拍都是无用的。当然一般来讲,一拍不行,多大几拍,只要工具布线的时候按照设计者的想法: 尽可能缩短第一级触发器输出到第二级触发器输入端的路径传输延时为Tnet的方式去把多级寄存器都插在中间的话,是可以避免亚稳态的。
呵呵, 这就是我们常说的: 时序是设计出来的,时序也是约束出来的。

------------------------
IC / FPGA 逻辑开发:
1.千兆/万兆以太网MAC
2.OTN / SDH 接口设计
3.    PCIE/USB/STA
4.    H264视频处理算法
发表于 2016-6-16 09:09:47 | 显示全部楼层
楼主讲的很好,谢谢。

思考题没理解,两个相同的电平同步模块syn_a,syn_b,输入端都接signal_a,syn_a输出levl_b1,syn_b输出levl_b2,但levl_b1和levl_b2会不一样?

期待时钟切换的讲解,尤其是异步时钟切换,信号clksw是clka时钟域的,初始值为0,工作中可以配置为1,clk_out=clksw?clk_a:clk_b,工作模块使用clk_out,如何使clk_out没有毛刺。
发表于 2016-6-16 09:26:43 | 显示全部楼层
回复 3# haimo


可能会出现不一样的情况。
这种情况发生在:第一级触发器输出亚稳态后,经过一段时间,最后得到的稳定电平可能是0,也可能是1,因此第二级触发器的输出可能不同。
发表于 2016-6-16 09:44:25 | 显示全部楼层
回复 4# 老阮

这个和后端实现有关吧,如果是前仿,应该一样吧
发表于 2016-6-16 10:05:32 | 显示全部楼层
回复 5# haimo


   从硬件的角度理解,为啥要停留在仿真呢?
发表于 2016-6-16 10:07:53 | 显示全部楼层
思考题:
如果两个电平同步模块的输入时完全一样的,也就是说信号线等长,信号相位相同,那么我认为levl_b1和levl_b2一样,但是实际系统中有可能无法保证这个前提,那么levl_b1和levl2有可能差一个clkb的宽度。

一个关于亚稳态的基本问题:
在芯片内部,亚稳态的理解是“非0非1”,还是“非0即1”? 我的理解是“非0即1”, 异步采样一个跳变沿,即使setup/hold不满足,但结果也只是有可能采到0,也有可能采到1, 不会变成X在系统里传播。
 楼主| 发表于 2016-6-16 11:30:52 | 显示全部楼层
本帖最后由 杰克淡定 于 2016-6-20 14:39 编辑

回复 5# haimo

4楼的理解是正确的。对于异步问题,RTL仿真是无法判断真伪的,仿真仅仅是模拟行为,仿真正确不能等价于实际电路正常。
你说的后端实现,其实也是无法保证的,原因在于signal_a去到sync_a与sync_b两个模块的第一级DFF都是false_path,它们的时序是无法约束的。signal_a走的是两条独立路径达到sync_a和sync_b的第一级DFF的D端,sync_a与sync_b第一级DFF的clkb在实际布线中也存在差异,再加上sync_a与sync_b的两个第一级DFF对于0/1判定也无法完全一致。当clkb的上升沿来临时,如果刚好在signal_a信号跳变附近,发生亚稳态问题,这两个同步电路第一级DFF对于signal_a是0还是1的判断理解会存在差异,从而导致多级同步之后得到的两个信号在clkb域下不一致。

因此,对于异步信号,不要使用两个同步电路同步后,分别给到clkb下的不同地方去做逻辑,这与signal_a不经过同步直接用在clkb下的多个地方做逻辑犯的错误后果是一样的!
 楼主| 发表于 2016-6-16 11:45:27 | 显示全部楼层
回复 7# yaya126

verilog写出来的,是硬件电路,不能以软件思维来考虑,所谓的信号等长,相位一样,这些只存在于纯粹的仿真模拟中,实际芯片无法做到,即使同一个std cell在两颗芯片中表现都会存在差异。

另外,两个相同电路同步过去得到的两个信号,还不仅仅是宽度相差一个cycle这么简单,可能出现很多种情况,最可能的情况有宽度相差2个1个0个cycle,相位提前或者滞后一个cycle或者相位相同,以及上面宽度差异和相位差异的任意组合,如果clkb的频率很高在1GH级别,情况复杂度更难确定。
   
其实至于到底有多少种差异不用去深究,对于数字设计,我们需要的是确定的东西,要么0要么1,要么对要么错,所有存在不确定的设计,一定是错误的设计。
发表于 2016-6-16 13:20:37 | 显示全部楼层
回复 9# 杰克淡定
你所说的两个clkb,发生条件是第二个DFF才到第一个DFF的亚稳态,0/1继续不确定, 按照这个理论推导,不管多少级,也就是降低亚稳态传递发生的概率。 而不是确定0/1.

我的亚稳态问题想了解的是:
如果芯片内部非0即1,那用一级DFF同步即可,何必两级或三级DFF。 如果有大神能介绍亚稳态,请从analog或者器件的角度来解释,从digital的角度,我觉得一级即可。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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


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

GMT+8, 2024-11-22 06:20 , Processed in 0.024479 second(s), 9 queries , Gzip On, Redis On.

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