본문 바로가기
HW Design/1. Verilog HDL Basic

[Using the Always Block] 1. Always block 이란?

by 한PU 2024. 1. 10.
728x90
반응형
  • always block
    • 순차적으로 실행되는 코드 작성
    • sequential logic 을 설명할 때 매우 중요.
  • 예제 풀이 전에 testbench 관련 내용을 읽고와도 좋음.

The Always Block in Verilog

  • Verilog 에서는 procedural blocks (절차적 블록) 를 사용하여 순차 실행문을 만든다.
  • 대조적으로, continuous assignment 는 동시에 (병렬적으로) 실행된다.
  • Always block
    • 가장 보편적으로 사용되는 절차 블록
    • sensitivity list 중 하나가 상태를 변경할 때마다 always 블록의 모든 실행문이 순서대로 실행.
    • 일반적 구문
728x90
// Always 블록의 일반적 구문

always @(<sensitivity_list>) begin
    // 실행문 작성
end
  • 초보자는 always 블록에서 신호가 업데이트 되는 방식을 이해하기 어렵다.
    • Always 블록을 사용하면 신호의 값을 병렬(순차적)로 업데이트 할 수 있다
      • blocking, non-blocking assignment 에 따라 달라진다.
  • effective verilog designer 가 되려면, always 블록을 잘 이해하는 것이 중요하다.

Sensitivity Lists

  • always block 내에서 작성한 코드는 지속적으로 실행됨.
    • 즉, 코드 블록은 마지막 줄에 도달할 때까지 순차적으로 실행
    • 시퀀스의 마지막 줄이 실행되면 첫 번째 줄로 다시 반복
    • always 블록의 모든 문이 다시 순서대로 진행.
  • But, 위의 행동은 실제 회로와 다르다.
    • 실제 회로는 입력 신호 중 하나가 상태를 변경할 때까지 steady state를 유지함.
  • Sensitivity List 를 사용하여 이 동작을 모방(emulate).
    • always 블록 내의 코드는 sensitivity list의 신호 중 하나의 상태가 변경되면 실행됨.

Flip Flop Example

  • D F/F 를 always block 을 사용하여 만들어보자.
  • D flip flop
    • positive clock edge 일 때 상태 변경
      • Active high
// D FF 코드 예시
always @(posedge clock) begin
    q <= d;
end
  • posedge 매크로
    • 0 -> 1 로 clock 이 치는 시점을 결정.
    • true가 되면 always 블록 내의 코드 실행
      • 출력 신호 (Q)에 D값을 할당
    • posedeg 매크로를 사용하면 다른 모든 상태 변화는 무시
      • 예를 들어 1 -> 0 clock
  • negedge 매크로
    • posedge와 반대
  • 매크로 생략도 가능.
    • sensitivity list의 신호 상태 변경마다 코드 실행
  • Verilog 설계시 클럭 신호는 항상 posedge
    • 합성 툴이 구현할 때 FPGA 내의 클럭 리소스를 활용하기 때문.
    • FPGA 클럭 리소스 부분을 더 공부해볼 것

Multiple Signals in a Sensitivity List

  • Sen list에 두 개 이상의 신호를 포함하는 경우
    • 예) clock, 비동기 reset 이 있는 FF
    • 두 신호를 쉼표로 구분하면 된다.
반응형
// multi signals in sen list 예시
// D ff

always @(posedge clock, posedge reset) begin
    if (reset) begin
        q <= 1'b0;
    end
    else begin
        q <= d;
    end
end
  • reset 신호가 active high 작동 -> posedge 매크로 사용
  • if 문을 통해 always 블록이 어떤 신호에 의해 트리거가 되는지 결정
    • reset 신호 트리거
    • clock 신호 트리거
  • Verilog 1995 코드에서는
    • ,(쉼표) 구분 대신 or 로 구분
// Verilog 1995
always @(posedge clock or posedge reset) begin
    if (reset) begin
        q <= 1'b0;
    end
    else begin
        q <= d;
    end
end
728x90
반응형