verilog-相关,CDC

294 阅读6分钟

fork join testbench中常用

fork块中begin和end之间的语句会顺序执行。 并发执行。

fork join中的语句为并执行执行的,为并行语句块。语句之间同时开始,并行执行,虽然无法综合,但是用于testbench的编写时非常有用

特点:

  • 块内语句同时执行的,程序流程控制进入该模块时刻,块内语句即开始同时并行执行;
  • 当耗时最长的语句执行完成后,程序才跳出该并行模块;

CDC

CDC(不同时钟之间传数据)问题是ASIC/FPGA设计中最头疼的问题。CDC本身又分为同步时钟域和异步时钟域。这里要注意,同步时钟域是指时钟频率和相位具有一定关系的时钟域,并非一定只有频率和相位相同的时钟才是同步时钟域。异步时钟域的两个时钟则没有任何关系。这里假设数据由clk1传向clk2。

单bit同步时钟域:

单bit传输时,同步时钟域因为频率和相位关系都是已知的,可以推导的,所以不需要采用额外的硬件电路就可以解决CDC问题,只需要源数据在clk1端保持足够长时间即可。让其保持足够长时间有两个好处:即便出现亚稳态,也可以在两个clk2时钟周期后数据变得稳定下来,从而采到正确的结果。还可以防止低频采高频时,因为频率跟不上而导致数据丢失。

单bit异步时钟域:

单bit传输时,异步时钟域的传输就必须使用额外的电路模块(同步器)来保证数据正确的传输。最基本的同步器是双锁存结构的电平同步器,其余的同步器都是由其衍生而来。该同步器的基本原理,也是让数据至少在clk2的时钟下保存两个周期,消除亚稳态。当然同步器能解决异步时钟域的同步问题,自然也可以拿来解决同步时钟域的问题,毕竟同步时钟域更简单一些。

多bit:

对多个bit各自采用单bit的同步机制,会导致输出一些错误的中间状态。对于多bit传输,只能使用握手信号或者异步fifo。

有关系的时钟之间传单bit数据,理论上只需要源数据保持足够长的时间(clk2的两个周期)即可;

无关系的时钟之间传单bit数据,必须要使用同步器;

不管有无关系的时钟进行单bit传输,脉冲同步器都可以解决这个问题;

多bit传输只能使用握手机制或者异步fifo;

低频采高频,为防止数据不丢失,应当让源数据变慢,多保持一些周期;高频采低频则不需要,但是高频采低频得到的结果可能带有很多冗余。

同步——快时钟域到慢时钟域 低频采集高频

慢时钟域到快时钟域中:同步器的控制传递是单向的,即仅从源时钟域到目的时钟域,目的时钟域并没有状态反馈。

在快时钟域到慢时钟域 中可能存在问题: 源时钟域中的第一个脉冲和第二个脉冲间隔过短,第一个脉冲未完成同步,第二脉冲又将状态清空,导致最终脉冲同步丢失。

要解决以上同步问题,需要引入异步握手机制,保证每个脉冲都同步成功,同步成功后再进行下一个脉冲同步。握手原理如下:

  • sync_req: 源时钟域同步请求信号,高电平表示当前脉冲需要同步;

sync_ack: 目的时钟域应答信号,高电平表示当前已收到同步请求;

源时钟域 目的时钟域:

(1) 同步请求产生;当同步器处于空闲(即上一次已同步完成)时,源同步脉冲到达时产生同步请求信号sync_req;    (2) 同步请求信号sync_req同步到目的时钟域,目的时钟域产生脉冲信号并将产生应答信号sync_ack;    (3) 同步应答信号sync_ack同步到源时钟域,源时钟域检测到同步应答信号sync_ack后,清除同步请求信号;    (4) 目的时钟域检测到sync_req撤销后,清除sync_ack应答;源时钟域将到sync_ack清除后,认为一次同步完成,可以同步下一个脉冲。

cache

高速缓冲存储器(Cache)实际上是为了把由DRAM组成的大容量内存储器都看做是高速存储器而设置的小容量局部存储器,一般由高速SRAM构成。

这种局部存储器是面向CPU的,引入它是为减小或消除CPU与内存之间的速度差异对系统性能带来的影响。

Cache 通常保存着一份内存储器中部分内容的副本(拷贝),该内容副本是最近曾被CPU使用过的数据和程序代码。

Cache的有效性是利用了程序对存储器的访问在时间上和空间上所具有的局部区域性,即对大多数程序来说,在某个时间片内会集中重复地访问某一个特定的区域。如PUSH/POP指令的操作都是在栈顶顺序执行,变量会重复使用,以及子程序会反复调用等,就是这种局部区域性的实际例证。因此,如果针对某个特定的时间片,用连接在局部总线上的Cache代替低速大容量的内存储器,作为CPU集中重复访问的区域,系统的性能就会明显提高。

系统开机或复位时,Cache 中无任何内容。当CPU送出一组地址去访问内存储器时,访问的存储器的内容才被同时“拷贝”到Cache中。此后,每当CPU访问存储器时,Cache 控制器要检查CPU送出的地址,判断CPU要访问的地址单元是否在Cache 中。若在,称为Cache 命中,CPU可用极快的速度对它进行读/写操作;若不在,则称为Cache未命中,这时就需要从内存中访问,并把与本次访问相邻近的存储区内容复制到 Cache 中。未命中时对内存访问可能比访问无Cache 的内存要插入更多的等待周期,反而会降低系统的效率。而程序中的调用和跳转等指令,会造成非区域性操作,则会使命中率降低。因此,提高命中率是Cache 设计的主要目标。

cache叫做高速缓冲存储器,是介于中央处理器和主存储器之间的高速小容量存储器。

CPU的速度远高于内存,当CPU直接从内存中存取数据时要等待一定时间周期,而Cache则可以保存CPU刚用过或循环使用的一部分数据,如果CPU需要再次使用该部分数据时可从Cache中直接调用,这样就避免了重复存取数据,减少了CPU的等待时间,因而提高了系统的效率。

整体说来cache是CPU与内存之间的桥梁,用于平衡高速设备(CPU)与低速设备(内存)之间的速度差异。

速度由快到慢:寄存器〉cache〉内存〉外存

存储的容量由高到低:外存〉内存〉cache〉寄存器