UVM & RTL/Verilog HDL

[3] Verilog HDL 조합 회로 기술

Return 2022. 1. 15. 16:01

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를 사용하는 방법이 가장 좋습니다. 

조합논리회로의 자료형 총 정리