본문 바로가기

2-2/디지털 설계 및 실험

[디지털 설계 및 실험] 8. tasks and functions

지금까지 배운것으로만 해도 Verilog 다 할 수 있다.(수정/내가 behavioral modeling 포스팅을 안했었구나..)

지금부터는 추가적인 기능들에 대해서 포스팅 하겠다.

 

💻 Function vs Task

둘다 C언어에서 함수와 비슷한 기능을 수행한다.

둘다 모듈안에 정의되어야 하고 해당 모듈 안에서만 쓰인다는 공통점이 있다.

 

차이점을 봐보자.

 

Function

  • Function은 다른 Function은 이용할수 있지만, task를 이용할 수는 없다.
  • 0의 시뮬레이션 시간에 실행된다.
  • 어떠한 delay, event, timing control statement도 포함해서는 안된다.
  • 적어도 하나의 입력인자가 있어야한다.
  • 항상 하나의 리턴값만을 반환한다.
  • output이나 inout 인자를 가질수 없다.

 

Tasks

  • 다른 task나 Function을 사용할 수 있다.
  • 0이 아닌 시뮬레이션 시간에 사용될 수 있다.
  • delay,event,timing control statement를 포함할 수 있다.
  • 입력인자가 없어도 된다.
  • 값을 반환하지는 않는다, 하지만, 복수의 값들을 output, inout 을 통해서 통과시킬 수 있다.
  • 0개이상의 output,inout 인자를 가질 수 있다.

 

 

💻 Task

 

 

위는 task를 사용하는 에제이다. always 문 안에서 bitwise_oper(AB_AND, AB_OR, AB_XOR,A,B);의 형태로

bitwise_oper라는 task를 호출하고 있다.

 

밑 블루박스는 bitwise_oper라는 task를 정의해둔 것이다.

operation이라는 모듈 내부에서 정의되어있으며, 모듈안에 지정되어 있는 reg들의 값들을 바꿔주는 역할을 수행한다.

 

c언어에서의 함수랑은 function이 조금 더 가까운 역할을 하고 있는 듯 보인다.

task는 계속 수행해야 하는 번거로운 일을 지정해두는 매크로 역할을 하고 있다.

task를 수행하면 내부 레지스터들의 값들도 다 변한다. 

 

 

위처럼 clock이라는 신호에 delay를 걸어주며 계속해서 값을 바꿀 수도있다.

그리하여, task는 simulation module에서 많이 사용된다.

 

task는 static이다. 이말은, 하나라서 여러명이 동시에 access할 수 있다는 것이다.

여러명이 동시에 access하면, 충돌하여 문제가 생긴다.

이를, 해결해주는 것이 automatic이다.

 

task 뒤에 automatic을 붙여준다. 밑의 박스에서 posedge 일때, bitwise_xor을 호출하는 구문이 2개나 있다.

2개의 task가 동시에 호출되었지만, automatic이 붙어있으므로, 독립적으로 수행한다.

 

💻Function

Function은 c언어의 함수와 유사하다고 보면 되겠다.

delay,timing,event control요소는 들어갈 수 없으며, 반환값이 있다.

 

c언어 함수랑 똑같으니깐, 뭐 보면 알겠지..

그리고, function은 재귀적으로는 잘 사용 안한다고한다.

그런데도, 동시에 부르거나 재귀호출 해서 문제가 생긴다면 automatic 키워드를 사용해주면 된다.