3. Verilog 구문
1) Timescale
1> 문법
timescale {시간 단위}/{정밀도}
- 시간단위 : 이 값을 선언하면, 그 파일 내의 모든 시간 단위는 선언한 값으로 바뀐다.
- 정밀도 : 주어진 시간 단위로 구성 할 수 있는 가장 작은 지연 (시간 단위에 대한 사용할 수 있는 소수점의 허용 범위)
(정밀도 : 올림하는 자릿수)
2> 예시
(1ps = 0.001ns)
`timescale 1ns/1ps
#1.00055a=b
=> 모든 시간 단위는 1ns이기 때문에 1.0055*1ns = 1.0055로 표현하는데
=> 정밀도가 1ps(0.001ns)이므로 올림하여 1.006ns로 표현한다.
`timescale 10ns/1ns
#1.55a = b
=> 모든 시간 단위는 10ns이기 때문에 1.55*10ns = 15.5ns로 표현하는데
=> 정밀도가 1ns이므로 올림하여 16ns로 표현한다.
2) assign (Verilog 연속 할당문)
1> 정의
피연산자의 값에 변화가 생길 때마다
우변의 식이 평가되고 그 결과 값이 할당문 주변의 net을 구동(drive)한다. (하드웨어적 특성)
2> 예시 1
아래 두 식은 같은 의미를 가진다.
wire mynet=enable&data;
wire mynet;
assign mynet = enable & data;
3> 예시 2
assign wire1 = reg1;
=> 선을 단순히 연결하는 것.
assign wire2 = (pin1)?reg2[0] : reg2[1];
=> 2 to 1 mux 의 역할, 괄호안에 있는것이 참이면 “:” 앞쪽에 있는 것이 거짓이면 “:” 오른쪽에 있는 것 으로 연결.
assign wire2 = {reg1,reg2[0]};
=> 서로 다른 두개의 신호를 하나의 버스로 집어 넣어줌.
3) always
1> 정의
simulation이 실행되는 동안 반복적으로 실행된다.
그래서 타이밍 제어와 연관된 표현에 유용하게 사용
(반복문과 조건문의 혼합처럼 느껴진다.)
2> 문법
always @(sensitivity_list) begin
Blocking or nonBlocking statement
end
@(sensitivity_list) : always 문의 실행을 제어하는 역할
=> sensitivity_list에 나열된 신호들 중 하나 이상에 변화(event)가 발생하면 always 내부의 begin-end 블록 실행
4) initial
1> 정의
simulation이 실행되는 동안 한 번만 실행된다.
2> 문법
initial begin
Blocking or nonBlocking statement
end
=> initial 구문의 begin-end 블록은 절차형 문장들로 구성된다. (절차형 문장들은 나열된 순서대로 실행된다.)
4. 절차형 할당문
1) 설명
1> 정의 : 문장이 나열된 순서대로 실행되어 할당문 좌변의 변수 값을 갱신하는 소프트웨어적 특성을 가진다.
- 우변 수식의 event 발생과 무관하게 해당 문장의 실행에 의해 좌변 variable에 값이 할당된다. (소프트웨어적 특성)
2> 활용 : always, initial, task, function과 같은 procedure 내부에서 사용
2) Blocking Statement (직렬)
1> '=' : blocking symbol
2> begin ~ end까지 순차적으로(line by line으로) 계산과 동시에 저장 (할당까지 다 진행하고 다음 문장 수행)
3> 한 문장의 수행이 끝나기 전에 blocking이 된다. (할당까지 다 수행 후 다음 문장 수행)
4> #t 변수 = 연산;=> t시간 후, 연상하고 변수에 할당한다.
3) Blocking Statement 예시
1> 예시 1
변수 C = A & B;
변수 D = A | B;
A와 B 값을 읽고 & 연산하고 C에 할당 → 그 이후에 다음 문장 수행
→ A와 B 값을 읽고 | 연산하고 D에 할당 (여기까지의 수행과정에서 delay는 없다.)
4) Non Blocking Statement (병렬)
1> '<=' : non Blocking symbol
2> begin ~ end까지의 모든 계산을 수행하고 한꺼번에 저장
3> 여러 non-block 구문이 동시에 평가한 후에 할당
4> 변수 <= #t 연산;
=> 연산하고 t 후에, 변수 할당을 예약
5> 공통적인 사건 발생 후, 여러 개의 data를 동시에 전송하기 위해 사용된다.
5) Non Blocking Statement 예시
1> 예시 1
변수 C <= A & B;
변수 D <= A | B;
A와 B 값을 읽고 & 연산하는 동시에 A와 B의 값을 읽고 | 연산한다.→ 그리고 동시에 C와 D에 할당한다.
6) Blocking simulation
Blocking 방식에서는
1> 초기에 b=1, a=0으로 설정된다.
2> (이후에 always 문을 실행하면) 첫 줄을 먼저 다 실행해야 하므로 a에 1이 할당되고 b는 그대로이다.
3> (순차적으로 실행하는 Blocking 특성상) 다음 문장을 실행하면 1인 a의 값이 b에 1이 재할당된다. 그러므로 simulation 결과 초반을 제외하고 a와 b는 계속 1이 할당된다.
(clk는 always문에 따라 1과 0의 값을 번갈아가며 할당합니다.)
7) NonBlocking simulation
1> 초기에 b=1, a=0으로 설정된다.
2> (이후에 always 문을 실행하면) a와 b의 값이 동시에 할당되기 때문에 swap되는 현상이 있습니다. 그로 인해 simulation 결과도 값이 동시에 변경되는 것을 볼 수 있습니다.
'디지털 회로 실습' 카테고리의 다른 글
2-4강 - vivado 실행 (0) | 2020.09.09 |
---|---|
2-3강 - verilog 기초 3 (기초 구문, Net 형 자료형) (0) | 2020.09.08 |
2-1강 - Verilog 기초 1 (module, 기초 문법) (0) | 2020.09.07 |
1강 - FPGA (Verilog, VHDL) (0) | 2020.09.03 |