Verilog HDL 로 표현되 는 논리회로는 “module”~”endmodul e” 안에 표현 모든 문장은 세미콜론 (;) 으로 문장을 끝냄 ◦ 단, “end~” 로 시작하는 예약어에는 세미콜론이 없음 Module 이름은 영문자 와 언더바 (_) 로 시작할 수 있으며, 대문자와 소 문자를 구별함.
주석 ◦ // 시작 할 경우 – 그 줄 끝까지가 주석이 된다. ◦ “/*” 시작 “*/” 끝날 경우 – 여러 줄에 걸쳐서 주석을 사용. 식별자 ◦ 사용자가 정의한 변수, 모듈 이름, 포트 이름, 함수 이름, instance 이름 등을 말하며 다음과 같은 규칙이 있다. 첫 문자는 알파벳문자 (a~z, A~Z) 혹은 언더 바 (_) 를 사용. 다음 문자부터는 영문자, 숫자, 언더 바 (_), 달라 ($) 를 사용. 이름 중간에 공백문자 ( 스페이스 ) 를 사용할 수 없음. 이름은 1023 문자까지 사용 가능. 대문자와 소문자를 구별한다.
Always, and, assign, begin, buf, bufif0, bufif1, case, casex, casez, coms, deassign, default, defparam, disable, edge, else, end, endcase, endmodule, endfunction, endprimitive, endspecify, endtable, endtask, event, for, force, forever, fork, function, highz0, highz1, if, ifnone, initial, inout, input, integer, join, large, macromodule, medium, module, nand, negedge, nmos, nor, not, notif0, notif1, or, output, parameter, pmos, posedge, primitive, pull0, pull1, pullup, pulldown, rcoms, real, realtime, reg, release, repeat, rnmos, rpmos, rtran, rtranif0, rtranif1, scalared, small, specify, specparam, strong0, strong1, supply0, supply1, table, task, time, tran, tranif0, tranif1, tri, tri0, tri1, triand, trior, trireg, vectored, wait, wand, weak0, weak1, while, wire, wor, xnor, xor
and U1 (C,A,B); ◦ 연산자 //instance 이름 ( 생략가능 )//port 이름 ( 출력, 입력의 순서 로 쓴다 ) 논리 연산자는 벡터 단위의 연산은 할 수 없고, 항상 비 트 단위로 연산 not, buf 는 여러 개의 출력을 가질 수 있다. ◦ not (Y0, Y1, Y2, A); // Y0, Y1,Y2 는 출력, A 는 입력 ◦ buf (Y0, Y1, Y2, B); // Y0, Y1,Y2 는 출력, B 는 입력 연산자예의미 andand (Y,A,B);Y = A and B nandnand (Y,A,B);Y = A nand B oror (Y,A,B);Y = A or B nornor (Y,A,B);Y = A nor B xorxor (Y,A,B);Y = A xor B xnorxnor (Y,A,B);Y = A xnor B notnot (Y,A);Y = not A bufbuf (Y,A);Y = buf A
assign 포트 (or 와이어 ) = 논리식 (or 산술 연산식 ); 연산자의미예설명 ~notassign Y = ~ AA 를 비트단위로 인버팅해서 Y 에 대입 &andassign Y = A & BA 와 B 를 비트단위로 and 연산해서 Y 에 대입 |orassign Y = A | BA 와 B 를 비트단위로 or 연산해서 Y 에 대입 ^xorassign Y = A ^ BA 와 B 를 비트단위로 xor 연산해서 Y 에 대입 ~^xnorassign Y = A ~^ BA 와 B 를 비트단위로 xnor 연산해서 Y 에 대입
예약어 [MSB : LSB] 신호이름 ; ◦ 예약어 – input, output, wire, reg 등 ◦ [MSB : LSB] – 비트 폭의 범위를 지정 ◦ 신호이름 – 포트, 네트 ( 와이어 ), 레지스터 등의 이름 부호 없는 정수로 취급 벡터를 1 비트 단위로 취급할 경우 ◦ [ 비트 번호 ] 를 사용하여 취급 비트 폭 지정은 한 개의 선언에 한번만 사용 벡터 크기보다 큰 값을 전달할 경우는 에러가 발생
벡터 표현의 예설 명설 명 input [3:0] A, B; input [7:0] ABUS; 4bit 입력 A 와 B 8bit 입력 ABUS wire busy, [2:0] status; 여러 번 사용한 에러의 예 assign MSB = ABUS[7]; assign LSB = ABUS[0]; ABUS 의 bit 번호 7 을 MSB 신호로 전달 ABUS 의 bit 번호 0 을 LSB 신호로 전달 wire [3:0] H_digit; assign H_digit = ABUS[7:4]; ABUS 의 bit 번호 7~4 를 H_digit 로 전달
Verilog HDL 에서는 4 개의 논리 값만 사용 ◦ 0 – 논리 0 ◦ 1 – 논리 1 ◦ x(X) – ‘0’ 과 ‘1’ 이 충돌 될 때의 모르는 값 “unknown” 값이며, don’t care 와는 의미가 다름 ◦ z(Z) – 하이 임피던스
Verilog HDL 에서 숫자는 정수와 실수를 사용 정수 표현 ◦ ’ 비트 폭 – 10 진수로 표현. 생략하면 32 비트로 취급 진수 – b,B:2 진수 o,O:8 진수 d,D:10 진수 h,H:16 진수 값 – 읽기 쉽게 “_” 를 사용할 수 있으며 “_” 는 숫자 크기에 영 향을 주지 않는다. 진수에 대응되는 값 2 진수 : 0, 1, x, z 8 진수 : 0~7, x, z 10 진수 : 0~9(x, z 는 사용 불가 ) 16 진수 : 0~9, a~f, x, z
정수표현의 예 정수 표현비트 폭진수 2 진수로 표현 진수 ‘b112 진수 1 8'haa816 진수 'bz42 진수 zzzz 8'o37788 진수 'b0000_11x x 82 진수 xx 'hff3216 진수 'h?ZZ?416 진수 ZZZZ (? 는 Z 의 변형된 문자 ) 4'd5410 진수 0101
Verilog HDL 에서 실수는 과학적인 기호나 10 진 수로 표현할 수 있으며, 과학적인 기호로 표현할 경우, 다음과 같은 형식으로 표기. ◦ - 10 진수로 표현 ◦ 예 > 32e-4 : , 4.1E3 : 4100 실수 표현은 시뮬레이션에서만 사용된다.
Structural modeling 회로도 (schematic) 을 그리는 것 같이, 좀 더 복잡 한 component 를 만들기 위해, 이미 있는 component 를 사용하여 단순히 연결하는 것. module NOR_LATCH (R,S,Q,Qbar); input R,S; output Q, Qbar; nor U1 (Q, R, Qbar); nor U2 (Qbar, S, Q); endmodule
4bit full adder 예제
module instance 호출 방법 ◦ 하위층 모듈이름 instance 이름 ( 인수, 목록 ); ◦ 하위층 모듈이름 – Full_adder ◦ Instance 이름 – ADD0,ADD1,ADD2,ADD3 사용자가 임의로 지정 ◦ 인수, 목록 – “a[0], b[0], 1’b0, sum[0], cout[0]” 하위의 a b cin sum cout 포트와 일치된다. ◦ 호출한 측의 해당 네트와 하위층 모듈의 대응되는 포트를 순서대 로 연결한 방식 => positional mapping ◦ 같은 하위층의 모듈을 계속해서 호출해서 사용할 경우 Full_adder ADD0 (a[0],b[0],1'b0,sum[0],cout[0]), ADD1 (a[1],b[1],cout[0],sum[1],cout[1]), ADD2 (a[2],b[2],cout[1],sum[2],cout[2]), ADD3 (a[3],b[3],cout[2],sum[3],cout[3]);
하위층 모듈을 호출할때, 기술순서와 관계없이 이 름을 이용하여 접속 => named mapping ◦. 하위층 모듈 포트 이름 ( 접속 신호 ) ; ◦ Full_adder ADD0 (.a(a[0]),.b(b[0]),.cin(1'b0),.sum(sum[0]),.cout(cout[0])); ◦ Full_adder ADD1 (.sum(sum[1]),.cout(cout[1]),.a(a[1]),.b(b[1]),.cin(cout[0])); Positional mapping 과 named mapping 을 혼용 하여 사용할 수는 없다. ◦ Full_adder ADD0 ( a[0], b[0],.cin(1'b0),.sum(sum[0]),.cout(cout[0]));