Synchronizer 시뮬레이션 문제

디지털 로직하는 사람들한테 타이밍 관련된 문제에서 가장 골치 아픈 것이 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입니다만, 모르면 고생하는 그런 내용이죠. ^^;

11 thoughts on “Synchronizer 시뮬레이션 문제

  1. 바로 전에 쓰신 글에도 clock domain crossing 과 metastability에 대한 내용이 있어서 재미있게 읽었는데 이것도 꼭 기억해야할 팁이네요. 이런 건 항상 한참 고생한 후에 생각이 나서…^^;

  2. 매우 유용한 팁이지만, 팁 보다도 바쁘신 가운데도 항상 공부하시는 모습(온라인 강의까지)이 더 좋은 본보기인 것 같습니다. 2008년동안 좋은 글 감사히 읽었습니다. 2009년에도 기대하겠습니다. ^^

    1. 에고..좋은 이야기 감사드립니다.
      아는것이 별로 없어서리 지금이라도 이것 저것 챙겨봐야 하는 거죠 ^^;
      2009년에 좋은 일만 있으시기를 바라겠습니다.

  3. ㅎㅎㅎ disalble_warnings 옵션 찾다보니 형 사이트까지 왔네요~~ㅋㅋㅋ

    아마 요즘은 블로그 관리 안하시겠죠??ㅋ

    아.. disable_warnings 옵션으로 Glitch suppression waring은 없앨 수 없나요??

    ㅋㅋㅋ

    -권형-

    1. 관리를 안하는 건 아닌데.. 아무래도 facebook이나 google+ 같은 것들과 “바쁘다는 핑계”로 자주 못들어오는 건 사실이지..

      Glitch suppression waring이 정확하게 어떤 것을 의미하는지는 모르겠는데, 내가 생각하는 delta cycle내에서 pos와 neg가 발생(혹은 그 역도 되지만..)해서 발생한 warning을 의미하는 것이라면..

      매크로로 없애야 할 대상이 아니라 잡아야 할 대상이지..

      대부분 설계 버그니까.

  4. 안녕하세요. disable_warnings 검색하다가 들어오게 됬는데요.
    질문이 있는데요 disable_warnings가 Timing violation message도 막아주고
    unknown propagation도 막아주는건가요?

    그리고 disable_warnings를 TCL에서도 사용할수 있는지요?

    1. timing violation으로 인해서 발생하는 unknown이나 message를 막아주게 됩니다.
      즉, timing simulation과정에서 asych path에서 발생하는 문제를 없애주는 거죠.

      system task이므로 TCL과는 관계 없겠죠? 🙂

  5. disable_warning 이라는 명령어가 timing violation 을 잡아주는건가요? 지정된 path의 timing violation에 대한 warning 만 안뜨도록 하는 명령어 아닌가요?

    1. system task로 timing violation 자체를 잡아줄리가요.
      본문과 comment중에도 있지만 Timing simulation(gate level sim. 이라고 해도 무방하죠)에서 불필요한 violation때문에 unknown이 발생해서 시뮬레이션이 잘못되는 것을 막아주는 것입니다.

Leave a Reply