2012-06-26 2 views
3

"Verilog 합성에서 비 차단 할당, 종료하는 코딩 스타일"을 읽었습니다. 클린드 커밍스. 그는이 질문의 맨 아래에있는 코드가 3 개의 플립 플롭 파이프 라인으로 합성되도록 "보장"되어 있지만 올바르게 시뮬레이트하는 것은 보장되지 않는다고 말했습니다 (10 페이지의 파이프 b3 예제, "보증 된"주석은 12 페이지에 있습니다)). 이 문서는 최고의 논문상을 수상했기 때문에 그 주장은 사실이라고 생각합니다. http://www.sunburst-design.com/papers/CummingsSNUG2000SJ_NBA.pdfVerilog 코드에서 합성 된 하드웨어의 정확성은 무엇입니까?

내 질문 : 시뮬레이션 의미론을 참조하지 않을 경우 Verilog 합성의 정확성은 어떻게 정의됩니까? 많은 감사합니다.

보너스 포인트 질문은 다음과 같다고 가정합니다. 잘 정의 된 합성 의미론을 갖고 있으며 아래에 코드가 아니라고 가정하면 잘 정의 된 시뮬레이션 의미론이없는 가능한 가장 간단한 Verilog 프로그램을 제공하십시오. 다시 한번 감사드립니다.

사실, 누군가가 나에게 Verilog thatis 잘 정의 된 조각을 줄 수 있습니까 시뮬레이션 및 합성, 아직 두 가지 결과를 생산?

코드 :

module pipeb3 q3, d, clk); 
    output [7:0] q3; 
    input [7:0] d; 
    input clk; 
    reg [7:0] q3, q2, q1; 

    always @(posedge clk) q1=d; 
    always @(posedge clk) q3=q2; 
    always @(posedge clk) q1=d; 
endmodule 

는 PS가 : 경우 사람이 관심에, 내가 올바른 합성 툴의 그럴듯한 정의의 라인을 따라 수도 있지만 "합성 된 하드웨어가 뭔가를 할 것이다 정확한 시뮬레이터 수 있었다" . 그러나 이는 논문과 일치하지 않습니다.

[나는 이제 그 종이가 옳지 않다고 생각한다. 1364-2001 표준의 섹션 5.2에서는 Verilog 프로그램의 의미가 표준에 따라 (비 결정론 및 전체) 정의가 진행되는 시뮬레이션에 의해 정의된다고 분명히 말합니다. 합성 도구가 시뮬레이터와 관련하여 제공해야하는 "보증"에 대해서는 언급이 없습니다.

합성 가능한 하위 집합을 설명하는 또 다른 표준 1364.1-2002가 있습니다. 합성 하드웨어의 의미가 시뮬레이션과 어떻게 다른지 분명히 언급하지는 않습니다. 섹션 5.2.2 "가장자리 감지 저장 장치 모델링"에서는 플립 플롭을 모델링 할 때 비 차단 할당을 사용해야한다고 설명합니다. standard-speak에서는 다른 것의 사용이 지원되지 않는다는 것을 의미합니다.

마지막으로, 이전 단락에서 언급 한 섹션에서는 블로킹 할당을 사용하여 비 블로킹 할당의 RHS를 계산할 수 있습니다. 이것은 Cummings의 추천 # 5를 위반하는 것으로 보입니다.

클리프 커밍 즈 (Cliff Cummings)는 1364.1-2002 표준 작업 그룹의 구성원으로 등록되어 있습니다. 이 표준은 IEEE 웹 사이트에서 대체 된 것으로 나와 있지만 대체 할 수있는 내용을 알 수는 없습니다.]

+0

나는 "합성 된 하드웨어가 올바른 시뮬레이터가 할 수있는 것을 할 것"이라고 정의 할 것입니다. 시뮬레이터는 합성 하드웨어와 동일한 결과를 제공해야합니다. – Morgan

+0

분명히 틀렸어. 나는 두려워. 시뮬레이션은 의도적으로 비 결정적이므로 다른 올바른 시뮬레이터는 다른 결과를 줄 수 있습니다. 실제로 똑같은 올바른 시뮬레이터를 실행하면 결과가 달라질 수 있습니다 (AFAIK). 따라서 동일한 하드웨어가 옳고 그름이 무작위로 바뀝니다. 별로. (원래의 정의는 하드웨어에 의해 생성 된 결과가 의미하는 바를 설명하기 위해 많은 조항을 필요로합니다.) – user1002059

+0

IEEE 1364는 이제 IEEE 1800 - SystemVerilog의 일부입니다. 기본적으로 두 언어를 하나의 사양으로 병합했습니다. 그들은 1800이 1364에 더해지기 때문에이 작업을 수행했지만, 틈이있었습니다. 하나의 명세에 넣으면 구멍이없는 것을 쉽게 확인할 수 있습니다. –

답변

9

모든 - 나에게 유용한 배경 정보와 내 자신의 의견에 동조 할 할

시간.

첫 번째 - IEEE-1364.1-2002 Verilog RTL 합성 표준은 어떤 벤더도 결코 구현하지 못했기 때문에 누구도 표준을 업데이트하거나 SystemVerilog 버전의 합성 표준을 제공하지 않았습니다. 내 지식으로는 표준이 "대체"되지 않고 만료되었습니다. 필자는 표준에 설명 된 속성이 모든 공급 업체에 의해 완전히 구현 된 적이 없다는 것을 알고있었습니다. 표준에서 모든 벤더에 의해 구현되었다고 믿는 유일한 유용한 기능은 벤더가 사용자 코드를 읽기 전에 매크로 정의 문법을 설정해야한다는 것이 었습니다. 그래서 여러분은 이제`ifndef SYNTHESIS -`endif를 일반적인 대체 문으로 사용할 수 있습니다 공급 업체별 // synopsys의 경우 translate_on - // synopsys translate_off pragma-comments.

Verilog는 시뮬레이션 언어로 고안되었으며 결코 합성 언어로 의도되지 않았습니다. 1980 년대 후반, Synopsys는 엔지니어들이이 Verilog 시뮬레이션 언어를 정말 좋아했으며, (Synopsys)가 인식하고 합성을 통해 하드웨어로 변환 할 언어의 하위 집합을 정의하기 시작했습니다. 이제 이것을 RTL 합성 서브 세트라고 부르며, 합성 툴 벤더가 새로운 유형의 설명을 하드웨어로 변환하는 독창적이고 창조적 인 방법을 발견함에 따라 시간이 지남에 따라 그 서브 세트가 커질 수 있습니다.

실제로 "정의 된 Verilog 합성의 정확성"이 없습니다. Don Mills와 저는 1999 년에 "시뮬레이션 및 합성 불일치를 초래하는 RTL 코딩 스타일"이라는 제목의 논문을 작성하여 엔지니어에게 합성 하드웨어를 다른 동작으로 유추 할 수있는 합법적 인 Verilog 코딩 스타일에 대해 경고했습니다. http://www.sunburst-design.com/papers/CummingsSNUG1999SJ_SynthMismatch.pdf

합성 결과가 Verilog 시뮬레이션의 동작과 항상 일치하면 게이트 시뮬레이션을 실행할 필요가 없습니다. 디자인은 RTL 시뮬레이션과 같이 정확합니다. 보증 된 일치가 없기 때문에 엔지니어는 게이트 동작이 RTL 동작과 일치하는지 증명하기 위해 게이트 시뮬레이션을 실행하거나 사전 합성 RTL 코드가 합성 후 게이트 모델과 동일하다는 것을 수학적으로 증명하는 등가 검사 툴을 실행하려고합니다 그래서 gate-sims는 필요하지 않습니다.

보너스 질문은 Verilog 의미 체계가 정당한 경쟁 조건이라는 정의에도 불구하고 실제로 정의하기가 어렵습니다. 다른 결과와 시뮬레이션 및 합성

지금까지 같이 잘 정의 된 코드는, 고려 : 시뮬레이션에서

module code1c (output reg o, input a, b); 

    always 
    o = a & b; 
endmodule 

, 당신은 과거의 시간-0를 얻을 수 없다. 감도 목록이 없어 시뮬레이션이 계속 반복됩니다. 합성 툴은 조합 로직을 추론 할 때 민감도 목록을 고려조차하지 않으므로 합성 및 사후 시뮬레이션 간의 불일치를 유발할 수있는 감도 목록 항목이 누락되었다는 것에 대한 2 개 입력 및 게이트 및 경고가 표시됩니다. Verilog-2001에서는 이러한 일반적인 문제를 피하기 위해 항상 @ *를 추가했으며, SystemVerilog에 always_comb를 추가하여 민감도 목록을 제거하고 디자이너가 의도 한 논리를 합성 도구에 알립니다.

정확한 합성 동작에 대한 보장을 제공해야하는지에 관한 한, 내 논문에서 설명한 보증은 엔지니어가 여러 합성 도구를 사용한 경험을 토대로 합성 도구에서 기대할 수있는 것을 정의합니다.마지막 주, 이전 단락에서 언급 된 부분으로

"

이 는 커밍스 '추천 # 5에 위배됩니다. 할당을 차단하는 것은 비 블록 할당의 RHS을 계산하는 데 사용 될 수 있다고 말한다. "

정확합니다. 코딩 가이드 라인 # 5를 위반하며 제 생각에는 사용하지 않아야합니다. VHDL 변수가 다른 프로세스를 실행할 수 없기 때문에

코딩 가이드 라인 # 5 자주 VHDL 설계에 위반된다. VHDL 캠프가이 문제에 대해 균등하게 나뉘어졌습니다. 절반은 시뮬레이션 성능을 개선하기 위해 변수 할당하고 나머지 절반은 사용 변수를 사용하지 말아야하지만 다른 프로세스를 실행하는 데 최종 신호 할당과 변수 할당을 혼합 필요하다고 말한다.

코딩 가이드 라인 # 5을 위반하고 코드가 올 바르면 시뮬레이션이 작동하고 합성도 작동하지만 코드에 실수가있는 경우 코딩 가이드 라인을 위반하는 디자인을 디버깅하는 것은 매우 어렵습니다 조합 피스의 파형 표시가 의미가 없기 때문에 # 5. 하드웨어가 동작하고,이 파형의 디스플레이를 사용하여 이러한 설계를 디버깅 할 때 어려운 문제로 입증 된 방법을 실제 조합이 아닌 경우에만 업데이트 리셋 표명되지 않은 파형 디스플레이와 클럭 에지의 조합 논리 회로의 출력 (I 이 정보는이 논문에 포함되지 않았다.)

감사합니다 - 클리프 커밍스 - Verilog를 & SystemVerilog를 전문가

+0

상세한 답변과 .1 표준에 대한 설명에 많은 감사드립니다. – user1002059

1

실제 실리콘에서는 '블로킹'과 '블로킹 해제'의 차이가 없기 때문에 올바르게 합성 할 수 있다고 생각합니다.

합성은 앞에서 설명한대로 이것을 읽고 세 개의 플립 플롭을 연속적으로 연결합니다.

실제 게이트가 지연을 나타내므로 합성에서 문제가되지 않습니다 (플롭 홀드 시간을 위반하지 않는다고 가정). clk의 상승 에지에서 d 값을 q1으로 전파하기 위해 몇 ns가 소요됩니다. dq1으로 전파 될 때까지, 및 q3과 마찬가지로, q1이 이미 제 2 플롭에 의해 샘플링 될 것이다.

이것은 게이트 지연이 없기 때문에 시뮬레이션에서 작동하지 않는 이유입니다.시계의 포지티브 에지에서 q1d으로 즉각 대체 될 것이며, 아마도 q1이 두 번째 플롭에 의해 샘플링되기 전에 가능할 것입니다. 실제 회로에서 (적절한 셋업 및 홀드 시간으로), q1은 첫 번째 플롭이 출력 값을 변경하기 전에 클럭의 포지티브 에지에서 샘플링되도록 보장된다.

+0

많은 감사. 코드가 종종 "올바르게"합성 될 것이라는 점을 기쁘게 생각합니다. 그러나 그것은 보장과 동일하지 않습니다. 그것이 보장된다면, 나는 그것을 "올바르게"합성하지 않는 도구의 공급자에게 불평 할 수 있습니다. 사실, 나는 그들에게 "비참한 도구는 시뮬레이터와 똑같은 일을합니다. 나는 즉시 전액 환불을 원합니다"라고 소리 쳤습니다. 이제 명확하게, 거기에 뭔가 잘못된 것이 있습니다. 그러나 가장 좋은 논문은 그게 사물들이 어떻게 살아가고 있는지를 말하는 것 같습니다. – user1002059

0

나는이 3 세 알고 있지만, 누군가가 편집하려고 할 때 게시물은 그냥 플래그되었다. Cliff의 답변은 물론 포괄적이지만 실제로는 질문에 대한 답변이 아닙니다. 다른 대답은 틀린 것도 사실입니다.

내 질문 : 시뮬레이션 의미에 대한 참조가 아닌 경우 Verilog 합성의 정확도는 어떻게 정의됩니까?

당신은 물론, 맞아. (a) 결과 (출력) 가능한 타이밍/등의 문제에 대해 일부 허용을 적용한 후, 원래의 (입력)와 동일한 방법으로 시뮬레이션, 및/또는 (b) 합성기 출력 공식적 될 수 있는지의 합성은 "정확한"인 신디사이저 입력과 동등한 것으로 판명되었습니다.

는 합성 의미를 잘 정의하고 아니라 시뮬레이션을 의미

원칙적

정의,이 불가능할없는 가장 간단한 Verilog를 프로그램을 제공한다. 신디사이저 벤더는 잘 정의 된 시뮬레이션 의미론을 가진 코드를 기반으로 템플릿을 정의하려고했습니다. 그러나, Verilog를했다 (그리고있다) 제대로 정의하고 파이프 라인의 예와 같이 기이을 그래서 Nbas로는 처음, 언어에 존재하지 않았다. 그들에 대해 잊어 버리는 것이 가장 좋습니다.

실제로 누군가 날 모두 시뮬레이션 합성 아직 두 가지 결과를 생성 할 때뿐만 를 Verilog를 정의의 일부를 제공 할 수 있는가?

'잘 정의 된'('올바른'과 반대되는) 합성의 유일한 정의는 여러 공급 업체가 정확히 동일한 잘못된 결과를 산출한다는 것입니다. 이것은 거의있을 법하지 않습니다.클래식 비동기 재설정 비동기 설정 클럭 된 F/F를 닫을 것 같아요.

관련 문제