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 에 따라 달라진다.
- Always 블록을 사용하면 신호의 값을 병렬(순차적)로 업데이트 할 수 있다
- 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
- positive clock edge 일 때 상태 변경
// 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
반응형
'Verilog HDL > 1. Verilog HDL Basic (문법)' 카테고리의 다른 글
[Using the Always Block] 3. Always Block 과 조합 회로 (0) | 2024.01.10 |
---|---|
[Using the Always Block] 2. Blocking, Non-Blocking 할당 (0) | 2024.01.10 |
[Verilog Tutorial] level-4 Using Continuous Assignment 모음 (0) | 2024.01.10 |
[Using Continuous Assignment] 3. 예제 풀이 (0) | 2024.01.10 |
[Using Continuous Assignment] 2. Combinational Logic Circuits (0) | 2024.01.10 |