Language/Verilog & SV
[System Verilog] always @(*), always_ff, always_comb, always_latch
VIR&US
2024. 4. 7. 03:40
반응형
always @(*)
- Verilog의 always
- sensitivity list가 바뀔때 동작
always_comb
- Verilog에서의 combination logic을 구현할 때 사용
- sensitive list 필요 없음
- latch가 생기지 않도록 모든 조건문 필요
Code [ always @(*), always_comb ]
module test;
logic a, b, c, always_d, always_comb_d;
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);
initial begin
$monitor("@%0t: a = %d, b = %d, c = %d, always_d = %d, always_com_d = %d", $time, a, b, c, always_d, always_comb_d);
end
initial begin
a = 0;
b = 0;
c = 0;
#10 a = 1;
#10 b = 1;
#10 c = 1;
end
endmodule
Sim log
@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
Code [ always_comb ]
always_comb begin
b = a;
c = b;
end // c = a
always_comb begin
c = b;
b = a;
end // c = previous value of a
always_comb 블록 내에서 또는 always_comb 블록 내에서 호출된 함수 내에서 작성된 표현식은 implicit sensitivity list에서 제외됩니다.
always_ff
- Verilog에서의 일반적인 sequential logic을 구현할 때 사용
- sensitive list 필수
- timing 제어 구문 포함 불가능
always_ff @(posedge clock iff reset == 0 or posedge reset) begin
r1 <= reset ? 0 : r2 + 1; ... ;
end
always_latch
- always_comb와 동일하나 latch구문이 필요할 경우 사용
wire data;
reg result_latch;
always_latch begin
if(data==1) result_latch = 1;
end
728x90
반응형