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 를 해주는 것이 좋아요 :)
'개발 편의성을 위한 소소한 Tips > 04 질의 응답 정리' 카테고리의 다른 글
[FPGA Q/A. 008] FCLK_Reset 을 PS 에서 제어하기. (0) | 2021.09.21 |
---|---|
[Verilog HDL Q/A. 007] ASIC 에서 합성가능한 Memory code? (0) | 2021.09.16 |
[Verilog HDL Q/A. 005] High impedance 출력 (0) | 2021.09.11 |
[Verilog HDL Q/A. 004] 비메모리 설계시, 리눅스 환경을 사용하는 이유 (3) | 2021.09.10 |
[Verilog HDL Q/A. 003] 시뮬레이션에서 클럭 rising edge 순간 판단 대상이 되는 신호도 함께 천이 됩니다. 이런 경우 논리 상태에 대해 궁금합니다. (0) | 2021.09.09 |