VPI라는건 Verilog Procedural Interface의 약자고 PLI 2.0으로 불리기도 하는거다. $finish 처럼 $로 시작하는 시스템 테스크를 만들 수 있게 해주는 물건인데....이걸가지고 여러가지 재미난것을 많이 할 수 있다. 노력이 필요하긴 하지만....
PLI 1.0...그러니까 옛날에는 이게 시뮬레이터마다 중구난방으로 구현되어 있어 사용하는데 에로사항이 꽃이 피었다고 하는데 VPI로 오면서 통일되었다고 한다. 그러니까 코드 하나만 짜 놓으면 여러 시뮬레이터에서 쓸 수 있다 그말임.
VPI는 C/C++로 작성하고 shared object, 즉 DLL로 링크 된다. 만들어진 DLL을 시뮬레이터가 실행될 때 옵션으로 넣어주면 C로 짠 테스크들을 시뮬레이션에서 사용할 수 있다. 플러그인의 일종이라고 생각하면 편할듯....아무튼 이걸로 소켓으로 데이터를 보내서 다른 프로그램과 연동 시킨킨다던지 등등등 여러가지 재미난것을 할 수 있다.
만들려면 일정한 형식을 갖춰서 코드를 짜야 하는 것 같은데....내가 VPI에 대해 잘 모르기 때문에 이 부분은 뭐라 말할 수는 업ㅂ다능. The Verilog PLI Handbook 이라는 책에 설명이 잘 되있다고 하니 궁금한 사람은 이걸 구해다 읽어보라능.
Verilog 시뮬레이터를 설치하면 시뮬레이터가 설치된 디렉토리 밑에 include 디렉토리에 VPI 라이브러리 헤더가 설치되고 lib 디렉토리 VPI 라이브러리가 설치된다. 컴파일할 때 include 패스를 잡아주고 링크할때 라이브러리를 링크해서 DLL을 맹글면 된다.
첨부된 파일의 압축을 풀고 modelsim을 사용하는 사람은 vpi/modelsim 디렉토리에서 자기가 사용하는 환경에 맡는 Makefile를 불러다 make를 때리면 dll이 만들어 진다. mingw하고 visual studio용으로 Makefile이 만들어져 있다. icarus를 쓰는 사람은 vpi/icarus 디렉토리에서 mingw용 Makefile를 사용하면 된다....아 make를 하기전에 Makefile을 열어서 시뮬레이터의 패스를 자기 환경에 맞게 고쳐주는걸 잊지말자.
DLL이 잘 만들어 졌으면 sim 디렉토리 밑에 modelsim이나 icarus로 가서 make를 때리면 시뮬레이션 되고 아래같은 화면을 볼 수 있다 >_<.
별건 업ㅂ지만 testbench랑 VPI 소스코드는 아래처럼 생겼다. 빌드하는 방법과 시뮬레이션 하는 방법은 같이 들어있는 Makefile를 참고 하자.
합성 가능한 코드를 짜기위한 가이드라인이라구 한다능. 나도 어디선거 주워왔는데 쉽게 찾아볼 수 있게 블로그에 백ㅋ업ㅋ
Coding Guidelines
These coding guidelines assume that you are able to write correct synthesizeable code. You can always check the synthesizeablilty of your code by parsing it using the synthesis tool.
1. Use non-blocking assignments (<=) in clocked procedures. Don’t use blocking assignments (=).
always @ (a or b) // this event list is missing signal sl
if (sl)
d = a;
else
d = b;
4. Take care of indentation. Develop your own identation guidelines and stick to them. Make sure others can read them. It helps readability and debugging greatly if it is done properly.
5. Comment code properly. The theory about good commenting is that you should be able to remove all functional code and the comments remaining should almost document the block you are designing.
// example of bad comments
// add a and b together
always @ (a or b)
c = a + b;
// Good commenting
// 8 bit unsigned adder for data signals ‘a’ and ‘b’
// output is sent to UART2
always @ (a or b)
c = a + b;
//`include "mux_using_procedure.v"
`include "mux_using_case.v"
module testbench();
reg a; // input 0
reg b; // input 1
reg s; // input select
wire c; // output
initial begin
$dumpfile("sim.vcd");
$dumpvars(0, testbench);
$monitor("TIME=%d A=%b B=%b SEL=%b C=%b", $time, a, b, s, c);
// test scenario
a <= 1'b0; b <= 1'b0; s <= 1'b0;
#2 a <= 1'b0; b <= 1'b0; s <= 1'b1;
#2 a <= 1'b0; b <= 1'b1; s <= 1'b0;
#2 a <= 1'b0; b <= 1'b1; s <= 1'b1;
#2 a <= 1'b1; b <= 1'b0; s <= 1'b0;
#2 a <= 1'b1; b <= 1'b0; s <= 1'b1;
#2 a <= 1'b1; b <= 1'b1; s <= 1'b0;
#2 a <= 1'b1; b <= 1'b1; s <= 1'b1;
#2 $finish();
end
// connect DUT to testbench
mux dut_mux(
.iA(a),
.iB(b),
.iSel(s),
.oC(c)
);
endmodule
요즘 틈틈히 베릴로그를 공부하고 있는데.....공부하는 동안에는 짤막짤막한 코드를 많이 짠다능. 이걸 일일히 쿼터스로 프로젝트 만들고 코딩하고 시뮬레이션 하기도 귀찬고 베릴로그는 icarus 라는 매우 좋은 오픈소스 시뮬레이터가 있기 떄문에 그걸 많이 쓰고 있삼.
이 문서는 윈도우 환경에서 icarus verilog simulator를 사용할 수 있도록 환경을 꾸미는 방법을 설명하고 있삼. C 처음 배우는 사람이 빌드환경을 어떻게 꾸며야 되는지 궁금해하듯 hdl을 처음 배우는 사람은 어떻게 hdl 코드를 돌려볼 수 있는 환경을 꾸며야 되는지가 궁금할꺼삼. 내 생각에는 그러타는 얘기임.
:prompt_setup
@rem 자신만의 프롬프트 설정을 이곳에 적자. 아래는 내 설정임. 긔찬으면 안해도 상관없다.
@rem PROMPT $P$_$+$S$G$S
@exit /B 0
:end
명령 프롬프트의 바로가긔를 하나 만든다음에 그 바로가긔 속성을 아래처럼 고쳐주자능.
적당한 위치에 폴더를 만들고 그 경로를 시작위치에 써주자. 저기가 베릴로그 프로젝트들의 루트 폴더가 될꺼라능. 바로가긔를 더블클릭했을 때 아래와 비슷한 화면이 나오면 OK삼 >_<.
4. Verilog HDL 코드 작성해보기
먼져 DUT Design Under Test 의 코드를 짜보자능. 일단은 보구 배긔라능. 파일이름은 add.v이고 적당한 자리에 생성하면 되심.
ㅎㅎ 됐고, Testbench의 코드를 짜자능. 파일이름은 testbench.v이고 add.v랑 같은 위치에 만들면 되삼.
!!! testbench.v 의 맨 마지막에 endmodule 가 안 찍혔심. add.v를 참고에서 한줄 적어주라능. !!!
우리가 작성성 DUT인 add 모듈에 여러가지 인풋을 넣어보고 어떤 아웃풋이 나오는지 시뮬레이션 해보는 거라능. testbench의 역활은 그거라능. 일단 콘솔창에 다음 명령어를 쳐서 컴파일을 하고
iverilog testbench.v -o testbench
문제없이 컴파일이 되면 다음 명령어를 사용해서 실행하면 되삼. 그러면 결과가 화면에 나온다능.
vvp testbench
아마 이런 화면이 나올꺼라능.
아래 명령어를 쳐서 gtkwave를 실행시키면 wave form을 볼 수 있다능. gtkwave 사용법은 별로 어렵지 않으니 알아서 익히도록 하자능.
gtkwave wave.vcd
끝이삼. 이제 당신도 베릴로그 hdl 사용자가 되었다능. 매우 축하한다능. 이젠 베릴로그 책을 사더 보던지 인터넷에서 튜토리얼 문서를 찾아서 보구 배우면 되는거심. 이카루스 베릴로그는 커맨드라인 명령어만 제공하니까..make 툴등을 사용해서 자동화된 빌드 환경을 꾸면 더욱 좋을꺼삼.
재밌게 글 쓰셨네요 ㅎㅎㅎㅎ 하나 하나 따라해보니 재밌네요~~~~~정상 작동하구요^^
최신 Icarus 는 gtkwave 까지 포함해서 배포하네요^^ 용량 많이 차지하고 작동법도 어려운 쿼터스랑 모델심 필요없겠어요~^^ 당장 지우고 iverilog 이것만 쓸꺼임 ㅎㅎㅎ
앞으로도 자주 방문할게요 ㅎㅎㅎㅎㅎㅎㅎ
댓글을 달아 주세요
헐 성님! ㄷㅁㅇ 성님! ㅠㅜ
공부자료 생겼네 ㅠㅜ
^^
비밀댓글입니다
보내드렸습니다