2016-06-26 4 views
0

예를 들어이 스레드에서 How to NOT use while() loops in verilog (for synthesis)? 인 Brian Carlton은 Verilog에서 for 및 while 루프를 사용하는 대신 always 루프를 사용해야한다고 설명합니다. 나는 특정 조건이 만족되면 반복을 벗어나는 방법이 무엇인지 궁금해하고있었습니다. 나는 다음을 사용할 수 있는지 궁금 해서요 :Verilog의 "항상"블록에서 벗어날 수있는 다양한 구성 요소는 무엇입니까?

항상

@ (posedge의 CLK 또는 VAR == 3)`

경우 var 모듈의 변수 또는 차단입니까?

예를 들어 다음 코드를 XST로 합성 할 수있는 코드로 변환하는 방법은 무엇입니까?

//****************************************************** 
//Check whether randp is prime or not 
//****************************************************** 
for(i = 0; i < 100; i = i+1) 
begin 
    assign PRIME_CHECK = randp; 
    assign sqroot = PRIME_CHECKED; 
for(i = 0 ; i <= sqroot ; i=i+1) 
    begin 
     if((sqroot%i) == 0) 
     begin 
      break; 
     end 
    end 
    break; 
    randp = RANDP; 
end 

답변

3

always 블록의 밖으로 휴식 할 수있는 방법이 없습니다. 항상 인 프로세스의 존재를 선언하고 있습니다. 하드웨어를 동적으로 만들거나 파괴 할 수 없습니다. 당신이 할 수있는 일은 조건 주위에 코드를 두어 그 주위에 가지를 세우는 것입니다. 그러나 합성 가능 코드를 작성하는 경우 always 블록은 항상 순차 또는 조합 논리의 코딩 규칙을 따라야합니다.

BTW var은 SystemVerilog의 예약어이므로 사용하지 마십시오.

- 업데이트 - 이제 하드웨어로 변환 할 소프트웨어 코드를 추가 했으므로 다른 질문입니다. 이 루프를 벗어나기 전에 루프를 상태 시스템의 클럭 사이클로 분할해야합니다. 그런 다음 루프가 끊어지면 상태 시스템에서 점프가됩니다.

+0

그래서 while 루프를 대체하려면'(@posedge clk or a == 2) begin'을 사용할 수 있습니까? – Prateek

+1

다시 만들려고하는 while 루프를 표시해야합니다. @ (expession)은 루프 내부의 문장 일뿐입니다. '(@posedge clk or a == 2)'는 합법적 인 구문이지만 의미가 없습니다. clk가 0에서 1로 갈 때까지 현재 프로세스를 차단하고, 식 a == 2의 결과가 변경 될 때까지 _block을 의미합니다. 하드웨어와 확실히 합성 할 수 없습니다. –

+0

편집 된 질문입니다. – Prateek