본문 바로가기

Verilog Syntax

[Verilog Syntax] 02

주제: Declarations


1. Net(wire)


연결을 의미하며, 하나의 타입이다(그러므로 wirenet이다). 이 자료형 자체는 일반적인 데이터 값을 저장할 수 없다.

이 부분은 Vivado로 프로그래밍 하다보면 알 수 있는 데, 정말 그대로 어딘가로 연결되는 wire(선)이라고 생각하면 편하다.


종류: wire, supply0, supply1, tri, triand, trior, tri0, tri1, uwire, wand, wor


Verilog에서는 일반적으로 wire을 많이 쓰며, 이 wire은 단일비트를 가진다.


Declaration:

wire Name1, Name2, Name3;


// 단일 비트 net을 정의한다. 

이 wire는 나중에 나올 module(모듈)의 I/O(Input/Output)에 연결할 수 있으며, 뒤에 나오는 continuous assignment로 값을 넣을 수 있다.


멀티 비트를 가지는 wire net를 정의하려면 벡터 형식을 취하면 된다.


ex)

wire [3:0] A_s;


// A_s가 identifier인 wire을 정의했다. 최상위 비트는 3, 최하위 비트는 0이며, 총 비트는 4비트를 가진다. 


각 비트를 접근할 때 배열과 같이 [N]으로 접근할 수 있으며 [원하는 범위의 최상위 비트: 원하는 범위의 최하위 비트]로 범위를 지정할 수 있다.


예를 들어 이미 정의된 벡터형 wire A_s의 0번째~1번째 값을 참조하고 싶다면 A_s[1:0]을 사용하면 된다.


추가적으로 Verilog에서는 벡터 비트를 가진 배열을 만들 수 있는 데, 해당 자료를 참조하는 것은 뒤에서 다루기로 하자.


2. Module


모듈 인터페이스를 정의한다. 라고 하나 무슨 소리인지 감이 안온다. 예를 들어보자.


나는 AND2라는 모듈을 만들 것이다.

입력 X, Y가, 출력으로 F가 필요할 것이다.

내부에서 X와 Y를 & 시켜준다음 F에 값을 넘겨준다.


이 모듈을 만들어 내가 만들고 싶은 프로그램(회로)에 도장처럼 찍는다(인스턴스화).


느낌 상은 OOP 언어들의 Class 같은 데, 객체라고 보기에는 너무 이상하니까, OOP스러운 Function이라고 보면 되겠다.

(나중에 (system) task와 function 개념이 나오므로 완전하게 function이다!라고 믿지는 말자. 내 이름은 모듈!)


ex)

module AND2(X, Y, F);

input X, Y;

output F;


assign F = X & Y;

endmodule


module tb;

reg X, Y;

wire F;


AND2 a1(X, Y, F);

endmodule


주의할 점은 module의 identifier 옆 argument 같은 거는 parameter 같아 보이지만 parameter가 아니다.

옆에 argument같은 건 port(포트)이다. I/O Port. input, output만 기재할 경우, default로 wire로 정의된다.

인스턴스화할때 wire나 reg(뒤에 나오는 variable이다)을 넣어서 테스트해볼 수 있다.


코드에서 볼 때 tb라는 module도 만들었는 데, testbench의 약자로, 안에서 AND2를 인스턴스화하여 테스트하기 위해 만든 모듈이다.

(참고로 모듈 인스턴스화는 다음 부분에 나오니 이 부분을 완전히 알지 못해도 된다.)

(아직 덜 완성된 모듈로, 아래에 X, Y 값을 바꿔가는 코드를 써놓으면 응큼한 1010..0101 시뮬레이션을 돌릴 수 있다).

어쨋든 테스트할 때에도 module을 쓴다는 사실을 알아두자.


넘어가기 전에 알쏭달쏭한 공식 하나 쓰겠다.


모듈에서


continuous 쓸때에는 output은 wire이고

나머지 assignment는 output reg을 쓴다네


인스턴스화 할때에는


input에게는 reg를 주나 wire을 주나 상관없는 데

output은 wire을 고집하네


개소리(맞다 개소리!)냐 라고 할 수 있으나, 기억만 해두자. 나중에 프로그래밍 할때 Schematic을 그리며 깊은 빡침을 느낄 수 있다.


3. 파라미터(parameter)


우리가 아는 파라미터 같지 않다. 안에서 정의하고 모듈이름과 모듈 인스턴스 identifier 가운데에 정의된 순서(ordered)대로 #(value1, value2 ...)와 같이 작성하여 넘겨줄 수 있다.


Declaration (inside the module declaration)

parameter Name1=Value1, Name2=Value2;

parameter Name=Value;


인스턴스화와 defparam으로 수정될 수 있다.


4. 로컬 파라미터(localparam)


3. 파라미터의 Declaration에서 parameter 대신 localparam을 쓰며, 이는 인스턴스화나 defparam으로 수정될 수 없다. const로 보면 될까.


5. 변수(Variable, reg)


변수 역시 reg, variable, real, time, realtime와 같은 자료형이 있으나 대표적으로 reg을 사용한다.

+ 역시 멀티비트 벡터를 취할 수 있다.


Declaration

reg Name1, Name2, Name3;

reg Name=Value; 


'Verilog Syntax' 카테고리의 다른 글

[Verilog Syntax] 01  (0) 2017.03.28