作者kuoll (kuoll)
看板Electronics
标题[问题] 以下verilog是否要synchronize?
时间Fri Oct 20 18:04:36 2017
本人有个verilog如以下设计
always@(posedge appclk or posedge reset)
if(reset) state <= 2'b00;
else if(!enable) state <= 2'b00;
else
case(state[1:0])
2'b00: if(condition1) state <= 2'b10;
2'b10: if(condition2) state <= 2'b11;
2'b11: if(condition3) state <= 2'b10;
endcase
其中
enable来自另一clk domain
always@(posedge cpuclk or posedge cpurst)
if(cpurst) enable <= 0;
else if(condition4) enable <= cpuwrdata[1];
简而言之
由cpu填写enable=1的时候
state才能跳动到其它数值
请问这个enable需不需要先synchronize到appclk再给state使用?
(假设两clk domain完全独立)
与同事讨论 一派说法是要:
post-sim的时候观察到
若enable active的时间太接近appclk rising edge
的确会发生timing violation
导致state跳到非00的值或是unknown
另一派说法是不用:
以我们的应用:enable刚启动时 condition1,2,3都是inactive
因此appclk rising瞬间不论抓到enable是0还是1
依RTL要继续由condition1,2,3来判断state下一步
即然condition1,2,3都不动作 state自然该保持在00
下一Tenable稳定了 自然state也不会跳错了
本人经验尚浅
版友可否指正两派说法的弱点之处?
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 122.146.122.70
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/Electronics/M.1508493878.A.438.html
1F:→ Leadgen: 敲2下,不会花你很多时间。而且不会出现奇怪的问题。 10/20 19:19
2F:推 mmonkeyboyy: 一楼到也不是 这个东西是sync设计当出现的问题之一 10/20 20:37
3F:→ mmonkeyboyy: 这个cross clock domain design (应该是这个名字) 10/20 20:38
4F:推 mmonkeyboyy: 或是clock domain crossing 应该google 有很多 10/20 20:40
5F:推 bakerly: 不敲两级s会有metastable问题,但有metastable问题不代表 10/20 21:52
6F:→ bakerly: 一定会死,enable从0变1时保证condiction都是0的确是一 10/20 21:52
7F:→ bakerly: 种解法,但要注意的是enable从1变0 一样有metastable问题 10/20 21:52
8F:→ bakerly: ,这时state有可能会有短暂暂态,这个暂态会不会让你的电 10/20 21:52
9F:→ bakerly: 路挂掉你就要自已确认了。 10/20 21:52
10F:推 ericute: 请问原po与b大,如果enable第一T抓到unknown,state不就 10/21 09:19
11F:→ ericute: 会错了吗?为什麽还能确认是在00这个state呢,谢谢 10/21 09:19
12F:→ ericute: 我想法是跟condition有无成立应该没关系,可能还是有机 10/21 09:22
13F:→ ericute: 会fail 10/21 09:22
14F:推 bakerly: 如果enable 0的够久,state 已经归0,在enable变1时condu 10/21 10:46
15F:→ bakerly: ction 也全为0的条件下, 这电路state的din在enable rise 10/21 10:46
16F:→ bakerly: 的前後会一直维持在0,这时跟本不会有setup hold 的问题 10/21 10:46
17F:→ bakerly: ,会出现unknow一定是前题没被满足。 10/21 10:46
18F:推 ericute: 谢谢b大,了解没注意到enable一开始会很长一段0。题外, 10/21 11:47
19F:→ ericute: 若enable在一段0後,接着不是long pusle的话,是否就不 10/21 11:47
20F:→ ericute: 适用原po说的第二种情形呢,还是得syn过,感谢 10/21 11:47
21F:推 bakerly: 这电路state归0只有靠enable为0来达成,但enable和state 10/21 14:20
22F:→ bakerly: 非同步,所以enable falling时的确有可能造成state unkno 10/21 14:20
23F:→ bakerly: w而向後扩散导致电路失败,这和enable是不是long plus 没 10/21 14:20
24F:→ bakerly: 关系,再长的puls还是可能会死。 10/21 14:20
25F:→ kuoll: 我是原po 谢谢b大详细解释 10/21 21:48
26F:推 mmonkeyboyy: 这如果没有实验纯跑模拟应该有的会给过 10/22 10:03
27F:→ mmonkeyboyy: 但你真正实作下去会有点问题 这个现代tool会给warn 10/22 10:03
28F:→ mmonkeyboyy: ing 才是 10/22 10:03
29F:→ ahoyhoy: 完全不会toggle的有时候就直接拉 10/23 17:59
30F:→ ahoyhoy: 一般还是会砍个二级sync一下 10/23 17:59