赞
踩
CDC(clock domain crossing)检查(跨时钟域的检查)是对电路设计中同步电路设计的检查。非同步时钟没有固定的相位关系,这样Setup/Hold不满足而产生了亚稳态是无法避免的。我们采用同步设计的方法保证亚稳态不会无序的在电路中传播,从而导致功能问题。
随着当今SOC设计的规模越来越大,时钟越来越多,工作模式越来越复杂。跨时钟域电路不但多,而且非常复杂。 在当今的电路设计中我们通常使用多级同步,异步FIFO,握手等同步设计来保证亚稳态信号不会在电路中无序的传播。
但同步设计中,同步处理不当依然会出现glitch,多路扇出等问题导致电路实际运行出现故障。
目前我们的数字设计大部分是基于RTL设计的,直接通过RTL检查"跨时钟域的同步设计" 很难做到100%覆盖的检查,特别是当今SOC中集成大量IP,直接通过RTL检查几乎不可能的。 电路设计中同步电路设计的检查都是使用专门的EDA工具做静态的CDC检查。常用的CDC检查工具有Conformal CDC 和 Spyglass CDC。
此外CDC检查也是前端sign off 重要项目和数字IC设计工程师的必备的技能。
· 时钟信号是一个按一定电压幅值、一定时间间隔连续发出的脉冲信号。
· 每一次脉沖到来,芯片内的晶体管就改变一次状态,让整个芯片完成一定任务
· 时钟相当于芯片的脉搏,心脏跳动
时钟偏斜,指的是同一个时钟信号到达两个不同寄存器之间的时间差值,Skew的定义就是时钟最长路径减去最短路径的值。
时钟抖动,指的是两个时钟周期之间存在的差值,这个误差是在时钟发生器内部产生的,和晶振或者PLL内部电路有关。
数字电路里一般用晶振提供基本的时钟信号。晶振是晶体振淓器( Quartz Crystal OSC)的简称。
・有些芯片的一部分时钟来自于其他芯片。它的时钟源就是外部芯片的输出信号。比如芯片12C、SPI接口时钟就来自外部芯片。
MMCM( Mixed- Mode Clock Manager)混合模式时钟管理器
High-performance Clock
BUFG(全局时钟缓冲器)
BUFH( horizontal clock buffers横向BANK时钟绶冲器)
BUFR(用于纵向BANK时钟缓冲器)
BUFMR (multi-clock region buffers)
BUFIO(用于IO输入输出缓冲)
下图中,CLKA和CLK_OSC就是异步时钟。
问题:有两个不同频率的时钟A和B。A:clk0 为100MHz,B:clk1为99MHz。他们两个是不是异步时钟?
不一定!
问题:有两个相同频率的时钟A和B,他们无固定相位,他们两个是不是同步时钟?
不是同步时钟!
时钟域(Clock Domain)是以捕获时钟划分时钟域
单时钟(Single clock domain):数据发送和接收是一个时钟
多时钟(Multiple clock domain):数据发送和接收不是一个时钟
CLK1与CLK2来自不同的时钟源。
由于时钟源不同,对REG2和REG3来讲,在同一时刻,一个认为REG1的输出是1,另一个认为是0,这必定造成电路判断出现错误。
建立时间t(su)(setup time)
对任何一种触发器,在时钟触发沿前后的一个小时向窗口内,输入信号必须稳定。
触发器的时钟信号上升沿到来以前,数据稳定不变的时间。输入信号应提前时钟上升沿(假设上升沿有效)T时间到达芯片,这个T就是建立时间 Setup time。如不满足setup time,这个正确的数据(或稳定后的数据)就不能被这一时刻时钟打入触发器
保持时间t(H)(hold time)
保持时间是指触发器的时钟信号上升沿到来以后,数据稳定不变的时间。如果 hold time不够,数据同样不能被正确打入触发
触发器无法在某个规定时间段内达到一个可确认的状态。亚稳态会带来功能的错误
既无法预测该单元的输出电平,也无法预测何时输出才能稳定在某个正确的电平上。触发器输岀一些中间级电平,或者可能处于振荡状态。
这种无用的输出电平可以沿信号通道上的各个触发器级联式传播下去
使用同步器降低亚稳态发生的概率:
1.亚稳态需要一段时间才能到达稳态
2.二级寄存器可以增加一个 clock cycle的时间使亚稳态稳定
使用同步器降低亚稳态发生的概率
两级并不能完全隔离亚稳态危害,但极大的概率隔离了亚稳态发生概率。
慢时钟信号进入到更快的时钟域时(频率相差2倍以上),此时不用考虑快时钟域信号采样的丢失,可以考虑使用两级触发器进行同步处理
慢时钟信号进入到更快的时钟域时(频率相差2倍以上),为了避免快时钟多次采样到有效信号,快时钟域需要对信号进行边沿检测。需要使用边沿检测同步器
当一个慢时钟域的单比特信号进入到更快的时钟域,但是两个时钟频率相差不大(频率相差2倍下),为了避免快时钟采样丢失,需要进行握手的同步处理
快时钟先将输入信号进行两级同步处理,再进行一个时钟的延迟,延迟后的信号取反与同步信号做与逻辑,得到信号的上升沿
快时钟先将输入信号进行两级同步处理,再进行一个时钟的延迟,延迟后的信号与取反同步信号后做与逻辑,得到脉冲信号的下降沿
快时钟先将输入信号进行两级同步处理,再进行一个时钟的延退,延迟后的信号与同步信号做异或逻辑,就可得到信号的双沿脉冲。
如果已知慢时钟域的时钟频率,可以考虑将快时钟域的信号进行电平扩展,使其足以被慢时钟域采样。
快时钟域中需要同步的信号是脉冲信号,它触发原时钟域的反转电路,每当翻转电路收到脉冲时,电路翻转一次慢时钟域的同步器对翻转后的信号进行采样,和边沿检测,重新在本时钟域恢复出脉冲信号
当一个快时钟域的单比特信号进入到慢的时钟域,同样可以使用握手的方式进行同步处理
脉冲同步器的使用中,快时钟域的有效信号需要时单脉冲信号,且两个有效信号的时间间隔需要大于等于两个同步器的时钟周期,否则无法恢复出有效信号
对跨时钟域的 Timing path如果不处理容易导致亚稳态。如果做了同步处理,但同步处理不当俨然会出现 glitch,多路扇出,Re-convergence,Datahold等问题导致电路实际运行出现故障
CLKA domain中,DA1和DA2分别为两个DFF的输出,理想状态下,DA1和DA2到达与门两个输入端的时间是一样的,这样设计就不会出问题。但由于后端布局,环境等因素导致的传播延迟Td会使A&B存在一个 Glitch。而由于CLKB和CLKA为两个 clock domain,之间不存在固定的相位关系,假设这个 Glitch恰好被CLKB锁存住,那么就会在DB2生成一个有效的高电平信号,这个高电平信号不是我们的设计所期望的,那就会导致后继的电路功能出现问题。
错误解决方案
跨时钟域的多个相关连的单比特信号不可以通过打拍的方式同步到目的时钟域
如果多比特信号之间存在逻辑相关性。可以在源时钟域将信号合成一个单一的控制信号然后进行两级寄存器同步
通过编码的方式将多位信号转化为每次只有一位变化的信号,将“多比特”的跨时钟域变换成“单比特”进行处理。
异步FIFO融合了寄存器同步,格雷码编码,握手控制等处理方式,是处理跨时钟域数据传输最常用的方式。
所谓握手,是指通信双方使用了专用控制信号进行数据收发的状态指示。这个控制信号既有发送域给接收域的,也有接收域给发送域的,有别于前面的单向控制信号检测方式。类似于DMA与外设模块的通信,会用到dma_req,dma_ack
格雷码的特点是相邻的两个编码之间只有1位不同,消除了在同一个时钟沿,多比特信号或者数据同时变化所带来的跨时钟域问题
应用局限:只有在数据在相数值间连续变化的情况下才有用,不适用于大多数信号传输或者数据传输的情况。
握手,即通信双方使用约定的控制信号进行数据传输的状态指示。这个控制信号既有发送域给接收域的,也有接收域给发送域的。
解决两个不同时钟域之间批量数据的高效传递。
数据速率的转换,比如突发速率转换为线性均匀速率( burst write and single read).
不同时钟域数据快速传输与緩存。
不同数据位宽的数据接口的匹配。
将读时钟域的读地址(经格雷码转换后),再同步到写时钟域,进行逻辑比较
将写时钟域的写地址(经格雷码转换后),再同步到读时钟域,进行逻辑比较
将读写地址(经格雷码转换后)同步到一个组合逻辑电路中(异步比较)直接比较空满,然后将空满信号同步到各自对应的模块中。
FIFO读、写位宽都为8,写时钟 wclk为100MHz,读时钟rclk为95MHz,写入数据的总长为4Kbit,且两次写操作之间的时间间隔足够大。每一个rclk读取一个数据。求FIFO的深度。
写入的突发长度: burst_length=4K/8=500字节(即T时间内写入了500字节的数据)
要保证FIFO不溢出,那么在T时间内,500字节数据要被全部读出。T=500/100MHz.
T时间段读取的数据量为:T95MHz=475字节,FIFO的深度至少要大于等于25
公式总结:fifo_depth= burst_ length-( burst_ length /w_clk)r_cIkX/Y
这里X、Y代表的意思:每Y个rclk会有X个数据读出FIFO
FIFO读、写位宽都为8,写时钟wclk为80MHz,读时钟rclk为40MHz,写入数据的总长为120byte,每2个写时钟写入一个数据,每4个读时钟读取一个数据。求FIFO的深度。
写入的突发长度: burst length=120字节(即T时间内写入了120字节的数据)
等效的写时钟频率wclk=80/2=40M
等效的读时钟频率rclk=40/4=10M
要保证FIFO不溢出,那么在T时间内,120字节数据要被全部读出。T=120/40MHz
T时间段读取的数据量为:T*10MHz=30字节,FIFO的深度至少要大于等于90字节
转换规则:从最右边一位起(最低位开始),依次与前一位“异或",作为该位的输出,最高位不变
module BINARY_TO_GRAY(binarycode,graycode);
parameter n = 4;
input [n-1:0] binarycode;
output reg [n-1:0] graycode;
integer i;
always@(binarycode)begin
graycode[n-1] = binary[n-1];
for(i=0;i<n;i++)
graycode[i] = binarycode[i]^binarycode[i-1];
end
endmodule
转换规则:最高位不变,从最左边起将产生的每一位二进制码,与下一位相邻的格雷码"异或”,作为二进制码的下一位。
module GRAY_TO_BINARY(graycode,binarycode);
parameter n = 4;
input [n-1:0] graycode;
output reg [n-1:0] binarycode;
integer i;
always@(graycode)begin
binarycode[n-1] = graycode[n-1];
for(i=0;i<n;i++)
binarycode[i] = graycode[i]^graycode[i-1];
end
endmodule
当wren有效,写地址=读地址-1或者写地址=读地址+ FIFO_DEP,full为1.写指针超越读指针
当rden有效,读地址=写地址-1或者读地址=写地址+FIFO_DEP, empty为1;读指针超越写指针
异步复位同步释放
Spyglass的检查验证处在设计的前段RTL阶段,枏比较于后端的时序分析和网表验证, spyglass前能更早的发现问题并修正。
能够让用户能够快速分析出设计中的功耗效率问题,从而在还没有达到后端工序的情况下快速地进行功耗的优化,用户甚至可以在不进行逻辑综合和物理实现的情况下对功耗进行量化的计算。
Spyglass CDC检查可以发现仿真、FPGA测试中很难发现的潜在的跨时域处理问题。
可以检查出复位、时钟是否使用正确,对跨时域设计进行评估检查。
下面是界面方式的使用流程:
文章中未展开说明的部分,不是小编目前关注的点。供大家参考。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。