디지털 로직하는 사람들한테 타이밍 관련된 문제에서 가장 골치 아픈 것이 metastable 문제이라고 말씀 드렸었습니다. 사실, metastable을 피하는 방법은 예전에 한번 posting한 적이 있는데요.
요즘 IT-SoC의 온라인 강의를 듣다 보니 관련 내용이 있어서 간단한 팁을 하나 올립니다.
Metastable을 피하는 가장 머리가 편한 방법은 2개의 F/F을 직렬로 사용하는 2-flop 방법입니다. 저렴한 방법으로는 하나의 F/F을 사용하는 1-flop 방식도 있습니다만, 1-flop 방식은 첫 번째 F/F이 공교롭게 meta level에 걸리는 경우 뒷부분의 회로가 영향을 받아서 망가질 수 있는 단점이 있지요.
여하튼, 비동기적인 방법(stoppable clock과 같은 방식)을 사용하지 않는 경우에는 F/F을 부가하는 것이 가장 간단한 방법이라는 것이죠.
그런데, 1-flop이던 2-flop이던 F/F을 이용하여 동기화기(synchronizer)를 만들고 이 회로에 대한 타이밍 시뮬레이션 할 때, 동기화기로 사용한 F/F이 setup/hold timing을 만족하지 못하는 경우 F/F의 출력이 unknown으로 되어 전체 시뮬레이션이 망가지는 경우가 있다는 점이지요.
이 부분에 대하여 요즘 듣고 있는 강좌에서는 해당 Synchronizer를 instance할 때 특별한 이름(synchronizer)을 주고 이 부분에 대한 SDF를 조작해 주는 방법을 이야기했는데요.. 사실 좀 귀찮죠.. SDF 뽑은 다음에 조작하려면 손으로 하던지(설마요..^^;), scripting을 해야 하는데 말이죠.
쉬운 방법은 system_task를 사용하는 겁니다.
VerilogXL이나 NCverilog에서는 다음과 같은 명령이 있습니다. (Modelsim은 안써봐서 모르겠습니다.)
$disable_warnings(“timing”, hierarchy_path); |
잠시 구글링 해보니 Modelsim에서는 다음과 같이 하면 되는 군요.
tcheck –off hierarchy_path |
실제적으로 사용할 때는 synchronizer에 대하여 timing체크를 안하도록 하는 명령을 disable_path같은 곳에 주욱 나열하고 필요한 경우에 include해서 사용하는 거죠. 사실 이 disable path list는 false_path 잡을 때도 사용이 되겠지요.
`ifdef TIMING_SIM
`include “disable_path.v” `endif |
상당히 간단한 TIP입니다만, 모르면 고생하는 그런 내용이죠. ^^;
바로 전에 쓰신 글에도 clock domain crossing 과 metastability에 대한 내용이 있어서 재미있게 읽었는데 이것도 꼭 기억해야할 팁이네요. 이런 건 항상 한참 고생한 후에 생각이 나서…^^;
원래 이런 내용이 자주 쓰는 부분은 아니라, 필요할때는 잊기 쉽지
매우 유용한 팁이지만, 팁 보다도 바쁘신 가운데도 항상 공부하시는 모습(온라인 강의까지)이 더 좋은 본보기인 것 같습니다. 2008년동안 좋은 글 감사히 읽었습니다. 2009년에도 기대하겠습니다. ^^
에고..좋은 이야기 감사드립니다.
아는것이 별로 없어서리 지금이라도 이것 저것 챙겨봐야 하는 거죠 ^^;
2009년에 좋은 일만 있으시기를 바라겠습니다.
Pingback: Metastable문제와 clock domain crossing문제 | Babyworm: Processor Architect.
ㅎㅎㅎ disalble_warnings 옵션 찾다보니 형 사이트까지 왔네요~~ㅋㅋㅋ
아마 요즘은 블로그 관리 안하시겠죠??ㅋ
아.. disable_warnings 옵션으로 Glitch suppression waring은 없앨 수 없나요??
ㅋㅋㅋ
-권형-
관리를 안하는 건 아닌데.. 아무래도 facebook이나 google+ 같은 것들과 “바쁘다는 핑계”로 자주 못들어오는 건 사실이지..
Glitch suppression waring이 정확하게 어떤 것을 의미하는지는 모르겠는데, 내가 생각하는 delta cycle내에서 pos와 neg가 발생(혹은 그 역도 되지만..)해서 발생한 warning을 의미하는 것이라면..
매크로로 없애야 할 대상이 아니라 잡아야 할 대상이지..
대부분 설계 버그니까.
안녕하세요. disable_warnings 검색하다가 들어오게 됬는데요.
질문이 있는데요 disable_warnings가 Timing violation message도 막아주고
unknown propagation도 막아주는건가요?
그리고 disable_warnings를 TCL에서도 사용할수 있는지요?
timing violation으로 인해서 발생하는 unknown이나 message를 막아주게 됩니다.
즉, timing simulation과정에서 asych path에서 발생하는 문제를 없애주는 거죠.
system task이므로 TCL과는 관계 없겠죠?
disable_warning 이라는 명령어가 timing violation 을 잡아주는건가요? 지정된 path의 timing violation에 대한 warning 만 안뜨도록 하는 명령어 아닌가요?
system task로 timing violation 자체를 잡아줄리가요.
본문과 comment중에도 있지만 Timing simulation(gate level sim. 이라고 해도 무방하죠)에서 불필요한 violation때문에 unknown이 발생해서 시뮬레이션이 잘못되는 것을 막아주는 것입니다.