关于多时钟模块中复位同步器的问题
是要插入一个同步器还是两个同步器?插入一个同步器的话,那显然只能选择一个时钟作为同步器的时钟端口信号,这样会不会导致处于不同时钟域的触发器出现recovery/removal的违例?
如果插入两个同步器,那好像就会导致模块中的触发器复位时间不一致,从而导致逻辑上的错误。
不知这种情况该怎么解决?诚心请教
首先,我简单介绍一下为什么需要synchronizer. 对于时序元件来说,我们会定义setup/hold时间,当数据在setup time之前变化,输出在一定的时间后反映的是采样的新数据。 如果数据在hold time之后变化,输出将保持原来的值。 如果数据在setup和hold之间的一个小窗口内变化时输出数据将有可能变得不可预测,并且输出要稳定到一个有效电位(0 or VDD)的时间将可能是无限的。对于同步电路设计来说,我们可以保证数据相对时钟满足setup/hold要求。 但是对于跨时钟域的数据来说,它相对另一个时钟域的变化时间是不确定的,所以就有可能造成上述的metastability问题。 所以,我们可以看到这是关于一个时钟域A的数据与另一个时钟域B的时钟之间,遭遇在此时钟域B中某时序元件(reg,latch)处,涉及setup/hold时的个人恩怨,与别的信号无关,而同步器就被用来解决这个问题。
异步复位信号相对时钟来说是异步的,不论是一个时钟还是两个时钟。那么为什么异步复位信号在跨时钟域时需要同步? 个人认为是不需要的,因为同步器的本职工作是解决metastability问题,而异步复位信号不存在这个问题,因为它本身就没有setup/hold的概念,他的复位是通过组合逻辑实现的,通常在flop输出与数据相与或相或,从而不会引起以上提到的metastability问题。既然没有这个问题,也就不需要被同步。
简单点,同步通常就是针对一个时钟域的信号跨越到另一个时钟域,并接入到时序元件的D输入,也就是有setup/hold要求的端口,这时就与clock之间有产生metastability问题的可能性,所以你只需要看是不是有这个可能性,有就需要被同步。 如果数据在两个时钟域有相互的,以上说的行为,那么就需要两组同步器。
个人愚见,可以共同讨论。
首先谢谢你的答复。
不过我感觉你说的和我想问的好像不是一个意思,当然也可能是我理解差了,请批评指正。
我说的异步复位,是指在模块中像下面这样的代码:
always @ (posedge clk or negedge rst)
begin ....end
在这种复位模式下,一般而言是要加入一个synchronizer,代码如下所示:
reg syn_rst, rff1;
always @ (posedge CLK or negedge RESET)
if (!RESET) {syn_rst, rff1} <= 2'b0;
else {syn_rst, rff1} <= {rff1, 1'b1};
加入这个synchronizer的目的,是为了避免带复位端口的触发器出现recovery/removal的violation,从而引发的亚稳态的问题。
那如果我这个module有两个时钟输入端口,对于每个时钟端口插入一个synchronizer,然后这两个synchronizer共用一个从reset端口引入的reset信号,这两个时钟端口对应的时钟周期不妨称为clk1和clk2。那么插入的两个synchronizer的输出的复位信号相比较于从模块的reset端口引入的复位信号就要分别延迟上两个clk1和clk2的周期,由于clk1和clk2的周期和相位的不同,就导致这两个时钟域对应的触发器的完成复位的时间不同,这在我做的这个项目中应该是不允许的。在这种情况下,该如何去处理reset信号呢?
表达的比较冗长,有劳指正。
我不知道为什么你一定需要两个时钟域对应的触发器完成复位的时间一样,如果只是要求有固定顺序就好办多了,比如时钟域A的复位一定比时钟域B的复位早两个周期,要同时完成这个恐怕不能做。
to yohuang:
你提到说”因为同步器的本职工作是解决metastability问题,而异步复位信号不存在这个问题,因为它本身就没有setup/hold的概念,他的复位是通过组合逻辑实现的,通常在flop输出与数据相与或相或,从而不会引起以上提到的metastability问题“,我觉得有时候并不是这种情况,至少在我做的项目中不是。项目中用到的foundry提供的逻辑库里,是有带复位端口的触发器的,对于这种触发器,如果不能保证复位端口的信号和时钟端口的信号的时序关系,就会出现recovery/removal的violation,这一点在没加入synchronizer的情况下通过用primetime做STA已经验证过了,会报出recovery/removal的violation,所以要加入synchronizer,并不是说要让对应于不同时钟域的触发器的复位信号彼此之间同步,而是让复位信号跟对应的时钟信号同步,从而能规避刚才提到的recovery/removal的violation。
不过多谢你的答复,让我对复位同时完成这个问题有了比较清晰的了解。想让不同时钟域下的触发器同步完成复位确实很难做到,按照一定顺序复位还是能实现的。之前可能是我对项目中复位的问题考虑的还不是很明白。总之谢谢你的答复,以后有问题还要多多讨论。
呵呵,你说的是对的,我之前的考虑不够全面,因为对异步信号来说,是不能够保证设计满足recovery/removal时间的,只有同步到某个时钟域以后才有意义去针对这个时钟检查recovery/removal时间是否满足了。 所以,我同意需要对reset信号在每个时钟域中用synchronizer同步。
我觉得你可以换个方式解决你的问题,就是在设计时不要那么严格要求复位信号的时间必须同时,而是放宽到有一定顺序这种方式上。
我的qq: 121760646. 多多讨论。
不错!
学习了
学习。
小编,您好!我只有一个时钟,并且只有一个异步复位信号,在PT时也出现了recovery的微利,您说的同步到一个时钟里面,我不知道是什么意思?怎么同步的?我是感接触这些,不明白,请您指教一下,谢谢!
可以采用分级释放,先释放前级rstn1,再把前级的复位信号用后级的时钟信号做同步释放rstn2,两级的异步复位信号用同一个异步复位信号,rstn1对应于clk1,rstn2对应于clk2
看看我的积分
11#正解。
1) 复位信号一般都是异步复位,同步释放。
2) 从设计角度,如果不同模块对复位有顺序要求,需要对复位信号做对应逻辑。