본문 바로가기
Language/Verilog & SV

[System Verilog] always @(*), always_ff, always_comb, always_latch

by VIR&US 2024. 4. 7.
반응형

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
반응형

'Language > Verilog & SV' 카테고리의 다른 글

[Verilog Problem] Wire 2  (0) 2024.05.22
[Verilog Problem] Wire 1  (0) 2024.05.22
[Verilog] 1bit Half adder(반가산기)  (0) 2023.07.23
[Verilog] Frequency(Clock) Divider  (0) 2023.07.21
[Verilog] Counter  (0) 2023.07.21