개발 편의성을 위한 소소한 Tips/04 질의 응답 정리

[Verilog HDL Q/A. 006] verilog 특성 관련 질문 (동작 관련)

반응형

Q1. 맛비님 현재 chapter 2를 수강하던 중 궁금한 점이 생겼습니다.

1. 제가 유튜브 같은 곳에서 verilog 특징을 찾아보다 영상에서 'verilog는 일반적인 소프트웨어 언어와 다르다 기본적으로 항상

무한 반복된다'라는 말을 들었습니다. 우리가 C 같은 언어는 while문을 돌지 않는 이상 프로그램이 한 번 실행된 뒤 끝납니다

위 말에 따르면 verilog는 $finish;를 만나지 않는다면 코드가 무한하게 반복되는다는 건데 맞는 생각인가요?

2. 1번 질문에서 파생된 것인데. chapter2에서 initial begin - end는 딱 한번만! 실행된다고 하셨습니다.

그럼 1번 질문에서 verilog는 $finish가 없다면 계속 반복된다 라는 말이 맞다면 inital begin - end는 계속 반복되는 와중에도

정말 1번만 실행되는 건가요 아니면 계속 반복되는 도중에도 1번씩 계속 실행되는 건가요?

====================== 1번 아이디어

코드 1번째 반복 inital 1번 실행

코드 2번째 반복 inital 실행 되지 않음

코드 3번째 반복 inital 실행 되지 않음

======================2번 아이디어

코드 1번째 반복 inital 1번 실행

코드 2번째 반복 inital 1번 실행

코드 3번째 반복 inital 1번 실행

위 둘중에서 뭐가 맞는건가요?

 

A1.

안녕하세요. 굉장히 심오한 질문이군요.

Verilog HDL 은 Hardware Description Language 입니다.

Program 이 아닌 Design 이죠.

질문자 님께서 작성하신 Code 가 HW 로 만들어 지는 겁니다. 

로직이 만들어 진 것이구요. 전기신호가 들어가기만 하면 동작합니다. 즉, 전기가 들어오면 off 될때까지 "무한히" 동작하죠.  일반적인 SW 인 C/C++ 는 HW 위에 동작하는 Code 입니다. HDL 처럼 로직이 생성되는 것이아닌, 생성되어 있던 HW 위에 동작하는 SW 입니다. 

위 말이 이해가 되시면됩니다.

답변 드릴께요.

1. Verilog HDL 에서의 $finish 는 Testbench 상에서 시뮬레이션의 종료를 나타내는 System task 입니다.

즉 $finish 는 Testbench 에서 사용될 뿐, DUT 를 위한 task 가 아닙니다. 위에서 말씀드렸지만 전기가 들어오면 무한히 run 합니다. 그게 HW 입니다. "코드가 무한반복" 이라는 표현보다는 실제로 HW 로직이 생긴 것이며, 우리가 전기를 인가하면 무한히 도는 HW 로직의 특성 때문입니다. 그래서 $finish 를 만나기 전까지 시뮬레이션 상에서 "무한반복" 하는 것 처럼 보였던 것이죠. SW 와 HW Language 는 태생이 다릅니다. 개념을 잘 가져가세요.

2. 자 initial begin-end 는 Testbench 에 사용되는 문법입니다. DUT 에는 사용할 수 없어요. 왜냐하면 HW 로직이니까요. HW 로직은 전기신호가 들어가면 무한히 돕니다. 그래서 initial begin-end 를 사용해서 DUT 를 절대로 설계할 수 없습니다. 

정리하면, $finish,  initial begin-end  는 Simulation 을 위한 Verilog HDL 의 문법으로, Testbench 에서만 사용한다.

아이디어는 제가 이해를 못했습니다. DUT 에 해당되는 내용인가요? 그렇다면 initial begin-end 는 사용할 수 없음으로, 아이디어로 적어주신 내용이 성립되지 않습니다.

Testbench 인가요? 그렇다면  initial begin-end  한번만 동작하게 됩니다.

읽어보시고, 다시 남겨주시면 답변드릴께요.  굉장히 중요한 개념입니다.

즐공하세요 :)

 

 

Q2. SW에서 HW 설계 언어로 넘어오니 혼동되었던 부분이 있었던 것 같습니다.

제가 연습하다 Testbench에 $finish; 를 하지 않고 웨이브를 찍어보니 엄청난 렉이 걸리면서 확인이 어려웠습니다.(이카루스에 한 번 해보았더니요)

그래서 Testbench에 있는 initial begin-end 부분이 계속 반복된다고 생각했습니다.

사실은 그게 아니라 Testbench에 의해 HW 로직이 생겼고, 시뮬레이션을 돌리면 이 HW 로직에 전기를 계속 공급하는 거니까 시뮬레이션이 무한히 반복되는 것인데 이 부분을 헷갈렸던 것 같습니다.

답변 감사합니다. 개념의 차이가 있네요.  

 

A1. 

안녕하세요 :)

시뮬레이션의 종료를 잘 기술 하는 것이 중요하죠. 툴 옵션 중에 $finish 없이도, 시뮬레이션 시간을 설정하여 종료시킬 수 있긴합니다...만? 

개발자가 명확하게 $finish 를 해주는 것이 좋아요 :) 

 

반응형