Thursday, January 15, 2015

[verilog] 자주쓰는 system task

verilog를 사용하다보면 시스템 태스크라는 것이 있다. 이것을 내맘대로 해석하면 verilog에서 디버깅이나 시뮬레이션에 편리하게 사용하라고 제공해주는 것 같다.

당연히 합성되지 않는다.

그 중에서 자주 사용하는 몇가지만 정리해 보려고 한다.

우선 verilog에서 시스템 태스크는 $<키워드> 형태로 나타낸다.

여기서 정리하고자 하는 시스템 태스크는 다음과 같다.
$display, $monitor, $time, $stop, $finish 이다.

1. $display 화면 출력 태스크
$display는 변수의 값 또는 문자열 또는 수식을 출력하기 위한 주요 시스템 태스크 이다.

사용법 : $display(p1, p2, ... pn);

p1, p2,... pn 은 문자열 또는 변수 또는 수식이 될 수 있다. 형식은 C언어의 printf와 매우 비슷하다.

(포맷과 출력은 구글 참조)

예문은 아래와 같다.
$display("Hello~");
-- Hello~

$display($time);
-- 230

$display("%b, %d, %h", a, b, c);
-- 00001010 (2진수)
-- 10 (10진수)
-- 0a (16진수)

$display("%m");
-- top.p1
(요건 모르던 기능! 계층이름을 출력 해줌)


2. $monitor 모니터링 태스크
$monitor는 신호의 값이 변할 때 마다 그 신호를 출력할 수 있다.

사용법 : $monitor(p1, p2, ... pn);

파라미터 p1, p2, ... pn 은 변수, 신호 이름, 문자열이 될 수 있다.
$monitor 태스크는 $display 태스크와 비슷한데 단 한번만 사용할 수 있다. 만약 $monitor 태스크가 사용되면 마지막 %monitor 문장이 수행 된다.

이 $monitor 태스크를 on/off 하기 위해서 $monitoron; 과 $monitoroff; 라는 태스크가 사용된다.

initial begin
  $monitor($time, "clock = %d, reset = %d", clock, reset);
end

-- 0 clock = 0 reset = 1
-- 5 clock = 1 reset = 1
-- 10 clock = 0 reset = 0

3. $time 시간 태스크
$time는 현재의 시뮬레이션 시간을 얻고자 할 때 쓰인다.

4. $stop 중단 태스크
$stop는 시뮬레이션 하는 동안 중단을 하기 위해서 사용한다.
사용법 : $stop;

4. $finsh 종료 태스크
$finsh는 시뮬레이션을 끝내기 위해 사용한다.
사용법 : $finsh;

($stop와 $finsh의 중단, 끝내기 라는건 알겠는데 구체적으로 어떤지는 잘 모르겠네...)

우선 이정도만 사용하면 디버깅하는데 어느정도 필요한 만큼 쓴다고 하겠다. 사실 C언어에서도 최고의 디버깅은 printf 이듯이 verilog도 눈으로 보는 디버깅은 monitor나 display인듯. (물론 시뮬레이션 파형으로 볼 때가 더 편할 때도.. 어떤게 더 좋은지는 나중에 경험하다 생각나면 다시 정리!)

나중에 이보다 더 많은 시스템 태스크에 대해서 알아보도록 하겠다.

끝!

4 comments :

  1. 블로그에 올리신 글 잘 보고 갑니다. 저는 verilog를 공부하는 사람인데요. 다른게 아니고 하나 여쭈어보고 싶어서 이렇게 글을 올립니다. 다름이 아니라 Quartus II 13.1 버전에서 $display를 이용하여 값을 확인해보려고 했는데 이 문법에 관하여 컴파일에러가 발생하여서 혹시 이거에 관하여 아시는게 있는지 여쭈어보려고 이렇게 블로그에 실례가 되지만 글을 올립니다. 보시고 좋은 답변 주시면 감사합니다.^^

    ReplyDelete
    Replies
    1. 안녕하세요~ 답변이 많이 늦었네요 ㅠ
      verilog에서 $display 사용하실 때 C언어에서 printf 사용하시던 것처럼 사용하시면 문제 없으실 꺼에요~ ^^
      예)
      $display("Hello World");
      $display(" %d \n", a);

      수고하세요~ ^^

      Delete
  2. $monitor로 출력된 결과는 어디서 확인하나요

    ReplyDelete
  3. monitor는 모니터로 확인하심되요
    푸핫

    ReplyDelete