이 포스팅은 제 개인적인 공부를 저장 및 복습하기 위해서 올리는 글입니다. 개인적인 정리기 때문에 저의 잘못된 이해가 섞여있을수도 있는 점 알려드립니다. 너무 맹신하지는 말아 주시기 바랍니다.
상수 (Constant) 선언하기 [파라미터(parameter)]
모듈 내에서 상수(constant)를 정의하는 수단이다. 회로의 비트 크기 또는 지연 값 등과 같이 자주 사용하는 상수 (constant)를 정의하기 위해 pararmeter을 사용해서 정의한다. C언어의 #define ABC 10 과 비슷한 표현이다. 변수로는 사용할 수 없으며, 파라미터의 값들은 컴파일할 때 자동적으로 매칭시켜준다. 파라미터를 사용하면 값 편집이 용이해진다. 자료형과 범위지정을 가질 수 있는데 범위가 지정되지 않으면 상수값에 적합한 크기의 비트 폭을 갖는다.
* 예시
1 parameter sibal = 18; // siabl를 18의 값을 가진 상수로 정의
2 parameter index_num = 9; // index_num를 9의 값을 가진 상수로 정의
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}는 각 한 비트 신호인 a와 b를 병합 (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 |