Wednesday, January 28, 2015

[verilog] Task 와 Function

이번에 정리하고자 하는것은 행위수준 설계의 태스크(task)와 함수(function) 이다.

태스크와 함수는 마치 C언어의 함수 처럼 둘다 비슷한 것 같은데 확실한 차이가 있다. 이를 분류하면 아래와 같다.

태스크(task)
- 다른 태스크나 함수를 사용할 수 있다.
- non-zero 시뮬레이션 시간에 수행될 수 있다.
- 지연, 사건, 또는 타이밍 제어 문장을 포함할 수 있다.
- input, output 또는 inout를 하나도 가지지 않거나 다수를 가질 수 있다.
- 값을 되돌릴 수 없지만, output와 input을 통해서 여러 개의 값을 전달 할 수 있다.

함수
- 다른 함수를 사용할 수 있지만 다른 태스크는 사용 할 수 없다.
- 항상 시뮬레이션 시간 0에 수행된다.
- 어떤 지연, 사건, 또는 타이밍 제어 문장을 포함할 수 없다.
- 적어도 하나 이상의 input 인수를 가져야만 한다.
- 항상 하나의 값을 되돌린다. output 또는 input 인수를 가질 수 없다.

공통적으로 태스크와 함수는 행위 수준 문장만 포함 할 수 있다.

마치 비슷한 것 같지만 확연한 차이가 있는 것을 확인 할 수 있다.

필자도 많이 사용해보지 않아 가장 궁금했던 부분들이였다. 또한 C언어는 시간 순서대로 코드가 실행되기 때문에 함수를 여러곳에서 불러다 써도 겹치는 일이 발생하지 않는다. 그러나 verilog에서는 '병렬'처리가 있기 때문에 필자가 궁금했던 사항이 있었는데

하나의 태스크나 함수를 만들어 놓고 여러번 병렬로 불러서 사용할 수 있는가?

이다.

다른 모듈을 만들어 놓고 사용할 때는 여러개로 만들어 사용할 수 있는데 태스크와 함수도 가능한 것일까?

일단 결론부터 말하면 안된다.

동시에 두곳 이상에서 불러다 쓰면 같은 변수들을 공유하고 사용하기 때문에 안되는 것이다. 하지만 이를 위해서 사용되는 키워드가 있으니 바로 'automatic' 이다.

automatic은 task 키워드 앞 또는 function 앞에 사용된다.
예)
task automatic 블라블라

function automatic 블라블라

이렇게 automatic를 사용하게되면 여러곳에서 사용하더라도 다른 태스크나 함수가 불러지게 되는 것이다.

먼가 알듯 말듯한 기분인데 역시나 사용을 많이 해봐야 알 것 같다.


4 comments :