#2. Verilog HDL 개요-(2)
Verilog/Verilog HDL강의정리(KOCW) 2023. 7. 7. 02:442강 : Verilog HDL의 모듈과 모델링 예시, 어휘규칙
1. C언어와 HDL의 차이
HDL은 회로설계를 하는 언어임, 합성을 통해서 회로도가 만들어지고, 기능을 동일하다 하더라도 회로의 성능은 달라질 수 있음. C언어는 SW프로그램을 만드는 언어임. 따라서, HDL의 경우 HW를 설계하는 언어임에 유의해서 코드를 짜야함
2. Verilog HDL 구문
(1) 논리합성 구문 : assign, if~else, case, for, always
(2) Simulation 구문 : initial, $finish $fopen
(3) Library를 개발하는데 쓰는 구문 : table, specify, $width
3. Verilog HDL의 모듈
모듈이란? : 기본설계 단위라고 이해하면 됨
모듈은 위와 같은 구성을 가지고 있으며, module ~ endmodule 사이에 여러개의 module이 들어갈 수도 있음
4. assign 문을 활용한 모델링
assign 문을 활용한 모델링 방법이다. 하드웨어 적인 코딩 특성에 따라 assign문의 순서가 바뀐다고 해도 동일한 회로가 생성된다. 위 그림은 반가산기를 모델링 한 것으로 input 에 a,b output에 sum과 count을 두고, cout 과 sum을 a,b 비트의 연산을 통해 assign 해주면 위와 같은 회로를 모델링 하게 된다.
5. 행위수준모델링(always문), 조합회로
영어로는 behavioral modeling으로 한국어로 번역했을 때에는 조금 어색한 감이 있다. 필자도 이게 무슨 의미인지 모르고 단순히 always 구문을 쓰면 행위수준 모델링으로 생각하였다. 좀 더 자세히 찾아보니, 설계의 기능을 알고리즘 위주로 작성하는 방식이 행위수준 모델링이라고 한다. 이 모델링 방법에는 initial 구문과 always 구문을 주로 쓰게 된다.
해당 그림은 2:1mux를 구현한 것이다. 간단히 해석해보면
input 에는 2비트 짜리 in0, in1 , 그리고 1비트 짜리 sel이 들어간다.
output 에는 2비트 짜리 out이 나오게 되는데 이때 out을 reg형으로 선언해준다. (always 구문 속에서 쓰이기 때문에)
always 구문을 보면
always @ (sel or in0 or in1) begin 으로 되어 있다.
이 말은 sel, in0, in1 중에 하나라도 변화가 생겼을 때, begin 다음 문장들을 "순차적"으로 실행한다
또한 여기서 "@"는 event operator 라고 불린다.
sel, in0, in1 중에서 하나라도 변화가 생기면 다음으로 if~else 구문에 진입하게 된다.
sel이 0인 경우 out 에는 in0 가 들어가게 되며 1인 경우에는 out에 in1이 들어가면 구문이 종료되게 된다.
행위수준모델링의 정확한 정의가 무엇인지 아는 사람이 있다면 댓글에 달아주길 바란다.
5-1 또다른 예제, 순차회로
예제 한가지를 더 보자. 이번에는 클럭이 들어가 있는 순차회로를 구성하였다.
input 에는 1비트 clk, din, rst를 구성하고
output에는 q를
그리고 이 q는 reg로 선언하여 always 구문 안에서 동작할 수 있도록 한다.
always@(posedge clk or posedge rst)
이 구문은 clk 혹은 rst가 0에서 1로 올라가는 rising edge 일때 begin 하여라 이다.
또한 이번에는 앞서와 달리 if ~else 구문에서 자세히 보면 q값에 값을 저장할 때 "=" 을 쓰지 않고 "<="을 쓰게 되었는데, 이는 blocking assignments 와 non-blocking assignments의 차이이다.
좀 더 자세히 설명해보면
6. Blocking assignment(=)
Blocking assignment는 하나의 대입이 끝나고 나서 다음을 대입하는 것이다. 순서에 따라 동작이 바뀔 수 있으므로, 순차회로에서 쓰지 않고 조합회로에서 쓰이게 된다.
위 표를 보자, wire은 내부 신호라는 의미로 나중에 좀 더 자세히 보도록 하고,
begin ~end 구문에서 순서를 바꾸었을 뿐인데 결과값이 바뀌게 되었다. 이는 순서를 고려하기 때문에 clk를 사용하지 않는 조합회로에서 사용하기 적합하다.
blocking 이란 단어를 생각해보면, 뭔가를 막는 것을 떠올릴 수 있다. 스포츠 경기에서도 블로킹이라는 말을 쓰게 되는데, 이를 떠올려서 연관지어보면, 동일한 시간에 일이 벌어지는 것을 blocking 한다고 생각하면 이해가 더 쉬울 것이다.
7. Non Blocking Assignment(<=)
Non blocking assignment는 앞서와 달리 동시에 처리되게 된다. 이는 clk를 이용하는 순차회로에서 회로가 동시에 값을 넘겨줘야할 때 필요하게 된다.
이번에는 순서가 바뀌었음에도 불구하고 결과값이 동일하게 나왔다. 이때에는 순서에 관계 없이 동시에 대입된다고 생각하면 된다.
추후, verilog 문법만을 다룬 글을 개재해볼 생각이다.
#5. Verilog HDL의 연산자 (0) | 2023.07.17 |
---|---|
#4. Verilog HDL 자료형 (0) | 2023.07.16 |
#3. Verilog HDL 개요 (3)- 테스트벤치 (0) | 2023.07.11 |
#1. Verilog HDL 개요-(1) (0) | 2023.07.03 |
#0. 강좌소개 (0) | 2023.07.03 |