본문 바로가기

Study/Verilog

Veriliog : 상수 선언, 모듈, 포트

336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

이 포스팅은 제 개인적인 공부를 저장 및 복습하기 위해서 올리는 글입니다. 개인적인 정리기 때문에 저의 잘못된 이해가 섞여있을수도 있는 점 알려드립니다. 너무 맹신하지는 말아 주시기 바랍니다. 



상수 (Constant) 선언하기 [파라미터(parameter)]

모듈 내에서 상수(constant)를 정의하는 수단이다. 회로의 비트 크기 또는 지연 값 등과 같이 자주 사용하는 상수 (constant)를 정의하기 위해 pararmeter을 사용해서 정의한다. C언어의 #define ABC 10 과 비슷한 표현이다. 변수로는 사용할 수 없으며, 파라미터의 값들은 컴파일할 때 자동적으로 매칭시켜준다. 파라미터를 사용하면 값 편집이 용이해진다. 자료형과 범위지정을 가질 수 있는데 범위가 지정되지 않으면 상수값에 적합한 크기의 비트 폭을 갖는다 

* 예시

1 parameter sibal = 18; // siabl18의 값을 가진 상수로 정의

2 parameter index_num = 9; // index_num9의 값을 가진 상수로 정의

3 reg [index_number:0] ar_tt ; // reg [10:0] ar_tt 와 같은 표현

 

parameter msb = 8; // 정수 파라미터로 선언

parameter byte_size = 7;

parameter r = 5.6; // 실수로 파라미터 선언

parameter signed [4:0] mux_selector = 0;

parameter [0:31] dec_const = 1’b1 //1비트에 2진수인 1의 값을 32비트로 변환해서 저장한다

parameter real r1 = 3.4e27;

parameter const = 2’h4; // 2비트에 16진수인 4의 값이지만 2비트론 h4가 저장되지 않기 때문에 범위가 [2:0]3비트로 조정된다.

 

defparm이나 모듈 가져오기 (instantiation)의 파라미터 뒤엎기 (override)에 의해서 상수 값을 변경 시킬 수 있다. 다음은 상수의 뒤엎기를 보여주는 코드이다.

 

module mod_xnor(y, a, b);

parameter size = 8, delay = 15;

output [size-1:0] y;

input [size-1:0] a, b;

 

wire [size-1:0] #delay y = a ~^ b; (~^xnor)

 

endmodule

 

module param;

wire [7:0] y1;

wire [3:0] y2;

reg [7:0] a1, b1;

reg [7:0] a2, b2;

 

mod_xnor G1 (y2, a1, b1); // Use default parameters

mod_xnor #(4, 3) G2 (y2, a2, b2); // overrides default parameters

endmodule

 

모듈(Module)

 

베릴로그의 모듈은 C의 함수(function) 단위와 비슷하며, 베릴로그 설계를 위한 기본적인 블록 단위, 기본 요소 (building block)이다. 또한 하나의 모듈은 하나의 파일로 구성된다.

module <모듈 이름> (포트 목록); 으로 시작하며, endmodule로 끝난다.

모듈 (module)은 다른 모듈에서 이 모듈을 가져와서 (instantiate) 구조적 설계 (hierarchical design)를 할 수 있다. 모듈 가져오기는 더 높은 수준의 다른 모듈에서 이를 사용한다는 뜻이다. (위에 예시의 override 부분이 모듈 가져오기인가보다)

모듈은 module로 시작해서 endmodule로 끝나야 한다.

 


 

module example(inp1, inp2, inp3, inp4, result);

input inp1, inp2, inp3, inp4;

output result;

wire t1, t2;

and (t1, inp1, inp2); //assign t1 = inp1 & inp2;

and (t2, inp3, inp4); //assign t2 = inp3 & inp4;

nor (result, t1, t2); // assign result = t1 ~| t2; 로도 됨

endmodule

포트 (port)

포트(port)는 모듈과 모듈을 연결할 수 있는 인터페이스이고 모듈과 외부 환경과의 통신을 위한 인터페이스를 제공한다. 계층적 설계에서 최상위 (top) 모듈은 반드시 포트를 가진다. 포티는 위치나 이름에 의해서 관련되어진다. <키워드> [범위] <포트 이름> 의 형태로 선언하며, 그 종류에는 input, output, inout 이 있다.

input은 입력포트이며, output은 출력 포트, inout은 양방향 포트이다. 모든 포트는 wire로 선언된다. , output 포트의 경우 포트의 값 변경이 필요하다면 같은 이름으로 reg를 선언해야한다.


사용예는 다음과 같다.

 

input [<range_1>: <range_2>] <list_of_identifiers>;

output [<range_1>: <range_2>] <list_of_identifiers>;

inout [<range_1>: <range_2>] <list_of_identifiers>; // 어떤 모듈의 포트를 의미

 

이들을 사용하는 반가산기 (half adder)의 실제 설계 예를 다음에 보였다.

 


 module half_adder(a, b, c, s)

// a

// +b

//-----

// c s


input a, b;

output c, s;

wire a, b, c, s;

 

assign {c, s} = a + b;

 

//{c, s}, concatenation이라는 것이 있는데 이는 두 신호를 이어 붙이는 것입니다.

예를들어 신호 a="1111"과 신호 b="0011"이라는것이 있다고 가정할때 이 두 신호를 concatenate하게 되면 "11110011"이 됩니다.

 

endmodule

 

위와 같이 모듈은 module-endmodule로 둘러 싸여 있다. 모듈명은 half_adder이다. Verilog-1995 표준에서는 위와 같이 module half_adder(a,b,c,s)로 먼저 포트 신호들을 열거하고 입출력 방향 및 자료형을 선언해야 했으나 Verilog-2001 표준에서는 module half_adder(input wire a, b, ouput wire c, s)로 한 번에 선언해도 된다. 여기서 assign은 연속적 할당 (continuous assignment)라고 하는데 net 자료형(wire, tri )에 값을 부여할 때 사용된다. register 자료형에 부여할 때에는 assign이 필요하지 않다. 위에서 {c, s}는 각 한 비트 신호인 ab를 병합 (concatenation)하여 두 비트 신호로 만들라는 병합 (concatenation) 연산자를 의미한다.

 

포트를 연결할 때는 다음과 같은 규칙을 따른다.

 

- 내부 입력 포트는 반드시 net , 외부 입력 포트는 reg 또는 net 변수와 연결될 수 있다.

- 내부 출력 포트는 reg 또는 net , 외부 출력 포트는 반드시 net 변수와 연결되야 한다.

- 내부 양방향성(입출력) 포트는 반드시 net , 외부 양방향성 포트는 반드시 net 변수와 연결되야 한다.

- 같은 비트 수끼리 연결해야 한다.

 

포트를 연결할 때는 c언어에서 함수에 인자 값 전달하듯이 인자 순서대로 연결할 수 있으며, 또는 순서에 상관없이 이름에 각각 할당할 수 있다.

 

* 예시

module adder(x, y, c_out, c_in, sum);

// ...

endmodule

// 위치에 의한 포트 연결

adder adder1(inp1, inp2, carry_out, carry_in, sum_out);

// 이름에 의한 포트 연결

adder adder2(.sum(sum_out), .c_out(carry_out), .c_in(carry_in), .x(inp1), .y(inp2));

 

inout은 입출력다되는건데 필자도  설명을 잘못하겠다.

'Study > Verilog' 카테고리의 다른 글

Verilog : UDP (user-defined primitve)  (0) 2017.05.05
Verilog : 게이트  (0) 2017.04.28
Verilog : 연산자  (3) 2017.04.28
Verilog : 모듈가져오기  (0) 2017.04.28
Verilog의 기본 : 숫자표현, 자료형, 벡터, 배열, 문자열  (0) 2017.04.28