티스토리 뷰

 

논리 회로 설계나 디지털 시스템 등의 입문 과목을 들으면서 Verilog라는 언어를 배우게 되면, 가장 헷갈리는 부분이 바로  wire와 reg의 사용에 관한 부분일 것이다.

 

나 또한 digital 회로 설계자로서 커리어를 쌓아오고 있지만, 명확하게 이 data type에 대해서 이해하고 사용하게 된 것은 그리 오래되지 않았다.

 

내가 학부생으로 공부할 당시만 해도, 이 두 개념에 대해 어떠한 차이가 있는지 알려주는 자료를 찾기 어려웠지만, 이제는 구글에 검색어만 넣어봐도 자세한 설명을 제공하고 있는 블로그들을 쉽게 발견할 수 있었다.

 

정말이지 혼자 공부하기가 수월해진 세상이다. 블로그와 Youtube의 비약적인 발전으로 인해 지식을 쌓고자 조금의 노력만 한다면 누구나 해당 학문을 익히고 배울 수 있게 되었다.

 

자, 서론은 여기까지로 하고 본격적으로 wire, reg의 정의에 대해 알아보자.

 

wire

: wire는 다른 element들을 연결해주는 데 사용된다. 즉, 물리적인 연결선으로 다뤄지며 특정 값을 저장할 수는 없다. 그러므로 연속적인 할당(continuous assignment)으로 코드를 구현할 때 사용된다. 

reg

: reg는 다음 값이 할당되기까지 현재 값을 유지한다. 그러므로 절차적 할당(procedural assignment)으로 코드를 기술할 때 사용된다. 만약 combination logic을 reg로 구현하면, 현재 값을 유지할 필요가 없으므로 wire처럼 합성된다.

 

연속적인 할당? 절차적 할당? 용어가 모호하여 헷갈릴 수도 있지만 생각해보면 그리 어려운 개념은 아니다.

assign 문법을 사용하여 combination logic을 선언하는 것이 연속적인 할당이고 always, initial 등의 문법을 사용하여 logic을 선언하는 것이 절차적 할당이다.

 

▼ 연속적 할당/절차적 할당 예제 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
// 1. continuous assignment
 
wire in_0, in_1, out;
 
assign out = in_0 & in_1;
 
 
 
// 2. procedural assignment
 
// ex1) F/F
 
reg Q;
 
wire D;
 
always @(posedge clk or negedge reset_i_n) begin
 
if (reset_i_n)
 
    Q <= 1'b0;
 
else
 
    Q <= D;
    
end
 
 
 
// ex2) mux
 
reg out;
 
wire sel, in_0, in_1;
 
always (*) begin
 
if (sel == 0)
 
    out = in_0;
 
else // sel == 1
 
    out = in_1;
 
end
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter
http://colorscripter.com/info#e" target="_blank" style="text-decoration:none;color:white">cs

 

즉, assign을 쓰는 data type은 항상 wire여야만 하고,

always, initial 등의 내부에서 사용되는 data type은 reg여야만 한다.

사실 이렇게만 알고 있어도, Verilog를 사용하여 logic을 구현하는 것에는 전혀 무리가 없다. 

그러나 앞서 설명한 개념을 잘 모르면 아래와 같은 오개념에 빠지기 쉽다.

 

reg는 register를 의미하는 것일까?

왠지 그럴싸하다. 그러나 이렇게 알고 있으면, always문으로 combination logic을 만들 수 있다는 것이 말이 되지 않는다. 값을 저장하고 있으려면 latch나 flip-flop 같은 sequential logic이어야 하는데, 이 경우에 reg의 역할은 wire와 동일하게 단순한 물리적 연결선이기 때문이다. 즉, data type인 reg를 사용하여 register처럼 값을 저장하는 logic을 구현할 수 있지만 두 개념이 동일한 것은 아니다. 

위의 예제 코드의 ex1)에서는 reg가 flip-flop을 만드는 데 사용되지만 ex2)에서는 단순히 mux를 만드는 데 사용된다. 

 

어떤 블로그에서는 reg를 그릇과도 같다고 설명하고 있었다.

값을 유지할 필요가 있으면 그릇에 담아두고 있지만, 절차적 할당(always문 등)을 사용하여 combination logic을 구현할 때는 값이 유지될 필요가 없으므로 그릇을 비운다는 것이다.

참, 그럴싸한 표현이라고 생각하였다.

누군가는 그릇을 음식을 담기 위해 사용하기도 하지만, 그릇으로 단순히 음식을 옮기고 비워준다고 해서 문제가 되는 것이 아니지 않는가.

 

모든 것은 다 쓰기 나름이다.

 

 

댓글
공지사항