2014-02-12 5 views
2

비동기 재설정 기능이있는 d 플립 플롭의 간단한 예를들 수 있습니다.비동기 재설정 동작에 대한 어설 션 작성 방법

q는 시계의 다음 가장자리에서 d로 업데이트해야하며 간단한 암시 적 연산자 어설 션으로 작성할 수 있습니다.

그러나 어설 션에서 재설정 동작을 캡처하는 방법. 나는이 주장이 실패 모두, 내가 처음의 어떤 ​​다음 posedge가 없기 때문에 생각 몇

assert @(posedge rst) (1'b1 |-> !Q); 

assert @(posedge rst) (1'b1 ##0 !Q); 

다음 시도했습니다?

assert @(posedge clk) ($rose(rst) |-> !Q); 

패스하지만 무료로 실행 클럭을 필요로하며, 클럭의 두 가장자리 사이에 주장한다 그러나 내가 할 수있는,이 올바른 즉시 주장입니다 내 이해 당으로

assert #0 (not (rst & Q)); 

(안 앤은 첫 번째에 대한 동작을 inteded) 파형보기에서 통과/실패하는 것을 봅니다. 더욱 더 나는 마지막 유형의 주장에 대해 표지를 쓸 수 없을 것이라고 생각한다.

답변

2

업데이트하기 전에 Q이 샘플링되기 때문에 어설 션이 실패합니다. 샘플링은 시뮬레이터의 스케줄러 초기에 트리거 이벤트의 LHS에서 발생합니다. Q은 나중에 스케쥴링 순서대로있는 리액션 영역에서 업데이트됩니다.

쉽게 수정할 수있는 방법은 SystemVerilog의 1step과 같은 작은 지연을 추가하는 것입니다. 최소 펄스 폭 검사의 일부로 작동 할 수있는 검사 조건에 rst을 넣는 것이 좋습니다.

wire #(1step) rst_delay = rst; 
assert @(posedge rst_delay) (1'b1 |-> rst && !Q); 

것은 당신이 그런 SDF 주석 또는 인공 지연에서 같이 리셋 - 투 - Q 지연 시뮬레이션하는 경우, 다음 rst_delay에 오프셋을 추가합니다.

wire #(r2q+1step) rst_delay = rst; 
assert @(posedge rst_delay) (1'b1 |-> rst && !Q); 
+0

감사합니다. 내 주장을 업데이트했습니다. 예비 테스트가 통과하고 있습니다. 나는 양복을 치고 그 결과를 볼거야. 바로 지금 나는 r2q 지연으로 그것을 실행할 필요가 없지만 알아두면 좋다 :) – wisemonkey