물론, 상용 EDA 툴인 Intel(Quartus)나 Xilinx(Vivado)를 사용하면 GUI 기반으로 편하게 사용하면 되지만, 우리는 오픈소스를 지향하고 또 RTL 학습하는데 필요한 기능이 중심 되기 때문에 수 십 GB 용량의 설치를 안하고도 충분하다고 생각을 했습니다. 물론 보드가 있으면 위의 2가지 툴로 해봐도 무방합니다.
또 설치하지 않고 웹 기반의 EDA 베릴로그 소스를 인터프리팅하고 회로의 타이밍 시뮬레이션 및 테스트벤치를 실행할 수 있습니다.
우선 예시의 빌드 환경 기준으로 설치가 잘 되었는지 확인해볼까요?
간단한 예제를 한번 작성하고 돌려볼께요. 자세한 설명은 예제를 작성하고 조금 이따가 같이 이야기 하자구요!
a, b 두개의 입력을 받습니다. 2개의 입력의 크기는width 만큼의 bit 이구요. 1 bit c_in 입력을 받습니다.
실질적으로 이 모듈이 하는 일은 두 a, b 와 c_in 을 합친 다음 1bit 의 output 은 c_out, 입력받은 a, b 와 같은 사이즈의 출력은 sum 으로 됩니다.
이게 무엇일까요? 우리가 2진수의 덧셈을 하는 방식이 회로로 구현되어 있는 것이죠!
iverilog 로 인터프리팅 시켜 제대로 되는지 확인해보겠습니다. Error 나 Warning 이 나지않고 결과가 잘나왔나요?
그럼 이제 모듈의 동작 검증을 위해서 테스트 벤치를 작성해보겠습니다!
동작 검증 소스를 테스트벤치 파일이라고 합니다.
이제 결과를 확인해볼까요?
타이밍 시뮬레이션으로 클록에 따라 파형이 어떻게 나오는지 GUI 프로그램으로 확인해볼께요!
// TODO: GTK Wave 추가
우리가 작성한대로 전가상기 회로도 RTL 다이어그램을 확인할 수 있어요!
이제 우리가 여태까지 한 내용으로 Makefile 로 편하게 빌드를 관리해보자구요!
참고로실습할 책은 제가 관심이 있는 RISC-V 아키텍쳐 내용도 나와있지만 전반적으로 설계 실습 위주로 잘 나와있는 책으로 골랐습니다. Digital Design and Computer Architecture: RISC-V Edition
바로 시작해볼께요. 우선 논리 회로 디자인에서 2가지 경우가 있습니다.
1. 조합 논리회로(Combinational Logic Circuit)
조합 논리회로는 입력의 변화가 바로 출력에 반영됩니다.
즉, 특정 시점의 출력이 그 시점의 입력에 의해서만 결정되는 회로입니다.
2. 순차 논리회로(Sequential Logic Circuit)
순차 논리회로는 상태값을 저장해두고 그 상태값이 다시 입력으로 들어가서 다음 상태값과 출력을 결정하는 회로입니다.
순차 논리회로는 입력을 주더라도 현재 기억하고 있던 어떤 상태값(메모리에 저장된 값)이 함께 출력에 영향을 미칩니다.
자판기에 동전을 얼마를 넣었는지, 또는 스탑워치에 기록한 시간이 LED에 나오는 모습이 떠오르시나요? 맞습니다!
실제로 우리가 현실에서 쓸 수 있는 의미있는 어떤 동작을 하는 회로를 만든다면, 조합 + 순차 논리회로로 구현한 모듈이 모두 들어갈꺼에요.
그러면 2가지 예제를 살펴보도록할께요. 앗! 그러고보니 첫번째 조합 논리회로는 벌써 우리가 전가산기로(Full Adder) 예제로 확인했군요!
그러면 순차 논리회로의 대표적인 예시인 계수기(Counter)를 살펴보도록하죠!
alway @ 블록에서 이전의 out 상태값을 기억하고 있습니다. 그리고 width 로 정한 N bit 에 해당하는 최대값에 도달한 다음, 오버플로우가 나면 처음 0 부터 다시 동작하는 것을 확인할 수 있습니다.
여기까지 기본적인 2가지 종류의 모듈을 설계해보았습니다. 2종류의 모듈도 기회가 된다면 다양한 변형이 있으니 다음번에 살펴보도록 하고 다음번에는 CPU를 구성하는 ALU에 대해서 살펴볼께요!
참고:
깃허브 Make Your verilog Testbench and RTL diagram! 프로젝트
icarus iverilog - verilog 표준 지원 관련
Icarus Verilog currently defaults to the IEEE1364-2005 generation of the language.
Comments