보안회로설계 모델심설치 & Verilog testbench 기초문법 Dong Kyue Kim Hanyang University dqkim@hanyang.ac.kr
모델심설치
ModelSim ModelSim Made by Mentor HDL simulator VHDL, Verilog, System Verilog and optional SystemC HDL 에의해합성될회로의동작과정과결과예상 ModelSim Student Edition Download Link https://www.mentor.com/company/higher_ed/modelsim-student-edition 3
설치파일다운로드과정 -1 ModelSim Student Edition Download Link 에서학교메일을포함한정보작성 4
설치파일다운로드과정 -2 정상적인 download 신청이끝나면아래와같은메시지출력됨 5
설치파일다운로드과정 -3 메일을통해다운로드링크를받을수있음. 6
모델심설치과정 -1 다운받은설치파일은다른컴퓨터에공유가불가능 ( 이후발급받을라이센스와연동됨 ) 7
모델심라이센스설정 - 1 라이센스신청을위한정보입력 8
모델심라이센스설정 - 2 메일을통한라이센스발급 9
모델심라이센스설정 - 3 모델심이설치된폴더에라이센스파일저장 10
모델심설치확인 - 1 정상적으로켜지는모델심확인 11
모델심설치확인 - 2 새프로젝트의생성 12
모델심설치확인 - 3 프로젝트폴더생성및지정 13
모델심설치확인 - 3 프로젝트폴더생성및지정 14
모델심설치확인 - 4 파일의추가 15
모델심설치확인 - 5 컴파일정상동작확인 16
모델심설치확인 - 6 Simulation 열기 17
모델심설치확인 - 7 Simulation 동작확인 18
모델심튜토리얼 Product Tutorial 튜토리얼소개동영상 : https://www.mentor.com/products/fv/multimedia/modelsimessentials 튜토리얼문서경로 다음강의에서튜토리얼내용설명예정 ( 모델심사용법 ) 19
Testbench 소개
Testbench 소개 Testbench 란 verilog 로설계한논리회로를시뮬레이션하기위해서사용 검증할회로에대해서입력값 ( 인풋 ) 을주어서, 그때의출력값 ( 아웃풋 ) 을관측하여제대로동작되는지확인할수있음 input 검증대상회로 output 21
Testbench 프로그램구조 module 선언신호및변수선언검증대상호출 신호입력 endmodule module 선언 : module의이름정의 신호및변수선언 : 입력신호및지역변수선언 검증대상호출 신호입력을통해검증대상의결과확인 initial, task 문을이용하여작성 endmodule 4
Testbench 소개 Testbench 형식 Ex) DES testbench 23
Testbench 소개 Testbench 형식 Ex) DES testbench module 모듈이름 ; // 포트목록은쓰지않는다. 24
Testbench 소개 Testbench 형식 Ex) DES testbench 시뮬레이션할대상이되는입력값은 reg 또는 wire로출력값은 wire로선언한다. ex) clk, start, reset 신호그리고암호화할입력값과 key값을 reg로, 암호화된출력값과완료신호 done은 wire로선언해주었다. 25
Testbench 소개 Testbench 형식 Ex) DES testbench 검증하고싶은모듈을호출하고포트를연결해준다. 포트를연결할때는인자순서대로연결할수있으며, 또는순서에상관없이이름에각각할당할수도있다. 26
Testbench 소개 Testbench 형식 Ex) DES testbench 검증하고싶은모듈을호출하고포트를연결해준다. 포트를연결할때는인자순서대로연결할수있으며, 또는순서에상관없이이름에각각할당할수도있다. Ex) module adder(x, y, c_out, c_in, sum); //... endmodule // 위치에의한포트연결 adder adder1(inp1, inp2, carry_out, carry_in, sum_out); // 이름에의한포트연결 adder adder2(.sum(sum_out),.c_out(carry_out),.c_in(carry_in),.x(inp1),.y(inp2)); 27
Testbench 소개 Testbench 형식 Ex) DES testbench initial 문을통해 입력신호와 input 데이터를넣어준다. 28
Testbench 기본문법 (1) 컴파일러지시어
Test Program 작성방법 Initial / fork~join Initial 문 문장블록을처음부터끝까지한번만순차적 (sequential) 실행 시뮬레이션할때만사용 fork ~ join 순차처리블록인 begin ~ end 와비교되는병렬처리블록 시뮬레이션할때만사용 6
Testbench 기본문법 [ 컴파일러지시어 ] `timescale `timescale 1ns/10ps module testbench ; reg X, Y ; wire C, S ; initial begin `timescale 1step 단위 / 해상도 ms : ( 밀리 / 초 )10^-3 Ms : ( 마이크로 / 초 )10^-6 ns : ( 나노 / 초 )10^-9 ps : ( 피코 / 초 )10^-12 fs : ( 펨토 / 초 )10^-15 as : ( 아토 / 초 )10^-18 delay 입력 직접적숫자로입력 Ex) #50, #200 parameter 이용 Ex) parameter STEP = 100; parameter 로미리정의 #STEP STEP 에정의된값인 100 이들어감 31
Testbench 기본문법 [ 컴파일러지시어 ] `timescale `timescale 1ns/10ps module testbench ; reg X, Y ; wire C, S ; initial begin X = 0 ; Y = 0 ; #5.5 ; X = 0 ; Y = 1 ; #5.55 ; X = 1 ; Y = 0 ; #5.555 ; X = 1 ; Y = 1 ; #5.5555 ; $stop ; end endmodule `timescale 1step 단위 / 해상도 = 5.5ns delay = 5500ps delay = 5.55ns delay =5550ps delay = 5.555ns delay 불가능 = 5.5555ns delay 불가능 해상도를바꿔야함 `timescale 1ns/100fs ms : ( 밀리 / 초 )10^-3 Ms : ( 마이크로 / 초 )10^-6 ns : ( 나노 / 초 )10^-9 ps : ( 피코 / 초 )10^-12 fs : ( 펨토 / 초 )10^-15 as : ( 아토 / 초 )10^-18 32
Test Program 작성방법 delay / clock clock 생성 always 문을이용하여 clk 을미리정의 always #(50) clk = ~clk; initial Ex) compile error 뜸 Ex) 올바른사용 7
Test Program 작성방법 delay/clock 예제 절대적인지연 always #(50) clk = ~clk; clock 생성 clock 에대한상대적인지연 always #(50) clk = ~clk; initial begin clk=0; reset=1; x=0; #50 reset=0; x=1; #50 x=1; #50 x=0; #50 x=0; #50 x=1; #50 $finish; end 초기값 입력값의변화 종료 initial begin clk=0; reset=1; x=0; @(posedge clk) #10 x=1; #10 x=0; end 8
Testbench 기본문법 [ 컴파일러지시어 ] clock 생성예제 parameter 를선언하여 clock 을생성한예제 50us 지났을때반전되도록함 35
Testbench 기본문법 [ 컴파일러지시어 ] define C언어의 #define과거의같다. `define으로정의된문장을참조할대에도 ` 기호가필요하다. Ex) `define SIZE 10 // `SIZE 를 10으로사용한다. `define END $stop // `END를 $stop 으로사용한다. Ex) `define ABC #1 `ABC data = 0; 5
Testbench 기본문법 [ 컴파일러지시어 ] `include 텍스트삽입 C 언어의 #include 와거의같으며파일전체의내용을삽입할경우에사용된다. 다른 verilog 소스파일을현재소스파일에추가하는용도 Ex) `include GLOBAL.V //GLOBAL.V 파일을삽입 `include PARTS/COUNT.V //PARTS 폴더의 COUNT.V 파일을삽입 37
Testbench 기본문법 (2) 시스템태스크
Testbench 기본문법 [ 시스템태스크 ] Simulation 의실행을제어하는 system task stop / finish $stop 시뮬레이션을중단한다. 다시시작가능함 $finish 완전히시뮬레이션을종료한다 종료를묻는대화창에서취소시, 다시시작가능하다. 39
System Task Example stop / finish Test Stimulus 일단중단 종료여부물어봄계속할수있다 종료혹은중단 13
Testbench 기본문법 [ 시스템태스크 ] Simulation 에서결과를 display 하는 system task Transcript 에출력됨 $time 시뮬레이션의현재시간을나타낸다. $display C 언어의 printf 와용법이비슷하다. 시뮬레이션실행시실행창에내용 1 회출력한다. 변수값, 문자열, 수식등을출력하는용도로사용한다. ex) $display( i = %d,i ); $monitor 연결한레지스터나와이어의값이변할때마다그값을계속해서출력한다. ex) $monitor($time, %d%dmin %d%dsec, highm, lowm, highs, lows); 41
System Task Example display / monitor Test Stimulus 값이변할때마다계속출력 START 문구를한번출력 START 출력 값이변할때마다계속출력한다. 14
System Task 파일입 / 출력 system task readmemh / readmemb / writememh / writememb h : 16진수 b : 2진수 작성방법 ex) reg[7:0] data[0:7]; $readmemh( 파일이름, data) ; 12
System Task Example readmem 한줄에들어가는자료의크기는 reg 의크기를넘을수없다. read 에서는배열에크기가 text 의전체줄수이상이어야한다. (write 는반대 ) 15
Testbench 기본문법 [ 시스템태스크 ] 포맷된파일출력이가능한 system task C 언어와비슷하다. ex) $fopen(filename); 파일을열고 descriptor 리턴 $fclose([descriptor]); 파일을닫음, descriptor 생략시모든파일닫힘 $fdisplay(descriptor, ); descriptor 파일에 출력하고한줄띄움, 다음줄에출력 $fwrite(descriptor, ); descriptor 파일에 출력, 같은줄에출력 $fmonitor(descriptor, ); 등록된 parameter 의변화가있을때만출력 45
Testbench 기본문법 (3) 반복문 &task 문
Testbench 기본문법 [ 루프문 ] for 문 ex) for( i=0; i<=15; i=i+1 ) begin #50; A=A+1; end repeat( 반복회수 ) ex) repeat(10) begin end while 루프 ex) i = 0 ; $display( i = %d, i ); i = i + 1 ; while(i<10) begin//while( 참조건 ) 일때실행 end $display( i = %d, i ); i = i + 1 ; 47
Testbench 기본문법 [ 루프문 ] forever 루프 / disable 문 forever 루프는무한루프이다. disable 문은이름이있는블록이나태스크를끝낼때사용한다. ex1) ex2) ex3) 48
Testbench 기본문법 [Task] Task 문 같은패턴의동작을여러번반복해서사용할수있다. < 기본형식 > task 태스크이름 ; input 선언 begin end endtask ex) task write_reg; input addr; input data; begin #25 A = addr; #25 DIN = data; #25; end endtask Task 문호출 < 기본형식 > 태스크이름 ( 인수 1,, 인수 N) ex) always@(negedge CLK) write_reg(a,b); 49
Testbench 기본문법 [Task] Task 문변수 Task 문에서는내부변수를사용할수도있고, Global 변수를사용할수도있다. ex) 내부변수사용 Global 변수사용 50