当前位置: 首页 > news >正文

FPGA随记——时钟时序一些基本知识

原文链接:跨时钟域设计-CSDN博客

前言
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设计工程师的必备的技能。

第一讲 时钟域
1.1 什么是时钟
· 时钟信号是一个按一定电压幅值、一定时间间隔连续发出的脉冲信号。

脉冲信号之间的时间间隔称为周期;
将单位时间(如1秒)内所产生的脉冲个数称为频率。
· 每一次脉沖到来,芯片内的晶体管就改变一次状态,让整个芯片完成一定任务

· 时钟相当于芯片的脉搏,心脏跳动


时钟偏斜(clock skew)
时钟偏斜,指的是同一个时钟信号到达两个不同寄存器之间的时间差值,Skew的定义就是时钟最长路径减去最短路径的值。


时钟抖动(jitter)
时钟抖动,指的是两个时钟周期之间存在的差值,这个误差是在时钟发生器内部产生的,和晶振或者PLL内部电路有关。

1.2 什么是时钟源
数字电路里一般用晶振提供基本的时钟信号。晶振是晶体振淓器( Quartz Crystal OSC)的简称。


・有些芯片的一部分时钟来自于其他芯片。它的时钟源就是外部芯片的输出信号。比如芯片12C、SPI接口时钟就来自外部芯片。


下面这个电路图就是两个时钟源(CLKA是外部时钟源、clk_osc是晶体振荡器提供的)

1.3 同步时钟
同源,比如分频
有固定的相位关系

右下角的图中:如果C1和C2是一个时钟源,则为同步时钟。
ASIC中的时钟结构


FPGA中的时钟结构
MMCM( Mixed- Mode Clock Manager)混合模式时钟管理器

High-performance Clock

BUFG(全局时钟缓冲器)

BUFH( horizontal clock buffers横向BANK时钟绶冲器)

BUFR(用于纵向BANK时钟缓冲器)

BUFMR (multi-clock region buffers)

BUFIO(用于IO输入输出缓冲)


1.4 异步时钟
不同源
没有固定的相位关系
下图中,CLKA和CLK_OSC就是异步时钟。

问题:有两个不同频率的时钟A和B。A:clk0 为100MHz,B:clk1为99MHz。他们两个是不是异步时钟?
不一定!
问题:有两个相同频率的时钟A和B,他们无固定相位,他们两个是不是同步时钟?
不是同步时钟!

1.5 什么是时钟域
时钟域(Clock Domain)是以捕获时钟划分时钟域

单时钟(Single clock domain):数据发送和接收是一个时钟
多时钟(Multiple clock domain):数据发送和接收不是一个时钟


1.6 跨时钟域问题
跨时钟域
若一个电路 launch时钟和 capture时钟不是同一个时钟,就是跨时钟电路
若两个时钟是同步时钟就是同步时钟域
若两个时钟是异步时钟就是异步时钟

跨时钟域的例子
单个模块:switches, UART receivers, USB-FPGA interfacing
整个系统:Different clock in a large design, e.g., Socs
跨时钟域问题

CLK1与CLK2来自不同的时钟源。
由于时钟源不同,对REG2和REG3来讲,在同一时刻,一个认为REG1的输出是1,另一个认为是0,这必定造成电路判断出现错误。

第二讲 亚稳态
2.1 建立时间和保持时间
建立时间t(su)(setup time)

对任何一种触发器,在时钟触发沿前后的一个小时向窗口内,输入信号必须稳定。

触发器的时钟信号上升沿到来以前,数据稳定不变的时间。输入信号应提前时钟上升沿(假设上升沿有效)T时间到达芯片,这个T就是建立时间 Setup time。如不满足setup time,这个正确的数据(或稳定后的数据)就不能被这一时刻时钟打入触发器


保持时间t(H)(hold time)

保持时间是指触发器的时钟信号上升沿到来以后,数据稳定不变的时间。如果 hold time不够,数据同样不能被正确打入触发


2.2 什么是亚稳态
亚稳态
触发器无法在某个规定时间段内达到一个可确认的状态。亚稳态会带来功能的错误

亚稳态时
既无法预测该单元的输出电平,也无法预测何时输出才能稳定在某个正确的电平上。触发器输岀一些中间级电平,或者可能处于振荡状态。

亚稳态传播
这种无用的输出电平可以沿信号通道上的各个触发器级联式传播下去


2.3 如何处理亚稳态
①降低系统时钟
②用反应更快的FF
③引入同步机制,防止亚稳态传播
④改善时钟质量,用边沿变化快速的时钟信号
2.4 二级寄存器
使用同步器降低亚稳态发生的概率:
1.亚稳态需要一段时间才能到达稳态
2.二级寄存器可以增加一个 clock cycle的时间使亚稳态稳定

2.5 MTBF
平均故障间隔时间MTBF (Mean Time Between Failure )

使用同步器降低亚稳态发生的概率
两级并不能完全隔离亚稳态危害,但极大的概率隔离了亚稳态发生概率。


第三讲 跨时钟域设计——单比特信号的跨时钟域处理
3.1 慢时钟域信号同步到快时钟域的处理方法
两级触发器同步
慢时钟信号进入到更快的时钟域时(频率相差2倍以上),此时不用考虑快时钟域信号采样的丢失,可以考虑使用两级触发器进行同步处理

边沿检测同步器
慢时钟信号进入到更快的时钟域时(频率相差2倍以上),为了避免快时钟多次采样到有效信号,快时钟域需要对信号进行边沿检测。需要使用边沿检测同步器

握手处理
当一个慢时钟域的单比特信号进入到更快的时钟域,但是两个时钟频率相差不大(频率相差2倍下),为了避免快时钟采样丢失,需要进行握手的同步处理

3.2 信号上升沿检测
快时钟先将输入信号进行两级同步处理,再进行一个时钟的延迟,延迟后的信号取反与同步信号做与逻辑,得到信号的上升沿


3.3 信号下降沿检测
快时钟先将输入信号进行两级同步处理,再进行一个时钟的延迟,延迟后的信号与取反同步信号后做与逻辑,得到脉冲信号的下降沿


3.4 双沿检测器
快时钟先将输入信号进行两级同步处理,再进行一个时钟的延退,延迟后的信号与同步信号做异或逻辑,就可得到信号的双沿脉冲。


3.5 快时钟域信号同步到慢时钟域的处理方法
电平拓展
如果已知慢时钟域的时钟频率,可以考虑将快时钟域的信号进行电平扩展,使其足以被慢时钟域采样。

脉冲同步器
快时钟域中需要同步的信号是脉冲信号,它触发原时钟域的反转电路,每当翻转电路收到脉冲时,电路翻转一次慢时钟域的同步器对翻转后的信号进行采样,和边沿检测,重新在本时钟域恢复出脉冲信号

握手处理
当一个快时钟域的单比特信号进入到慢的时钟域,同样可以使用握手的方式进行同步处理

3.6 脉冲同步器(快时钟域到慢时钟域)
脉冲同步器的使用中,快时钟域的有效信号需要时单脉冲信号,且两个有效信号的时间间隔需要大于等于两个同步器的时钟周期,否则无法恢复出有效信号


3.7 典型电路案例分析(此处再看)
对跨时钟域的 Timing path如果不处理容易导致亚稳态。如果做了同步处理,但同步处理不当俨然会出现 glitch,多路扇出,Re-convergence,Datahold等问题导致电路实际运行出现故障

CLKA domain中,DA1和DA2分别为两个DFF的输出,理想状态下,DA1和DA2到达与门两个输入端的时间是一样的,这样设计就不会出问题。但由于后端布局,环境等因素导致的传播延迟Td会使A&B存在一个 Glitch。而由于CLKB和CLKA为两个 clock domain,之间不存在固定的相位关系,假设这个 Glitch恰好被CLKB锁存住,那么就会在DB2生成一个有效的高电平信号,这个高电平信号不是我们的设计所期望的,那就会导致后继的电路功能出现问题。

错误解决方案
跨时钟域的多个相关连的单比特信号不可以通过打拍的方式同步到目的时钟域

第四讲 跨时钟域设计——多比特信号的跨时钟域处理
4.1 两级触发器的问题
两级触发器用来处理多比特信号的同步的问题
如果简单的按照单比特信号穿越方法各bit打两拍单独穿越,则会造成各个bit穿越时间不一致(寄存器
对于每个信号的延迟时间不ー样),则会造成另一个时钟域里面有一些被前一个时钟沿采到了,有些
被后面的采到了,导致目的时钟域采到的值错误,造成中间态无意义的数据。


两级触发器同步多比特信号的解决方法
如果多比特信号之间存在逻辑相关性。可以在源时钟域将信号合成一个单一的控制信号然后进行两级寄存器同步


4.2 多比特信号跨时钟域的处理方法
格需码编码
通过编码的方式将多位信号转化为每次只有一位变化的信号,将“多比特”的跨时钟域变换成“单比特”进行处理。

异步FFO
异步FIFO融合了寄存器同步,格雷码编码,握手控制等处理方式,是处理跨时钟域数据传输最常用的方式。

握手处理
所谓握手,是指通信双方使用了专用控制信号进行数据收发的状态指示。这个控制信号既有发送域给接收域的,也有接收域给发送域的,有别于前面的单向控制信号检测方式。类似于DMA与外设模块的通信,会用到dma_req,dma_ack

4.3 格雷码编码处理跨时钟域
什么是格雷码
是一种特殊的二进制编码方式,在一定程度上优于二进制编码
可以通过算法与二进制编码进行相互转换
相邻两个编码之间只有一位不同

格码编码的跨时钟域处理
格雷码的特点是相邻的两个编码之间只有1位不同,消除了在同一个时钟沿,多比特信号或者数据同时变化所带来的跨时钟域问题
应用局限:只有在数据在相数值间连续变化的情况下才有用,不适用于大多数信号传输或者数据传输的情况。


4.4 异步FIFO
异步FIFO的特点
异步FIFO的特点是拥有两个相互独立的读写时钟,允许两个独立时钟的频率有较大的差距
跨时钟域的读写地址传输采用格雷码编码,然后加上两级寄存器同步的方式。
“满”逻辑用来控制写信号,将读时钟域的读指针同步到写时钟域,在写时钟域进行比较。
“空”逻辑用来控制读信号,将写时钟域的写指针同步到读时钟域,在读时钟域进行比较。
异步FIFO的结构
写控制逻:控割写操作与满信号(wfuI)的判断与产生。
读控制逻辑:控割读操作与空信号(empy)的判断与产生
RAM:双端口RAM
二进制码与格雷码转换模块:用于将读写地址二进剖码转成格番码。
跨时钟同步模块:将读地址的格雷码与wclk同步;将写地址的格雷码与rclk同步。主要操作就是两级寄存器同步

4.5 多比特跨时钟域的握手处理
握手方式的原理
握手方式处理跨时钟域数据传输,需要对双方的握手信号(req和ack)分别使用脉冲检测方法进行同步。
在具体实现中,发送域先把数据放入总线,随后发送有效的req信号给接收域。接收域在检测到有效的req信号后锁存数据总线,然后回送一个有效的ack信号表示读取完成应笞。发送域在检测到有效ack信号后撤销当前的req信号,接收域在检测到req撤后也相应撤销ack信号,此时完成一次正常握手通信。
握手方式是一种稳定可靠的同步处理方式,但控制信号握手检测会消耗通信双方较多的时间。

第五讲 跨时钟域设计——握手处理
5.1 握手的原理
握手,即通信双方使用约定的控制信号进行数据传输的状态指示。这个控制信号既有发送域给接收域的,也有接收域给发送域的。

5.2 什么时候使用握手同步处理
通信过程需要保障数据的稳定可靠,并能允许通信过程消耗双方较多的时间
当通信双方不能预知相互的响应时间时,握手能让两个时钟域间实现有效的通信
方式一般使用在总线数据的传输上
5.3 握手电路的实现
双方对握手信号(req和ack)分别使用脉冲检测方法进行同步。
接收方利用脉冲有效沿对传输的数据进行锁存。
完成数据锁存后通知接收方。

第六讲 跨时钟域设计——异步FIFO
6.1 异步FIFO的应用
异步FIFO的作用
解决两个不同时钟域之间批量数据的高效传递。

异步FIFO的应用
数据速率的转换,比如突发速率转换为线性均匀速率( burst write and single read).
不同时钟域数据快速传输与緩存。
不同数据位宽的数据接口的匹配。

6.2 异步FFO的结构
异步FIFO的一般结构
双端口RAM:用于存储效据。
读控制逻辑:控制读操作与空信号( empty)的判断与产生,属于读时钟域。
写控制逻辑:控制写操作与满信号(wfull)的判断与产生,属于写时钟域。
二进制码与格雷码转换模块:用于将读写地址二进制码转成格雷码。
跨时钟同步模块:将读地址的格雷码与wclk同步;将写地址的格雷码与rclk同步。
异步FIFO处理的核心问题
FIFO深度的计算。
读写地址的编码
控制信号、读写地址的跨时钟域同步
读写控制信号的产生。
经典异步FIFO的结构一
将读时钟域的读地址(经格雷码转换后),再同步到写时钟域,进行逻辑比较
将写时钟域的写地址(经格雷码转换后),再同步到读时钟域,进行逻辑比较


经典异步FFO的结构二
将读写地址(经格雷码转换后)同步到一个组合逻辑电路中(异步比较)直接比较空满,然后将空满信号同步到各自对应的模块中。


6.3 异步FIFO深度的计算
异步FIFO深度的计算
计算异步FIFO的深度,需要综合考虑读、写的时钟频率,读、写数据的位宽,读、写的频率等。
写快读慢的情况下,突发 burst写入的数据减去该 burst时间内读出的数据,多余的数据需要能缓冲下来,让接收端在剩下空闲的时间能从容地把多余的数据读出来。
读快写慢的情况下,FIFO的深度最小可以设置为1.
异步FIFO深度的计算示例1
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深度的计算示例2
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字节

6.4 异步FIFO读写地址的编码
异步FIFO读写地址的格雷码编码
FIFO的读写地址都是连续的。采用格雷码编码,每次地址的变化,都只有1位数据跳变,有利于信号的跨时钟域同步。
二进制码转换成格雷码
转换规则:从最右边一位起(最低位开始),依次与前一位“异或",作为该位的输出,最高位不变

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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
格雷码转换成二进制码
转换规则:最高位不变,从最左边起将产生的每一位二进制码,与下一位相邻的格雷码"异或”,作为二进制码的下一位。

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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
6.5 异步FIFO读写时钟域的信号同步
异步FIFO的跨时钟域信号同步
满”信号控制写逻辑,在写时钟域产生。“满控制信号不需要同步到读时钟域。只需要将写地址进行跨时钟域的同步。
“空信号控制读逻辑,在读时钟域产芏。“空”控制信号不需要同步到写时钟域。只需要将读地址进行跨时钟域的同步。
跨时钟域地址同步:将读地址的格雷码与wclk同步;将写地址的格雷码与rclk同步。主要操作就是两级寄存器同步。
为什么使用两级寄存器同步多比特位宽的地址信号?
异步FIFO读写地址都是连续变化的,在进行两级寄存器同步之前,进行格雷码编码,可以将多比特变化的信号变成每次只有单一比特変化的信号进行同步。
6.6 异步FFO满空信号的产生
异步FIFO空满信号的产生
读写控制信号判断与产生是通过对读写地址指针的比较判断出来的
二进制比较:因为跨时钟域同步后的地址是格雷码,需要在本时钟域对地址进行二进制转换
格雷码直接比较:省去了二进制的转换,直接将本时钟域的格雷码编码地址与同步过来的格雷码地址进行比较
传统二进制比较
当wren有效,写地址=读地址-1或者写地址=读地址+ FIFO_DEP,full为1.写指针超越读指针
当rden有效,读地址=写地址-1或者读地址=写地址+FIFO_DEP, empty为1;读指针超越写指针

格需码直接比较产生空满信号
假如FIFO的深度为8,我们用宽度为4的指针对FIFO进行寻址
如果读指针的最高位为0,而写指针的最高位为1,说明写指针超前于读指针,这时如果读写指针指向同一存储空间(次高位相异),则可判断为full
如果读指针的最高位为1,而写指针的最高位为0,说明写指针发生了回转,这时如果读写指针指向同一存储空间(次高位相异),则可判断为full
当读指针完全与写指针相同时,则判断为 empty

格码直接比较产生空满信号举例
假如FIFO的深度为8,我们用宽度为4的指针对FIFO进行寻址
起初初始化时。Wr_ptr_bin=“0000,rd_ptr_bin=0000、此时,FIFO空”
首先执行8次写操作。Wr_ptr_bin=1100,rd_ ptr bin=0000此时,FIFO满。
然后执行8次读操作。Wr_ptr_bin=“1100,rd_ptr_bin=21100.此时,FIFO空”。
最后执行8次写操作。Wr_ptr_bin=0000,rd_ptr_bin=1100,此时,FIFO满。
6.7 异步FIFO读写时钟快慢对信号同步的影响
读写指针的两级寄存器同步所带来的延迟,对空满信号的判断有影响吗
将写指针同步到读时钟域再和读指针比较进行FIFO空状态判断时,因为在同步写指针时需要时间,而在这个同步的时间内有可能还会写入新的数据,因此同步后的写指针一定是小于或者等于当前实际的写指针,所以此时如果FIFO为空”,则实际的写指针可能仍然大于读指针,FIFO并不是真的“空。这样可能会影响FIFO的性能,但是并不会出错。
将读指针同步到写时钟域再和写指针比较进行FIFO满状态判断,同步后的读指针一定是小于或者等于当前的读指针所以此时判断FIFO为满不一定是真满
总结来说异步逻辑转到同步逻辑不可避免需要额外的时钟开销,这会导致满空趋于保守,但是保守并不等于错误,这么写会稍微有性能损失,但是不会出错。
异步FFO读写时钟频率相差很大,对空满信号的判断有影响吗
假设异步fifo,写时钟500M,读时钟100M,相差5倍。
满信号的判断是在写时钟域,比较同步过来的读指针,由于写时钟500M大于读时钟100M,快时钟采样慢信号,满的判断不会有间题。
空”信号的判断是在读时钟域,比较同步过来的写指针,由于读时钟频率低,采样的写指针可能是离散值(3,6,9).但是采样到的写指针,必定小于写时钟域的写指针。所以判断出来的空”信号,是一个保守的“空”信号。在实际应用中没有问是题。
第七讲 跨时钟域设计——复位同步问题
7.1 同步复位和异步复位的特点
同步复位
复位信号只有在时钟上升沿到来时,オ能有效。复位时间需要大于系统周期,否则,无法完成对系统
的复位工作。
同步复位可以滤除高于时钟频率的毛刺。是完整的同步设计,有利于时序分析。
同步复位会耗费较多的逻辑资源,并会产生组合逻辑路径延时,复位延时等。
异步复位
只要综合工艺库有可异步复位的触发器,那么该触发器的数据输入通道就不需要额外的组合逻辑
无论时钟沿是否到来,只要复位信号有效,就对系统进行复位。
异步复位设计简单,可以很方便的实现系统的全局复位。
7.2 异步复位的问题
异步复位的问题
最大的问题在于它属于异步逻辑,间题出现在复位释放时,如果复位释放接近时钟有效沿,则触发器
的输出可能进入亚稳态,从而使复位失败
可能因为噪声或者毛刺造成虚假复位信号
如何解决异步复位的问题
异步复位同步释放

7.3 异步复位同步释放
复位信号是异步有效的,即复位的发生与clk无关。后半句“同步释放”是指复位信号的撤除的时侯收到时钟信号的同步(同步释放)。
rst_async_n异步复位后, rst_sync_n将拉低,即实现异步复位。当复位信号rst_async_n撤除时,由于双緩冲电路(两级蝕发器)的作用, rst_sync_n复位信号不会随着 rst_async_n的撤除而撤除。

第八讲 跨时钟域设计——跨时钟的代码检查
8.1 Spyglass功能
Spyglass
Lint
在RTL阶段对代码的语法,可综合性,结构进行深入分析,并且对代码的错误提供完整、可调试的修改方案
SDC
帮助设计人员在设计的整个流程中生成,验证和管理他们的约東文件。
CDC
提供了业界最完整的多时钟域解决方案,能自动识别各种同步手段(包括 Handshake,FIFO),能采用 Formal引擎验证同步方法在功能上的正确性
DFT
提供了能的骭测ATPG的测试覆盖率分析的能力,基于这个选项,用户可以很容易地预计所作设计的可测试性并且利用工具提供的指导来提高设计的可测试性。
Power
能够让用户能够快速分析出设计中的功耗效率问题,从而在还没有达到后端工序的情况下快速地进行功耗的优化,用户甚至可以在不进行逻辑综合和物理实现的情况下对功耗进行量化的计算。
Spyglass优势
Spyglass的检查验证处在设计的前段RTL阶段,枏比较于后端的时序分析和网表验证, spyglass前能更早的发现问题并修正。
能够让用户能够快速分析出设计中的功耗效率问题,从而在还没有达到后端工序的情况下快速地进行功耗的优化,用户甚至可以在不进行逻辑综合和物理实现的情况下对功耗进行量化的计算。

Spyglass CDC的特点
Spyglass CDC检查可以发现仿真、FPGA测试中很难发现的潜在的跨时域处理问题。
可以检查出复位、时钟是否使用正确,对跨时域设计进行评估检查。

8.2 Spyglass CDC使用流程
Spyglass CDC使用方式
TCL脚本的方式,TCL方便快捷省去了UI界面上的繁琐操作。
软件UI界面操作,跨时域设计一般设计到的层次较多,界面方式 debug较直观。
通常我们会用脚本启动 Spyglass,走流程,然后在UI界面里面 Debug
Spyglass CDC所需文件
Filelist.f:用户RTL的文件列表。
spyglass. sgc: spyglass用的sgdc约東文件。
spyglass.tcl:如果是脚本方式启动需要准备tcl脚本文件,并在脚本中对CDC的Goal做声明。
Spyglass CDC界面方式
下面是界面方式的使用流程:

建立好文件夹,准备好们elst. spyglass. sgc文件。
打开 Terminal,输入命令: spyglass&。启动 spyglass。
点击 Add File(s),添加filelist和 spyglass.sgdc文件。并点击OK确认。
8.3 CDC rules check1
8.4 CDC rules check2
第九讲 跨时钟域设计——时钟域的综合处理
9.1时钟的定义
9.2.同步时钟的约束
9.3.异步时钟的约束
9.4.DC的综合处理
9.5. DC timing分析
9.6.FPGA的综合处理
后记
文章中未展开说明的部分,不是小编目前关注的点。供大家参考。
————————————————

                            版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
                        
原文链接:https://blog.csdn.net/haojie_duan/article/details/110304907

相关文章:

FPGA随记——时钟时序一些基本知识

原文链接&#xff1a;跨时钟域设计-CSDN博客 前言 CDC&#xff08;clock domain crossing&#xff09;检查&#xff08;跨时钟域的检查&#xff09;是对电路设计中同步电路设计的检查。非同步时钟没有固定的相位关系&#xff0c;这样Setup/Hold不满足而产生了亚稳态是无法避免…...

【微服务】SpringBoot 通用异常处理方案使用详解

目录 一、前言 二、SpringBoot 异常介绍 2.1 SpringBoot 中异常定义 2.1.1 SpringBoot 异常处理机制的重要性 2.2 常用的异常分类 2.3 常用的异常处理解决方案 三、springboot 异常处理操作实践 3.1 springboot自适应错误处理机制 3.1.1 使用默认错误页面 3.1.2 自定义…...

初识MyBatis(详细)

目录 回顾 前提回忆下web应用程序的三层架构&#xff1a; ​编辑 一.什么是MyBatis&#xff1f; 二.Mybatis操作数据库的步骤&#xff1a; 2.1准备工作 2.2配置Mybatis(数据库连接信息&#xff09; 2.3写持久层代码 2.4测试 三.Mybatis配置文件 3.1打印日志 3.2参数传递…...

elementui表单验证,数据层级过深验证失效

先看示例代码&#xff0c;代码为模拟动态获取表单数据&#xff0c;然后动态添加rules验证规则&#xff0c;示例表单内输入框绑定form内第四层&#xff1a; <template><el-form :model"form" :rules"rules" ref"ruleForm" label-width&…...

HTTPS与HTTP:区别及安全性对比

目录 一、基础概念 二、安全性对比 1. 加密传输 2. 身份验证 3. 数据完整性 4. 端口 5. 浏览器展示方式 三、使用场景与性能 1. 使用场景 2. 性能开销 四、成本与维护 五、搜索引擎优化&#xff08;SEO&#xff09; 六、案例分析 七、隐私保护与中间人攻击 八、…...

中国石油大学(华东)自动评教工具(涵盖爬虫的基础知识,适合练手)

我开发了一个用于自动评教的工具&#xff0c;大家可以试着用用&#xff0c;下面是链接。 https://github.com/restrain11/auto_teachingEvaluate 可以点个星吗&#xff0c;感谢&#xff01;&#x1fae1; 以下是我在开发过程中学到的知识 以及 碰到的部分问题 目录 动态爬虫和静…...

蓝桥杯备考:二叉树详解

二叉树的概念和相关术语 二叉树的定义&#xff1a;每个结点度至多为2的树&#xff0c;叫二叉树 二叉树的子树有左右之分不可以随意颠倒顺序&#xff0c;也就是说二叉树是有序树 二叉树根结点左子树右子树 满二叉树&#xff1a;就是把每一层的结点都铺满 满二叉树的性质&#xf…...

大模型微调介绍-Prompt-Tuning

提示微调入门 NLP四范式 第一范式 基于「传统机器学习模型」的范式&#xff0c;如TF-IDF特征朴素贝叶斯等机器算法. 第二范式 基于「深度学习模型」的范式&#xff0c;如word2vec特征LSTM等深度学习算法&#xff0c;相比于第一范式&#xff0c;模型准确有所提高&#xff0c…...

《机器学习》——PCA降维

文章目录 PCA降维简介什么是主成分分析&#xff1f; 主成分的选择与维度确定降维的数学过程PCA降维求解步骤降维后的效果和应用场景中的优势PCA模型API参数Attributes属性PCA对象的方法 PCA降维实例导入所需库导入数据集对数据进行处理创建PCA模型并训练查看训练结果对降维数据…...

【Rust练习】28.use and pub

练习题来自&#xff1a;https://practice-zh.course.rs/crate-module/use-pub.html 1 使用 use 可以将两个同名类型引入到当前作用域中&#xff0c;但是别忘了 as 关键字. use std::fmt::Result; use std::io::Result;fn main() {}利用as可以将重名的内容取别名&#xff1a;…...

VUE学习笔记1__创建VUE实例

核心步骤 <div id"app"><!-- 这里存放渲染逻辑代码 --><h1>{{ msg }}</h1><a href"#">{{count}}</a> </div><!-- 引入在线的开发版本核心包 --> <!-- 引入核心包后全局可使用VUE构造函数 --> <…...

不用PLC和板卡,一台电脑就可以控制伺服

1、前言 大家好&#xff01;我是付工。 EtherCAT是运动控制领域使用最广泛的总线通信协议之一。 如果我们只有一台电脑&#xff0c;能不能直接控制EtherCAT总线伺服呢&#xff1f; 这个是完全可以的。 我们可以在电脑上安装实时运行环境&#xff0c;从而实现对伺服电机的总…...

vue2制作长方形容器,正方形网格散点图,并且等比缩放拖动

需求&#xff1a;有个长方形的容器&#xff0c;但是需要正方形的网格线&#xff0c;网格线是等比缩放的并且可以无线拖动的&#xff0c;并且添加自适应缩放和动态切换&#xff0c;工具是plotly.js,已完成功能如下 1.正方形网格 2.散点分组 3.自定义悬浮框的数据 4.根据窗口大小…...

鸿蒙-页面和自定义组件生命周期

页面生命周期&#xff0c;即被Entry装饰的组件生命周期&#xff0c;提供以下生命周期接口&#xff1a; onPageShow&#xff1a;页面每次显示时触发一次&#xff0c;包括路由过程、应用进入前台等场景。onPageHide&#xff1a;页面每次隐藏时触发一次&#xff0c;包括路由过程、…...

AD域学习

AD域学习 AD域一、什么是AD域二、概念三、疑问四、内容4.1、AD域的功能 五、应用实践 AD域 一、什么是AD域 AD域&#xff08;Active Directory Domain&#xff09;是微软Windows网络中的一个概念&#xff0c;它是一种计算机网络的形式&#xff0c;其中所有用户账户、计算机、…...

leetcode 3066. 超过阈值的最少操作数 II 中等

给你一个下标从 0 开始的整数数组 nums 和一个整数 k 。 一次操作中&#xff0c;你将执行&#xff1a; 选择 nums 中最小的两个整数 x 和 y 。将 x 和 y 从 nums 中删除。将 min(x, y) * 2 max(x, y) 添加到数组中的任意位置。 注意&#xff0c;只有当 nums 至少包含两个元…...

使用 WPF 和 C# 绘制覆盖网格的 3D 表面

此示例展示了如何使用 C# 代码和 XAML 绘制覆盖有网格的 3D 表面。示例使用 WPF 和 C# 将纹理应用于三角形展示了如何将纹理应用于三角形。此示例只是使用该技术将包含大网格的位图应用于表面。 在类级别&#xff0c;程序使用以下代码来定义将点的 X 和 Z 坐标映射到 0.0 - 1.…...

大数据学习(34)-mapreduce详解

&&大数据学习&& &#x1f525;系列专栏&#xff1a; &#x1f451;哲学语录: 承认自己的无知&#xff0c;乃是开启智慧的大门 &#x1f496;如果觉得博主的文章还不错的话&#xff0c;请点赞&#x1f44d;收藏⭐️留言&#x1f4dd;支持一下博主哦&#x1f91…...

源码编译安装httpd 2.4

方法一&#xff1a; 1、下载 Apache 源代码&#xff1a; wget https://archive.apache.org/dist/httpd/httpd-2.4.54.tar 2、解压源代码&#xff1a; tar -zxvf httpd-2.4.54.tar.gz 3、进入源代码目录&#xff1a; cd httpd-2.4.54 4、安装开发工具组&#xff1a; yum…...

1.15寒假作业

web&#xff1a;nss靶场ez_ez_php 打开环境&#xff0c;理解代码 使用个体传参的方法&#xff0c;首先代码会检查file参数的前三个字符是不是php&#xff0c;如果是就输出nice&#xff0c;然后用include函数包含file&#xff0c;绕过不是则输出hacker&#xff0c;如果没有file…...

Java中private和static同时使用会出现什么情况?

引言 这几天在学习单例设计模式&#xff08;后面会出一期包含23种设计模式介绍的博客&#xff09;的时候发现了一段代码 private static Single single; 当时我就在想&#xff0c;这个private和static一起用的话外界想要访问这个成员变量到底是能不能访问到呢&#xff1f;当…...

vue倒计时组件封装,根据每个循环项的倒计时是否结束添加新类名。

1.创建countdown.vue文件&#xff1a; <template><p style"font-size: 10px">{{time}}</p> </template> <script>export default{data () {return {time : ,flag : false}},mounted () {let time setInterval(() > {if (this.fla…...

nvim 打造成可用的IDE(2)

上一个 文章写的太长了&#xff0c; 后来再写东西 就一卡一卡的&#xff0c;所以新开一个。 主要是关于 bufferline的。 之前我的界面是这样的。 这个图标很不舒服有。 后来发现是在这里进行配置。 我也不知道&#xff0c;这个配置 我是从哪 抄过来的。 测试结果&#xff1…...

Spring Boot教程之五十五:Spring Boot Kafka 消费者示例

Spring Boot Kafka 消费者示例 Spring Boot 是 Java 编程语言中最流行和使用最多的框架之一。它是一个基于微服务的框架&#xff0c;使用 Spring Boot 制作生产就绪的应用程序只需很少的时间。Spring Boot 可以轻松创建独立的、生产级的基于 Spring 的应用程序&#xff0c;您可…...

目标检测跟踪中的Siamese孪生网络与普通卷积网络(VGG、ResNet)有什么区别?

1、什么是Siamese网络&#xff1f; Siamese网络又叫孪生网络&#xff0c;是一种特殊的神经网络架构&#xff0c;由一对&#xff08;或多对&#xff09;共享参数的子网络组成&#xff0c;用于学习输入样本之间的相似性或关系。最早在 1994 年由 Bromley 等人提出&#xff0c;最…...

AIGC时代 | 探索AI Agent的奥秘:四种设计模式引领未来智能趋势

AIGC时代 | 探索AI Agent的奥秘&#xff1a;四种设计模式引领未来智能趋势 引言 随着人工智能&#xff08;AI&#xff09;技术的飞速发展&#xff0c;AI Agent作为新一代的智能代理&#xff0c;正在引领工作流程的革新。AI Agent&#xff0c;即人工智能代理&#xff0c;是一种…...

PyTorch框架——基于深度学习YOLOv5神经网络水果蔬菜检测识别系统

基于深度学习YOLOv5神经网络水果蔬菜检测识别系统&#xff0c;其能识别的水果蔬菜有15种&#xff0c;# 水果的种类 names: [黑葡萄, 绿葡萄, 樱桃, 西瓜, 龙眼, 香蕉, 芒果, 菠萝, 柚子, 草莓, 苹果, 柑橘, 火龙果, 梨子, 花生, 黄瓜, 土豆, 大蒜, 茄子, 白萝卜, 辣椒, 胡萝卜,…...

【redis】redis-cli命令行工具的使用

redis-cli命令行工具是一个功能强大的Redis客户端&#xff0c;它允许用户与Redis数据库进行交互和管理。 以下是一些常用参数的使用说明&#xff1a; 基本连接参数 -h, --host <hostname>&#xff1a;指定要连接的Redis服务器的主机名或IP地址。如果未指定&#xff0c;…...

阿里云-Centos9-安装Docker-配置镜像拉取加速地址-开机自启

阿里云-Centos9-安装Docker-配置镜像拉取加速地址-开机自启 更新镜像源安装环境配置加速卸载安装pull拉取加速开机自启 更新镜像源 # dnf update&#xff1a;更新所有已安装的软件包。 sudo dnf update -y安装环境 # 安装环境 # yum-utils&#xff1a;提供了管理yum仓库的工具。…...

Grails应用http.server.requests指标数据采集问题排查及解决

问题 遇到的问题&#xff1a;同一个应用&#xff0c;Spring Boot(Java)和Grails(Groovy)混合编程&#xff0c;常规的Spring Controller&#xff0c;可通过Micromete Pushgateway&#xff0c; 采集到http.server.requests指标数据&#xff0c;注意下面的指标名称是点号&#…...

使用 WPF 和 C# 将纹理应用于三角形

此示例展示了如何将纹理应用于三角形,以使场景比覆盖纯色的场景更逼真。以下是为三角形添加纹理的基本步骤。 创建一个MeshGeometry3D对象。像往常一样定义三角形的点和法线。通过向网格的TextureCoordinates集合添加值来设置三角形的纹理坐标。创建一个使用想要显示的纹理的 …...

【vue3项目使用 animate动画效果】

vue3项目使用 animate动画效果 前言一、下载或安装npm 安装 二、引入组件三、复制使用四、完整使用演示总结 前言 提示&#xff1a;干货篇&#xff0c;不废话&#xff0c;点赞收藏&#xff0c;用到会后好找藕~ 点击这里&#xff0c;直接看官网哦 &#x1f449; 官网地址&#…...

C#中颜色的秘密

颜色的秘密: 颜色Color是一个调色板, 所有颜色都是由透明度Alpha,红Red,绿Green,蓝Blue按不同比例调色混合而成,如果不考虑透明度Alpha,颜色共有256*256*25616777216种 ColorARGB A,R,G,B都为byte型[8位],因此可以用整体的32个整数[Int32]来表示一种颜色 Color 所属命名空…...

Spring AI 从入门到实践

​Spring AI 从入门到实践 1.什么是Spring AI 2.使用Spring Boot&Spring AI快速构建AI应用程序 3.ChatClient&Chat Model简化与AI模型的交互 4.Spring AI Prompt:与大模型进行有效沟通 5.结构化输出大模型响应 6.实战:AI聊天机器人 Ben技术站关注Java技术&#x…...

服务器一次性部署One API + ChatGPT-Next-Web

服务器一次性部署One API ChatGPT-Next-Web One API ChatGPT-Next-Web 介绍One APIChatGPT-Next-Web docker-compose 部署One API ChatGPT-Next-WebOpen API docker-compose 配置ChatGPT-Next-Web docker-compose 配置docker-compose 启动容器 后续配置 同步发布在个人笔记服…...

milvus过滤功能

数据格式: [{"id": 0, "vector": [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592], "color": "pink_8682", "likes": 165},{"id": 1, "vecto…...

JavaScript系列(25)--性能优化技术详解

JavaScript性能优化技术详解 ⚡ 今天&#xff0c;让我们深入探讨JavaScript的性能优化技术。掌握这些技术对于构建高性能的JavaScript应用至关重要。 性能优化基础 &#x1f31f; &#x1f4a1; 小知识&#xff1a;JavaScript性能优化涉及多个方面&#xff0c;包括代码执行效…...

基于vite+vue3+mapbox-gl从零搭建一个项目

下面是基于 Vite、Vue 3 和 Mapbox GL 从零搭建一个项目的完整步骤&#xff0c;包括环境搭建、依赖安装、配置和代码示例。 1. 初始化项目 首先&#xff0c;使用 Vite 快速创建一个 Vue 3 项目&#xff1a; npm create vuelatest vue3-mapboxgl --template vue cd vue3-mapbo…...

驱动开发系列33 - Linux Graphics mesa Intel驱动介绍

一:概述 mesa 中的 Intel 驱动体系是为支持 Intel GPU 提供图形 API 的硬件实现部分,主要包括 OpenGL、Vulkan等图形接口,Intel驱动实现整体上分为四层: 第一层:API 层, 实现 OpenGL 和 Vulkan 接口, src/mesa/main、src/vulkan。 第二层:驱动层,实现 OpenGL 和 Vulkan…...

【git】-3 github创建远程仓库,上传自己的项目,下载别人的项目

一、如何使用Github 1、创建远程仓库 2、使用github拉取/推送代码 克隆仓库 向远程仓库推送代码-git push 二、上传我们自己的项目到github 方法一&#xff1a;直接上传 方法二&#xff1a;使用git命令 方法三&#xff1a; 将仓库拉取到本地上传 三、下载别人的项目 …...

[Qt]常用控件介绍-多元素控件-QListWidget、QTableWidget、QQTreeWidget

目录 1.多元素控件介绍 2.ListWidget控件 属性 核心方法 核心信号 细节 Demo&#xff1a;编辑日程 3.TableWidget控件 核心方法 QTableWidgetItem核心信号 QTableWidgetItem核心方法 细节 Demo&#xff1a;编辑学生信息 4.TreeWidget控件 核心方法 核心信号…...

_STM32关于CPU超频的参考_HAL

MCU: STM32F407VET6 官方最高稳定频率&#xff1a;168MHz 工具&#xff1a;STM32CubeMX 本篇仅仅只是提供超频&#xff08;默认指的是主频&#xff09;的简单方法&#xff0c;并未涉及STM32超频极限等问题。原理很简单&#xff0c;通过设置锁相环的倍频系数达到不同的频率&am…...

Flink链接Kafka

一、基于 Flink 的 Kafka 消息生产者 Kafka 生产者的创建与配置&#xff1a; 代码通过 FlinkKafkaProducer 创建 Kafka 生产者&#xff0c;用于向 Kafka 主题发送消息。Flink 执行环境的配置&#xff1a; 配置了 Flink 的检查点机制&#xff0c;确保消息的可靠性&#xff0c;支…...

Maven 配置本地仓库

步骤 1&#xff1a;修改 Maven 的 settings.xml 文件 找到你的 Maven 配置文件 settings.xml。 Windows: C:\Users\<你的用户名>\.m2\settings.xmlLinux/macOS: ~/.m2/settings.xml 打开 settings.xml 文件&#xff0c;找到 <localRepository> 标签。如果没有该标…...

【PHP】双方接口通信校验服务

请求方 使用 ApiAuthService::buildUrl($domain, [terminal => 1, ts => time()]); //http://域名/adminapi/login/platformLogin?sign=F7FE8A150DEC18BE8A71C5059742C81A&terminal=1&ts=1736904841接收方 $getParams = $this->request->get();$validate…...

mac 安装docker

1、下载docker 进入 /Applications/Docker.app/Contents/MacOS/Docker Desktop.app/Contents/Resources目录 把app.asar 文件备份 将下载的中文包复制进去。修改成一样的名字 [汉化包下载地址](https://github.com/asxez/DockerDesktop-CN)...

ANSYS Fluent学习笔记(七)求解器四部分

16.亚松弛因子 Controls面板里面设置&#xff0c;它能够稳定计算的过程。如果采用常规的迭代算法可能结果就会发生振荡的情况。采用亚松驰因子可以有助于残差的稳定。 他的取值范围是0-1&#xff0c;0代表没有亚松驰&#xff0c;1表示物理量变化很快&#xff0c;一般情况下取…...

【微服务】面试 3、 服务监控 SkyWalking

微服务监控的原因 问题定位&#xff1a;在微服务架构中&#xff0c;客户端&#xff08;如 PC 端、APP 端、小程序等&#xff09;请求后台服务需经过网关再路由到各个微服务&#xff0c;服务间可能存在多链路调用。当某一微服务挂掉时&#xff0c;在复杂的调用链路中难以迅速确定…...

llamafactory使用8张昇腾910b算力卡lora微调训练qwen2-72b大模型

说明 我需要在昇腾服务器上对Qwen2-72B大模型进行lora微调&#xff0c;改变其自我认知。 我的环境下是8张910B1卡。显存约512GB。 准备&#xff1a;安装llamafactory 请参考官方方法安装llamafactory&#xff1a;https://github.com/hiyouga/LLaMA-Factory 特别强调下&…...

在服务器上增加新网段IP的路由配置

在服务器上增加新网段IP的路由配置 前提条件步骤一:检查当前路由表步骤二:添加新路由步骤三:验证新路由步骤四:持久化路由配置脚本示例结论在网络管理中,路由配置是一项基本且重要的任务。它决定了数据包在网络中的传输路径。本文将详细介绍如何在服务器上增加新的路由配置…...