Verilog 는 HDL 중 하나
회로도 방식 : AND/OR/NOT 등등(논리 회로를 설계 해야함
Verilog 방식 : 코드임
C언어와 달리 블록의 시작과 끝을 중괄호 기호로 사용하지 않음 대신에 Begin과 end로 구분함
머리 - 선언 - 몸체로 나뉘어짐
머리 : module로 시작해서 세미콜론으로 끝나며 중복이 불가능함
선언 : c언어를 짤때의 변수 선언 부
몸체 : 회로의 기능, 동작, 구조 등을 표현
하드웨어서는 몇 비트를 사용할지를 정해주어야 함
214; || 'd214 [ 정수 214 ]
'h32; [ 16진수 34 ]
'o324; [ 8진수 324 ]
'b111[ 2진수 111 ]
4'b111; [ 4bit의 2진수 1111 ]
4'hf; [ 4bit의 16진수 f(=4'b1111)]
-8'd6 : 8비트의 -6
conditional_expression = expression1 ? expression2 : expression3
Concatenation operators : {}
// A = 1'b1, B=2'b00, C=2'b10
Y={B,C} // Y=4'0010
X = {A,B,3'b110} // X = 6'b100110
Z = {A,B[0],C[1]} // Z=3'b101
참고로 배열처럼 사용할 수 있지만 그 순서는 원래 사용하던 배열과는 역순이다.
Replication Operators : {{ }}
// A = 1'b1, B=2'b01, C=2'b00
Y={4{A}} // Y=4'b1111
X={4{A},2{B}} // X=8'b11110101
Z={4{A},{2{B},C}} // Z=10'b1111010100
시간단위를 보여주는 함수
선언
timescale <시간단위>/<정밀도>
<시간단위> : 1ps, 1ns, 1ms ...
<정밀도> : 소수점의 허용범위
ex> timescale 10ns/1ns
1.55a = b // 1.55 * 10ns = 15.5ns
정밀도가 1ns이기 때문에 소숫점의 값은 반올림 되어서 16ns 가 된다.
timescale 1ns/1ps
1.0055a = b // 1.0055 * 1ns = 1.0055
정밀도가 1ps이기 때문에 소숫점 3번째 자리까지 사용하여야 한다.
따라서 1.0056ns
assign 구문은 net 변수에 특정 논리 값을 지정하는데 사용한다.
deassign 구문은 variable에 대한 assign 문의 영향을 제거시킬 때 사용한다.
ex)
assign wire1 = reg1; //선을 단순히 연결하는 것
alsways
always문은 시뮬레이션이 실행되는 동안 반복적으로 실행되며, 따라서 타이밍 제어와 연관된 표현에 유용하게 사용.
initial
initial 구문은 시뮬레이션이 실행되는 동안 한번만 실행 된다.
Blocking statement
** Line by Line으로 순차적으로 계산과 동시에 저장이 이루어짐
Non blocking statement
** 모든 게산을 수행한 후 한꺼번에 저장 작업이 수행
Non blocking 과 blocking은 동일한 코드를 가지고 있음에도 결과는 크게 다르다.