DUT / Teset Bench
DUT
- 실제로 구현되어 사용할 로직 / 회로
- 합성 가능한 구문으로 작성(assign or slways사용)
Test Bench
- DUT를 테스트하기 위한 모듈
- 합성이 가능하지 않은 구문도 가능하다.
Verilog 모듈
모듈 (module)
- 기본적인 블록 단위
- C언어의 함수와 비슷
- 시작은 module
- 끝은 endmodule
모듈들이 모여 하드웨어를 구성합니다.
Verilog 모듈 구조
- port 선언 부분에 입출력변수를 구분합니다.
- 파란색 점선 박스에서 module에서 사용할 변수를 선언합니다.
- 빨간색 점선 박스에서 module의 기능을 서술합니다.
모듈의 개념 예
- 4비트 가산기 모듈 : 4개의 전가산기 모듈을 사용합니다.
- 4개의 전가산기 모듈을 인스턴스화(instantiate)하여 작성합니다.
- 전가산기 모듈 4개를 구분해야 하므로 인스턴스 이름을 사용합니다.
조합 논리 회로
- 값을 저장하지 못합니다.
- 클럭을 사용하지 않습니다.
- 입력의 변화가 출력에 바로 반영됨니다.
- 가산기, 멀티플렉서, 디코더, 인코더 등이 조합논리회로에 포합니다.
조합논리회로의 작성 방법
assign 구문 사용
- 대부분의 경우 assign을 사용합니다.
- "조건 ? 참일경우 : 거짓일경우" 의 문장을 자주 사용합니다.
always구문 사용
- 논리가 복잡한 경우에 주로 사용합니다.
- if, else if, else구문 또는 case구문을 주로 사용합니다.
- @(sensitivity_list)는 감지신호목록을 나타내며, sensitivity_list에 나열된 신호들 중 하나라도 값이 바뀌면 내부 문장이 실행됩니다. sensitivity_list에는 출력에 영향을 주는 모든 신호가 나열되어 있어야 합니다.
- @ : ~ 할때라는 의미입니다. 즉, sensitivity_list안에있는 신호가 변할때 ~ ~~ 해라.
조합논리회로(인버터)
assign 구문을 사용한 작성.
- assign 구문을 사용할 경우 wire 변수를 사용해야 합니다.
always구문을 사용한 작성
- always구문을 사용할 경우 reg 변수를 사용해야 합니다.
- begin ~ end는 always구문 안이 여러줄일 때 사용합니다. (한줄 이나 case문은 한줄로 반영되어 생략가능)
if 조건문
- if, else는 한 번만 사용 가능합니다.
- else if는 여러 번 사용 가능합니다.
case 문
- 조건과 일치하는 경우에 대하여 문장이 실행됩니다.(각 비트가 0,1,x,z를 포함하여 정확히 같은 경우에만 일치로 판단,.)
- 모든 경우들에 대하여 일치되는 항이 없는 경우에는 default문장이 실행됩니다.
- default항이 없으면 변수는 이전에 할당받은 값을 유지합니다.
- 하나의 case문에서 여러 개의 default를 사용하는 것은 허용되지 않습니다.
인버터 모듈
- 2개의 입출력 포트(port)
- 입력신호는 in, 출력 신호는 out
OR / NOR gate
반가산기
- 2개의 입력을 받아 덧셈을 수행하고 sum, carry를 발생시킨다.
전가산기
- 3개의 입력을 받아 sum, carry를 발생시킨다.
- 반가산기 2개와 OR gate를 사용합니다.
Multiplexer(mux)
- 여러 개의 입력 중 하나만을 선택하여 출력합니다.
mux의 정상적인 작성과 비정상적인 작성 결과의 차이
- sensitivity_list에 회로의 입력 신호가 모두 나열되어야 하지만 비정상적인 겨우를 보면 sel신호가 없다.
이를 위해 Verilog 표준이 바뀌었는데 다음과 같이 변경되었다.
- or 대신에, "," 사용이 가능해졌다.
- 모든 event를 명시하지 못하는 실수가 많아 " @* " 또는 " @(*) " 사용이 가능해졌습니다.
multi-bit mux의 작성 예
Tri-state buffer / inverter
가산기 (adder)
- 가산기 작성시 ' + ' 연산자를 사용해도 됩니다.
- 합성시에 자동으로 속도에 만즌 가산기가 발생됩니다.
- 4비트 + 4비트 = carry와 4비트의 sum이 도출 될 것입니다. 즉 5비트의 결과에 대해 다음과 같이 사용할 수 있습니다.
가감산기(adder and subtractor)
- add_nsub == 1일때 가산
- add_nsub == 0일때 감산합니다.
디코더 (decoder)
- 코드화된 신호를 받아 하나의 출력만을 1 또는 0으로 구동합니다.
- 회로도를 바탕으로 코드를 작성합니다.
- 회로도를 바탕으로 코드를 작성합니다.
- 진리표를 바탕으로 코드를 작성합니다.
" 카르노맵으로 간소화된 식을 사용하여 작성이 가능하나, 회로 합성시에 tool이 자동으로 최적화하기 때문에 굳이 간소화할 필요가 없습니다. "
인토더(encoder)
- 디코더와 반대의 동작으로 개별 신호를 묶어 코드화 합니다.
우선순위 인코더(priority encoder)
- D3의 값이 제일 우선하여 이 값이 1이면 출력은 11
- D3가 0일 경우 D2의 값이 우선하여 이 값이 1이면 출력은 10
- D3와 D2가 0일 경우 D1이 1이면 출력은 01
- D3, D2, D1이 0일 경우 D0이 1이면 출력은 00
- D3, D2, D1, D0 가 모두 0일 경우 유효한 코드가 없으므로 V=0
출력을 기초로하여 Verilog를 작성합니다.
진리표를 기초로 작성합니다.
ROM
- ROM은 메모리로 분류되지만, 동작관점에서는 조합논리회로입니다.
원하지 않는 래치(latch) 합성 방지
위의 코드에서 sel이 2’b11 또는 2’b00 일 경우는 ?
- Verilog는 이전의 값을 계속 유지하는 것으로 해석
- 앞선 값을 유지시키기 위해 조합논리회로가 아닌 래치(latch)로 합성
- 원하지 않는 래치 합성시, 회로의 크기와 지연시간이 커짐
- 래치의 합성 방지는 조합회로에만 해당한다.
1. default 항을 삽입
2. 초기값을 설정
조합논리회로의 경우에는 else 문장이 없으면 래치가 합성됩니다.
- 아래와 같이 합성시에 directive를 주는 방법도 있습니다.
- 그러나 시뮬레이션과 합성결과가 다른 등 부작용이 있어 사용시 주의가 요구됩니다.
- 모든 경우르 나열, 초기화, default, else를 사용하는 방법이 가장 좋습니다.
조합논리회로의 자료형 총 정리
'UVM & RTL > Verilog HDL' 카테고리의 다른 글
[7] Verilog HDL D Filp-Flop 실습 (0) | 2022.01.20 |
---|---|
[6] Verilog HDL clock 실습 (0) | 2022.01.20 |
[5] Verilog HDL 모듈, 테스트 벤치 (0) | 2022.01.15 |
[4] Verilog HDL 순차 회로 기술 (0) | 2022.01.15 |
[1] Verilog HDL 논리값 & 자료형 (0) | 2022.01.14 |
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!