하드웨어 설명 언어 (Verilog, VHDL 등)의 모범 사례는 무엇입니까?

StackOverflow https://stackoverflow.com/questions/326880

  •  11-07-2019
  •  | 
  •  

문제

HDL 코드를 구현할 때 어떤 모범 사례를 관찰해야합니까?

보다 일반적인 소프트웨어 개발 분야와 비교할 때 공통점과 차이점은 무엇입니까?

도움이 되었습니까?

해결책

이 주제에 대한 가장 좋은 책은입니다 재사용 방법론 매뉴얼. VHDL과 Verilog를 모두 다룹니다.

특히 소프트웨어에서 정확히 일치하지 않는 일부 문제 :

  • 걸쇠가 없습니다
  • 리셋에주의하십시오
  • 내부 및 외부 타이밍을 확인하십시오
  • 합성 가능한 코드 만 사용하십시오
  • 모든 모듈의 출력을 등록하십시오
  • 차단 대 비 블로킹 할당에주의하십시오
  • 조합 논리에 대한 민감한 목록에주의하십시오 (또는 Verilog에서 @(*) 사용).

동일한 일부는 포함됩니다

  • CM 사용
  • 코드 리뷰가 있습니다
  • 코드를 테스트 (시뮬레이션)하십시오
  • 적절한 경우 코드를 재사용하십시오
  • 최신 일정이 있습니다
  • 사양 또는 사용 사례 또는 민첩한 고객이 있습니다.

다른 팁

일종의 오래된 실이지만 $ 0.02를 넣고 싶었습니다. 이것은 실제로 Verilog/VHDL에만 국한되지 않습니다. 일반적으로 하드웨어 설계에 대한 자세한 내용 ... 특히 맞춤형 ASIC를위한 합성 가능한 설계.

이것은 나의 의견 디자인에 대한 수년간의 산업 (학업과는 반대로)을 기반으로합니다. 그들은 특별한 순서가 아닙니다

내 우산 진술은 검증 실행을 위해 설계하는 것입니다. 하드웨어 설계에서 유효성 검사가 가장 중요합니다. 실제 실리콘에서 발견되면 버그가 훨씬 비쌉니다. 다시 컴파일 할 수는 없습니다. 따라서, 사전 실리콘은 훨씬 더 많은 초점을 맞 춥니 다.

  • 제어 경로와 데이터 경로의 차이점을 알고 있습니다. 이를 통해 훨씬 더 우아하고 유지 관리 가능한 코드를 만들 수 있습니다. 또한 게이트를 저장하고 X 전파를 최소화 할 수 있습니다. 예를 들어, 데이터 경로는 재 정착 가능한 플롭이 필요하지 않아야하며 제어 경로에는 항상 필요해야합니다.

  • 유효성 검사 전에 기능을 검증하십시오. 공식적인 접근 방식 또는 파형을 통해. 이것은 많은 장점이 있습니다. 나는 설명 할 것입니다. 먼저, 그것은 당신에게 시간을 낭비하는 시간을 절약 할 것입니다. 많은 애플리케이션 수준 설계 (학습 중 ESP) 및 대부분의 과정 작업과 달리 코드 변경의 전환 시간은 매우 큽니다 (복잡성에 따라 10 분에서 며칠 사이). 코드를 변경할 때마다 정교화, 보풀 확인, 컴파일, 파형 가져 오기 및 실제 시뮬레이션을 수행해야합니다. 몇 시간이 걸릴 수 있습니다. 둘째, 코너 케이스를 치기가 어려울 가능성이 훨씬 적습니다. 이는 실리콘 사전 검증과 관련이 있습니다. 이것들은 반드시 실리콘 이후에 닿을 것입니다. 기능을 입증하는 데 드는 최첨단 비용은 위험을 크게 최소화하고 노력의 가치가 있습니다. 이것은 때때로 최근 대학 졸업생들을 설득하기가 어렵습니다.

  • "치킨 비트"가 있습니다. 치킨 비트는 실리콘에서 기능을 비활성화하기 위해 드라이버를 통해 MMIO 세트의 비트입니다. 신뢰가 높지 않은 변화를 되돌리려는 것입니다 (신뢰는 검증 노력에 직접 비례합니다). 실리콘 이전의 가능한 모든 상태를 치는 것은 불가능합니다. 실리콘 이후에서 입증 될 때까지 디자인에 대한 자신감은 진정으로 충족 될 수 없습니다. 버그를 노출시키는 시간의 0.000005%에 도달 한 1 개의 상태 만 있더라도 실리콘 이후에 발생하지만 반드시 실리콘 이전에는 적합하지 않습니다.

  • 모든 비용으로 제어 경로의 예외를 피하십시오. 모든 새로운 예외는 검증 노력을 두 배로 늘립니다. 이것은 설명하기가 어렵습니다. 다른 블록이 사용할 메모리에 데이터를 저장하는 DMA 블록이 있다고 가정 해 봅시다. 저장된 데이터 구조가 일부 기능에 의존한다고 가정 해 봅시다. 저장된 데이터 구조가 다른 함수간에 다르도록 설계하기로 결정한 경우, 유효성 검사에 DMA 기능의 수를 곱한 것입니다. 이 규칙을 따르는 경우 저장된 데이터 구조는 컨텐츠 위치가 하드 코딩되는 모든 기능에 사용할 수있는 모든 데이터의 수퍼 세트가됩니다. DMA 저장 로직이 1 기능에 대해 검증되면 모든 함수에 대해 검증되었습니다.

  • 인터페이스를 최소화합니다 (제어 경로 최소화). 이것은 예외를 최소화하는 것과 관련이 있습니다. 첫째, 모든 새 인터페이스에는 검증이 필요합니다. 여기에는 TestBench의 새로운 Checkers/Trackers, Assertions, Coverage Points 및 버스 기능 모델이 포함됩니다. 둘째, 유효성 검사 노력을 기하 급수적으로 증가시킬 수 있습니다! 캐시에서 데이터를 읽기위한 1 개의 인터페이스가 있다고 가정 해 봅시다. 이제 (이상한 이유로) 메인 메모리를 읽기위한 다른 인터페이스를 원한다고 결정합니다. 당신은 당신의 검증 노력을 4 배로 늘 렸습니다. 이제 주어진 시간 에이 조합을 검증해야합니다. N:

    • 캐시 읽기가없고 메모리 읽기가 없습니다
    • 캐시 읽기가없고 메모리 읽기
    • 캐시 읽기, 메모리 읽기가 없습니다
    • 캐시 읽기, 메모리 읽기
  • 가정을 이해하고 전달합니다. 이것이 부족한 것은 블록이 커뮤니케이션 문제를 차단하는 주된 이유입니다. 완벽한 블록을 완전히 검증 할 수 있습니다. 그러나 모든 가정을 이해하지 못하면 블록이 연결될 때 블록이 실패합니다.

  • 잠재적 상태를 최소화하십시오. 디자인이 적거나 의도하지 않은 상태가 적을수록 검증에 필요한 노력이 줄어 듭니다. 같은 함수를 1 개의 최상위 기능 (시퀀서 및 중재자)으로 그룹화하는 것이 좋습니다. 이 높은 레벨 함수를 식별하고 정의하여 가능한 많은 작은 기능을 포괄 할 수 있도록하기가 매우 어렵지만, 그렇게하면 상태를 크게 제거하고 버그의 잠재력을 크게 제거합니다.

  • 항상 블록을 떠나는 강력한 신호를 제공하십시오. 대부분의 시간은 솔루션입니다. 엔드 포인트 블록이 무엇을할지 모르겠습니다. 완벽한 구현에 직접적인 영향을 줄 수있는 타이밍 문제를 해결할 수 있습니다.

  • 성능에 부정적인 영향을 미치지 않는 한 Mealy 유형 FSM을 피하십시오. Mealy FSM은 무어보다 타이밍 문제를 일으킬 가능성이 높습니다.

  • .. 그리고 마지막으로 내가 가장 싫어하는 것을 좋아한다. "파산하지 않았다면, 고치지 마십시오."와 관련된 위험과 버그 비용이 높기 때문에 해킹은 문제를 해결하는 데 더 실용적인 솔루션입니다. 다른 사람들은 기존 구성 요소의 활용을 언급함으로써이를 피했다.

더 많은 것과 비교할 때 전통적인 소프트웨어 디자인 :

  • 불연속 이벤트 중심 프로그래밍은 완전히 다른 패러다임입니다. 사람들은 Verilog Syntax를보고 "오, 그냥 C와 똑같이"라고 생각합니다. 그러나 이것은 진실에서 멀어 질 수는 없습니다. 구문은 비슷하지만 다르게 생각해야합니다. 예를 들어, 전통적인 디버거는 합성 가능한 RTL에서 거의 의미가 없습니다 (테스트 벤치 설계는 다릅니다). 종이의 파형은 사용 가능한 가장 좋은 도구입니다. 그러나 FSM 디자인은 때때로 절차 적 프로그래밍을 모방 할 수 있습니다. 소프트웨어 배경을 가진 사람들은 FSM에 미치는 경향이 있습니다 (처음에는 내가 한 것을 알고 있습니다).

  • System Verilog에는 많은 테스트 벤치 특정 기능이 많이 있습니다. 그것은 완전히 객체 지향적입니다. TestBench 디자인이 진행되는 한 기존 소프트웨어 설계와 매우 유사합니다. 그러나 시간과 관련된 1 차원이 더 있습니다. 레이스 조건 및 프로토콜 지연을 설명해야합니다

  • 검증과 관련하여, 그것은 또한 다르고 (그리고 동일). 3 가지 주요 접근 방식이 있습니다.

    • 공식 전파 검증 (FPV) : 논리를 통해 항상 작동한다는 것을 증명합니다.
    • 지시 된 무작위 테스트. 씨앗에 의해 정의 된대로 지연, 입력 값 및 기능을 무작위로 설정합니다. 지시 씨앗은 자신감이 적은 경로에 무게를 두는 것을 의미합니다. 이 접근법은 커버리지 지점을 사용하여 건강을 나타냅니다
    • 초점 테스트. 이것은 기존 소프트웨어 테스트와 유사합니다

... 완전성을 위해서는 최고의 테스트 벤치 설계 관행에 대해 논의해야합니다 ... 그러나 그것은 또 다른 날입니다.

길이에 대해 죄송합니다 .. 나는 "지대"에 있었다 :)

HDL은 Verilog와 VHDL이 실제로 스파게티 코드를 장려하는 것 같습니다. 대부분의 모듈은 어떤 순서로든 몇 가지 '항상'(Verilog) 또는 '프로세스'(VHDL) 블록으로 구성됩니다. 모듈의 전체 알고리즘 또는 기능은 종종 완전히 가려집니다. 코드의 작동 방식을 알아내는 것은 (글을 쓰지 않은 경우) 고통스러운 과정입니다.

몇 년 전에 나는 만났다 이 종이 이는 VHDL 디자인을위한보다 구조화 된 방법을 간략하게 설명합니다. 기본 아이디어는 각 모듈에 2 개의 프로세스 블록 만 있다는 것입니다. 하나는 조합 코드이고, 다른 하나는 동기식 (레지스터)을위한 것입니다. 읽을 수 있고 유지 관리 가능한 코드를 생성하는 데 좋습니다.

  • HDL에서 코드의 일부는 동시에 동시에 작동 할 수 있습니다. 예를 들어 두 줄의 코드가 "작동 할 수 있습니다"는 동시에 현명하게 사용하는 이점입니다. 이것은 라인 언어별로 익숙한 프로그래머가 처음에는 이해하기가 어려울 수있는 것입니다.

    • 귀하의 요구에 맞는 파이프 라인을 만들 수 있습니다.
    • 큰 모듈을 동시에 작동하게 할 수 있습니다.
    • 하나의 단위 대신 다른 데이터에 대해 반복적 인 조치를 취하는 대신 여러 장치를 만들고 작업을 병렬로 수행 할 수 있습니다.
  • 부팅 프로세스에 특별한주의를 기울여야합니다. 칩이 작동하면 큰 길을 만들었습니다.

하드웨어 디버깅은 일반적으로 소프트웨어 디버깅보다 훨씬 어렵습니다.

  • 간단한 코드가 선호되며, 때로는 코드가 이미 실행 된 후 (예 : 고속 칩 등) 코드 속도를 높이는 다른 방법이 있습니다.

  • 구성 요소간에 "스마트"프로토콜을 피하십시오.

  • 하드웨어는 디버깅하기가 어렵 기 때문에 HDL의 작동 코드는 다른 소프트웨어보다 소중합니다. 따라서 재사용 및 일부는 무료이며 다른 모듈의 "라이브러리"를 사용하는 것을 고려하십시오.

  • 설계는 HDL 코드의 버그뿐만 아니라 프로그래밍중인 칩의 고장과 칩과 인터페이스하는 다른 하드웨어 장치에서도 고장을 고려해야하므로 확인하기 쉬운 디자인에 대해 생각해야합니다.

일부 디버깅 팁 :

  • 디자인에 여러 빌딩 블록이 포함 된 경우 해당 블록 사이의 인터페이스에서 칩 외부의 테스트 포인트까지 라인을 만들고 싶을 것입니다.

  • 디자인에 충분한 라인을 저장하여 흥미로운 데이터를 외부 장치로 검사 할 수 있습니다. 또한이 줄과 코드를 현재 실행 상태를 알려주는 방법으로 코드를 사용할 수 있습니다. 예를 들어 어느 시점에서 데이터를 수신하는 경우 라인에 약간의 값을 작성하고, 이후 실행 단계에서 다른 값을 작성합니다. , 등'

    칩이 재구성 가능하면 특정 테스트를 조정하고 갈 때 각 테스트의 출력을 다시 프로그래밍 할 수 있으므로 더욱 편리해집니다 (LED와 잘 어울립니다 :). )

편집하다:

스마트 프로토콜에 의해, 나는 당신의 물리적 단위 중 두 개를 연결해야한다는 것을 의미하며, 가장 간단한 통신 프로토콜과 통신해야합니다. 즉, 그들 사이에 정교한 집에서 만든 프로토콜을 사용하지 마십시오.

그 이유는 이것이 FPGA/ASIC "Inside"내부 버그가 시뮬레이터가 있으므로 쉽게 쉽습니다. 따라서 데이터가 원하는대로 나오고 프로그램이 보낼 때 나오는 경우 하드웨어 유토피아에 도달했습니다. 소프트웨어 수준에서 작업 할 수있는 하드웨어에 도달했습니다. 그러나 귀하의 데이터가 당신에게 얻지 못하면, 원하는 방식으로, 왜 그런지 알아 내야합니다 ... 당신은 라인에 연결해야 할 것입니다. 그리고 그것은 그렇게 쉽지 않습니다.

라인에서 버그를 찾는 것은 특수 장비로 라인에 연결하고, 라인의 상태를 녹음하고, 다른 시간에 라인에 연결해야하며, 프로토콜에 따라 라인에 따라 선을 작용해야합니다.

물리적 단위 중 두 개를 연결 해야하는 경우 "프로토콜"을 가능한 한 간단하게 만듭니다. 시점까지 프로토콜이라고 불리지 않습니다. : 예를 들어 장치가 시계를 공유하는 경우 X 데이터 라인을 추가하십시오. 예를 들어, 한 단위가 그것과 다른 장치를 읽게하여 각 시계가 떨어지는마다 x 비트 사이에 x 비트가있는 하나의 "단어"를 전달하십시오. FPGA가있는 경우, 원래 시계 속도가 병렬 데이터에 비해 너무 빠른 경우 - 실험에 따라이 속도를 제어 할 수 있습니다. 한 장치에서 단어를 나누고 다른 하나를 다시 조립하지 않고도 더 낮은 시계 속도로 작업하고 동일한 성능을 얻을 수 있기 때문에 병렬 데이터 전송이 더 간단하다고 가정합니다. (각 단위가 수신하는 '시계'사이에는 지연이 없기를 바랍니다). 이것은 아마도 너무 복잡 할 것입니다 :)

SPI, I2C 등과 관련하여 '나는 그들 중 어느 것도 구현하지 않았으며, 같은 시계에서 실행되는 두 개의 FPGA 다리를 연결했다고 말할 수 있습니다 (중간에 저항의 정확한 형성을 기억하지 못함). FPGA가 서로 멀리 떨어져 있지 않으면 자신의 FPGA 사이에 데이터를 전달하는 주요 방법으로서 그 제품을 사용해야 할 충분한 이유를 생각할 수 없습니다. 이는 연쇄를 사용하는 한 가지 이유입니다. 평행 버스보다.

JTAG 일부 FPGA 회사에서 제품을 테스트/프로그램하는 데 사용하지만 고속으로 데이터를 전송하는 방법으로 사용되는지 확실하지 않으며 프로토콜입니다 ... ).

알려진 프로토콜을 구현 해야하는 경우, 찾거나 구입할 수있는 사전 제작 된 HDL 코드를 사용하는 것을 고려하십시오.

이것은 하드웨어 디자인을위한 JBDavid의 10 계명이 필요한 질문입니다.

  1. 소프트웨어와 마찬가지로 개정/버전 제어를 사용하십시오. SVN과 HG는 무료입니다.
  2. 체크인 전에 구문 확인을 통과하도록 코드가 필요합니다. 보풀 도구가 더 좋습니다.
  3. 설계 검증을 위해 풀 길이의 하드웨어 검증 언어를 사용하십시오. System-Verilog는 거의 안전한 선택입니다.
  4. 트랙 버그. Bugzilla와 Gnats는 무료 도구입니다. Fogbugz에는 약간의 $가 필요합니다.
  5. 어설 션을 사용하여 잘못 사용하는 문제를 해결하십시오.
  6. 커버리지 트라이어드는 안정적인 설계를 만듭니다. 시뮬레이션 및 공식 도구 모두에서 코드 적용 범위, 기능적 범위 및 어설 션 범위를 측정합니다.
  7. 힘은 왕입니다 : CPF 또는 UPF를 사용하여 파워 의도를 포착, 시행 및 확인하십시오.
  8. 실제 디자인은 종종 혼합 신호이며 혼합 신호 언어를 사용하여 디지털과 아날로그를 확인합니다. Verilog-Ams는 그러한 해결책 중 하나입니다. 그러나 배 밖으로 가지 마십시오. 실재 모델링은 혼합 신호 동작의 기능적 측면의 대부분을 달성 할 수 있습니다.
  9. 하드웨어 가속을 사용하여 실리콘으로 작동 해야하는 소프트웨어를 검증하십시오!
  10. HDL/HVL의 구문 인식 텍스트 편집기는 개발자 IDE의 최소 요구 사항입니다.

FPGAS의 경우 Xilinx가 있습니다 이 페이지. 거의 모든 것이 다른 FPGA 공급 업체에 적용되거나 동등한 규칙을 가질 것입니다. ASIC 디자인에는 큰 도움이됩니다.

인텔은 HDL 코딩 스타일 및 디자인 권장 사항 (PDF)을 권장했습니다.이 페이지에서.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top