사건이란 레지스터, 혹은 넷의 값 변화를 의미한다.
사건 기반 타이밍 제어에는 정규 사건 제어(regular event control), 명명된 사건 제어(named event control), 사건 OR 제어(event OR control), 준위-구동 타이밍 제어(level-sensitive timing control) 4가지 형태가 존재한다.
엣지 트리거링으로 사건을 제어할 때에는 기호 @을 사용하며, 준위 트리거링으로 제어할 때는 키워드 wait을 사용한다.
- 정규 사건 제어
정규 사건 제어는 클럭의 상승, 하강 엣지를 지정할 수 있다.
@(clock) q = d; //클럭이 변할 때(클럭의 엣지에서) 수행
@(posedge clock) q = d; //클럭의 상승 엣지에서 수행
@(negedge clock) q = d; //클럭의 하강 엣지에서 수행
q = @(posedge clock) d; //d의 값을 구하고, 클럭의 상승 엣지에서 할당된다
- 명명된 사건 제어
사건을 선언하는 것도 가능하다.
사건은 어떠한 데이터도 가지고 있을 수 없으며, 키워드 event에 의해 선언된다. 또한 -> 기호에 의해 triggered된다.
역시 마찬가지로 @기호를 통해 제어할 수 있다.
event received_data; //event 선언
always @(posedge clock)
begin
if(last_data_packet)
-> received_data; //만약 조건이 참이면 해당 event를 구동한다.
end
always @(received_data) //사건이 구동되면
data_buf = {data_pkt[0], data_pkt[1], data_pkt[2], data_pkt[3]};
- 사건 OR 제어
사건의 목록, 즉 감지 목록을 만들어서 이 중 하나의 사건이라도 구동되면(감지 목록 중 하나라도 변화가 발생했을 때) 블록이 실행되도록 할 수도 있다.
키워드 or, 또는 콤마 연산자를 사용하여 여러 사건들을 지정한다.
always @(reset or clock or d) //always @(reset, clock, d)
begin
if(reset)
q = 1'b0;
else if(clock)
q = d;
end
만약 블록 내의 모든 신호들의 변화를 감지해야 하는 경우라면 대신 @(*), @* 와 같이 사용할 수도 있다.
- 준위-구동 타이밍 제어
준위-구동 타이밍 제어는 엣지에서 트리거링되는 것이 아니라 신호값이 1일 때 트리거링되도록 한다.
키워드 wait을 사용한다.
always
wait (count_enable) #20 count = count + 1;
count_enable의 값은 연속적으로 모니터링되어, 그 값이 1일 때만 문장이 수행된다.
'EE > Verilog' 카테고리의 다른 글
[Verilog] 루프문 - while, for, repeat, forever (0) | 2023.01.17 |
---|---|
[Verilog] case, casex, casez문 (0) | 2023.01.17 |
[Verilog] 지연 기반 타이밍 제어 (0) | 2023.01.17 |
[Verilog] 절차적 할당 - 블록킹과 논블록킹 (0) | 2023.01.17 |
[Verilog] initial과 always 구문 (0) | 2023.01.16 |