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 |
댓글