본문 바로가기
language/Verilog

[systemverilog] always_comb, always_ff, always_latch

by 파란하늘코더 2021. 2. 21.
반응형

systemverilog에서는 기존 verilog에서와 다르게 always 구문이 design의 목적에 맞게 세분화 되었습니다.

 

1. always_ff

 - verilog에서의 일반적인 sequential logic을 구현할 때 사용

 - sensitive list 필수

 - timing 제어 구문 포함 불가능

 

2. always_comb

 - verilog에서의 combination logic을 구현할 때 사용

 - sensitive list 필요 없음

 - latch가 생기지 않도록 모든 조건문 필요

 

3. always_latch

 - always_comb와 동일하나 latch구문이 필요할 경우 사용

 


여기서 comb와 latch가 어떻게 다른지 simulation을 간단하게 구현하면

 

reg [2:0] result_comb;
reg [2:0] result_latch;
always_comb begin
     if(data==1) result_comb = 1;
     else result_comb = 2;
end
always_latch begin
     if(data==1) result_latch = 1;
end

위와 같고 결과는 아래와 같습니다.

 

하지만 여기서 comb logic 의 else 구문을 빼면 latch를 사용했을 때와 마찬가지로 같은 결과가 나옵니다

 


여기서 추가로 always_comb,  always @* 차이를 비교하자면

 

아래 사이트에 설명이 되어있습니다.

 

https://www.verilogpro.com/systemverilog-always_comb-always_ff/

 

코드는 아래 처럼 짰을 경우

function logic my_func(input logic m_c);
my_func = a | b | m_c;
endfunction

always @*
always_d = my_func(c);

always_comb
always_comb_d = my_func(c);

결과는 아래와 같습니다

 

@0: a = 0, b = 0, c = 0, always_d = 0, always_com_d = 0
@10: a = 1, b = 0, c = 0, always_d = 0, always_com_d = 1
@20: a = 1, b = 1, c = 0, always_d = 0, always_com_d = 1
@30: a = 1, b = 1, c = 1, always_d = 1, always_com_d = 1

 

자세히 살펴 보면 실제 구문에 들어있는 값이 편할 때만 always @* 는 변하는 것을 알 수가 있습니다.

 

설계자가 잘 파악해서 어떤 것을 사용할지 고민이 필요합니다.

 

'language > Verilog' 카테고리의 다른 글

[systemverilog] random 함수들  (0) 2021.02.27
[systemverilog] assert, property  (0) 2021.02.21
[systemverilog] pass by reference  (0) 2021.02.21
[verilog] system function list  (0) 2021.02.06
[systemverilog] enum 사용법  (0) 2021.02.02

댓글