Verilog Coding

모델링

  • Gate-Level 모델링
  • Dataflow 모델링
  • Behavioral 모델링
  • Testbench 작성

기본

수표현

몇 비트?'|몇 진수?|해당 수

참고
표시x -> 자동적으로 32'd해당수(32비트+10진수+해당수)

논리값

0,1,x(미지수-알수없음),z(끊겨있음-플로팅상태)

와이어

wire <이름>;
wire <이름> = 값;

레지스터(메모리)

reg <이름>;

integer <이름>; (32비트 reg)

참고

  • 묶음(vector)
    wirereg의 묶음: <reg또는 wire> [0:7] <이름>
    *ex) reg [0:10] = busA;

  • 쪼개기
    wire의 묶음을 쪼개는것 또한 가능하다.
    *ex) wire [0:30] = busA
    byte1= busA[0:5]

그외

  • # <숫자>
    n단위시간 후에 실행할 코드라는 뜻.

Gate-Level 모델링

게이트를 사용하여 모듈을 모델링하는 것

모듈

black box의 안을 정의하는 것

module <module_name>(<input port/ output port>);
    input/output port선언 (wire와 같은 느낌)
    reg 선언
    wire 선언
    parameter 선언
    
    // 구성요소 선언 
    
    always, initial
    function, task 정의
    assign
    function, task 호출
    
    // 구성요소 연결
endmodule

*ex) a,b를 입력받아서 sum, cout을 내보내는 adder

module half_add(a,b,sum,cout)
    input a, b;
    output sum. cout;
    wire cout_bar;

    xor(sum, a, b);
    nand(cout_bar, a, b);
    not(cout, cout_bar);
endmodule
  • 즉, 순서는 상관없음(프로그래밍 언어가 아니다.) 소자들끼리의 연결만 잘 되면 된다.

모듈의 사용
만들어진 모듈/함수를 사용하는 것

  • 순서를 맞춰 매개변수에 전달하는 방법
  • ex)
xor(sum, a, b)     //함수(출력,입력)
and(cout, a, b, c)    // 기본함수의 출력은 1개임
nand(cout, a, b)
  • 위치를 알려주는 방법 (.해당포트(넣을 값))
    ex)
fulladder(.c_out(a), .sum(b))

Dataflow 모델링

게이트 대신에 연산자할당을 사용하는 것

  • 연산자

  • 할당
    assign 출력 = 입력 + 연산자
    ex) assign out = i1 & i2;

*참고

  • assign: wire에는 반드시 assign을 해주어야함
    ex) wire i1, i2, out; assign out = i1 & i2;
  • write: reg는 write를 통해 저장가능
    ex) real a,b,c; c = a - b;*

Behavior 모델링

조건문

  • if else 구문: 조건이 참일때만 ~를 실행
if()
    ~;
else
    ~;
  • case 구문: case안의 값이 참인 ~를 실행
case()
    ~;
case()
    ~;
endcase

always 구문

항상 수행되어야 하는 하드웨어의 동작을 묘사한 것.

always @(in1, in2, a, b) begin
    if (in1 ==0)
        out = a;
    else
        out = b;
  • always ~ begin ~ end
    프로그래밍 언어에서의 중괄호({})는 begin end로 표현한다.

  • @(~)
    항상 체크하는데 괄호안의(~)의 값이 바뀔 경우만 체크하도록 하자는 뜻
    (모든 입력은 *로 표현)

보조함수들: 시뮬레이션할 때 결과에서 참고할 수 있도록 도와주는 함수들
$display(); -> C의 printf문법이랑 비슷
$time

testbench 작성

모듈들을 테스트 시뮬레이션해보는 것

  • input/output port존재 X
    (wire로 표현하자)

  • stimulus를 넣고 response를 관찰

  • initial 구문: testbench에서만 사용하는 것으로 한번만 실행되고 주로 stimulus를 넣어줄 때 사용

ex)

module test_Fix();
    reg A, B, C;
    
    circuit c1(A, B, C, Out);
    
    initial begin
            A=0; B=1; C=0;
        #50 A=1;
        #50 A=0; C=1;
        #50      C=0;
        #50 $finish;
    

좋은 웹페이지 즐겨찾기