Always Block

Chulwoo Lee·2022년 1월 20일
0

Always

  • Always Block 내부는 Procedeural하다. 즉, 블록 안에서 코드는 Sequentially 순차적으로 진행된다.
  • Hardware로 Synthesize 되기 위해서 엄격한 Coding Guide Line이 존재한다.
  • 하나의 Module은 여러 Always Block을 포함할 수 있다.
  • 모든 Always Block은 time=0 에 동시에 실행된다. Race Around Condition이 발생할 경우 Simulator에 의존한다.
  • Always Block 내부의 LHS(Left Hand Side)는 항상 reg type이다. RHS는 reg 와 wire 둘 다 가능하다.
  • 일반적으로 Race Around Condition을 방지하기 위하여 Always Block 내부에선 Non-Blocking Assignment를 사용한다.

Multiple Always Block

Race Around Condition

레지스터 a 와 b의 값을 교환하려는 Hardware를 설계할 때, 아래와 같이 서로 다른 Always Block 내부에서 Blocking Assignment를 이용해 값을 교환할 경우 Race Around Condition이 발생한다. Simulator는 clk의 posedge마다 어느 Always Block을 먼저 실행할지 골라야하고, 그에 따라 a와 b의 값이 같아질 것이다. 만약 첫 번째 Always Block을 먼저 실행할 경우 a=b=0이 되고, 두 번째 Always Block을 먼저 실행할 경우 a=b=1이 된다.

reg a,b;
a = 1'b1; b = 1'b0;
always @(posedge clk)
	a = b;
    
always @(posedge clk)
	b = a;

위의 코드와 같은 상황을 방지하기 위해서 아래와 같이 Non-Blocking Assignment를 사용한다.

reg a,b;
a = 1'b1; b = 1'b0;
always @(posedge clk)
	a <= b;
    
always @(posedge clk)
	b <= a;

Multiple Driven Error

만약 Always Block을 여러 개 사용할 때, 아래와 같이 하나의 Signal이 여러 Always Block에서 Driven 되어선 안된다. Multi-Driven Error가 발생하고, Synthesize되지 않는다.

reg out;
always @(posedge clk1)
	out <= a | b;

always @(posedge clk2)
	out <= c & d;

ref: https://www.youtube.com/watch?v=X5vfOzSHcHI

profile
Student.

0개의 댓글