La síntesi d'alt nivell (HLS), de vegades anomenada síntesi C, síntesi a nivell de sistema electrònic (ESL), síntesi algorísmica o síntesi conductual, és un procés de disseny automatitzat que pren una especificació de comportament abstracta d'un sistema digital i troba una estructura de nivell de transferència de registre que realitza el comportament donat.[1][2][3]
La síntesi comença amb una especificació d'alt nivell del problema, on el comportament generalment es desacobla de la mecànica del circuit de baix nivell, com ara la temporització a nivell de rellotge. Els primers HLS van explorar una varietat de llenguatges d'especificació d'entrada, encara que les aplicacions comercials i de recerca recents accepten generalment subconjunts sintetitzables d'ANSI C/C++/SystemC/MATLAB. El codi s'analitza, es limita arquitectònicament i es programa per transcompilar des d'un model de nivell de transacció (TLM) a un disseny de nivell de transferència de registre (RTL) en un llenguatge de descripció de maquinari (HDL), que al seu torn es sintetitza habitualment al nivell de la porta mitjançant l'ús d'una eina de síntesi lògica.
L'objectiu d'HLS és permetre als dissenyadors de maquinari construir i verificar de manera eficient el maquinari, donant-los un millor control sobre l'optimització de la seva arquitectura de disseny i per la naturalesa de permetre al dissenyador descriure el disseny a un nivell d'abstracció més alt mentre l'eina fa la implementació de RTL. La verificació del RTL és una part important del procés.[4]
El maquinari es pot dissenyar a diferents nivells d'abstracció. Els nivells d'abstracció més utilitzats són el nivell de porta, el nivell de transferència de registre (RTL) i el nivell algorísmic.
Mentre que la síntesi lògica utilitza una descripció RTL del disseny, la síntesi d'alt nivell funciona a un nivell d'abstracció superior, començant amb una descripció algorítmica en un llenguatge d'alt nivell com SystemC i ANSI C/C++. El dissenyador normalment desenvolupa la funcionalitat del mòdul i el protocol d'interconnexió. Les eines de síntesi d'alt nivell gestionen la microarquitectura i transformen el codi funcional no cronometrat o parcialment en implementacions RTL totalment cronometrades, creant automàticament detalls cicle per cicle per a la implementació del maquinari.[5] Les implementacions (RTL) s'utilitzen directament en un flux de síntesi lògica convencional per crear una implementació a nivell de porta.
Els primers treballs acadèmics van extreure la programació, l'assignació i la vinculació com a passos bàsics per a la síntesi d'alt nivell. La planificació divideix l'algorisme en passos de control que s'utilitzen per definir els estats a la màquina d'estats finits. Cada pas de control conté una petita secció de l'algorisme que es pot realitzar en un sol cicle de rellotge al maquinari. L'assignació i l'enllaç mapeja les instruccions i les variables als components de maquinari, multiplexors, registres i cables de la ruta de dades.
La síntesi conductual de primera generació va ser introduïda per Synopsys el 1994 com Behavioral Compiler[6] i va utilitzar Verilog o VHDL com a llenguatges d'entrada. El nivell d'abstracció utilitzat va ser processos parcialment cronometrats. Les eines basades en el comportament Verilog o VHDL no es van adoptar àmpliament, en part perquè ni els llenguatges ni l'abstracció parcialment cronometrada eren ben adequades per modelar el comportament a un alt nivell. 10 anys més tard, a principis de 2004, Synopsys va acabar amb el Behavioral Compiler.[7]
El 1998, Forte Design Systems va presentar la seva eina Cynthesizer que utilitzava SystemC com a llenguatge d'entrada en comptes de Verilog o VHDL. Cynthesizer va ser adoptat per moltes empreses japoneses l'any 2000, ja que el Japó tenia una comunitat d'usuaris SystemC molt madura. La primera gravació de síntesi d'alt nivell es va aconseguir l'any 2001 per Sony mitjançant Cynthesizer. L'adopció als Estats Units va començar de debò el 2008.
L'any 2006, es va desenvolupar una tècnica eficient i escalable de "programació de mòduls SDC" sobre gràfics de control i flux de dades[8] i més tard es va estendre a la programació de pipelines.[9] Aquesta tècnica utilitza la formulació de programació lineal enter. Però mostra que la matriu de restriccions subjacent és totalment unimodular (després d'aproximar les restriccions de recursos). Així, el problema es pot resoldre en temps polinomial de manera òptima utilitzant un solucionador de programació lineal en temps polinomi. Aquest treball va ser inclòs a la FPGA i al Saló de la Fama de la Informàtica Reconfigurable 2022.[10]
L'algoritme de programació SDC es va implementar al sistema xPilot HLS[11] desenvolupat a UCLA,[12] i posteriorment es va llicenciar a AutoESL Design Technologies, una spin-off de UCLA. AutoESL va ser adquirit per Xilinx (ara part d'AMD) l'any 2011,[13] i l'eina HLS desenvolupada per AutoESL es va convertir en la base de les solucions Xilinx HLS, Vivado HLS i Vitis HLS, molt utilitzades per a dissenys FPGA.
Les entrades font més habituals per a la síntesi d'alt nivell es basen en llenguatges estàndard com ANSI C/C++, SystemC i MATLAB.
La síntesi d'alt nivell també inclou una especificació executable precisa com a entrada, ja que per obtenir una implementació de maquinari eficient, es necessita informació addicional sobre el que és un error quadrat mitjà acceptable o una taxa d'error de bits, etc. El refinament requereix informació addicional sobre el nivell de soroll de quantificació que es pot tolerar, els rangs d'entrada vàlids, etc. Aquesta especificació precisa en bits fa que l'especificació de la font de síntesi d'alt nivell sigui funcionalment completa. Normalment, les eines infereixen del codi d'alt nivell una màquina d'estats finits i una ruta de dades que implementen operacions aritmètiques.
El procés de síntesi d'alt nivell consta d'una sèrie d'activitats. Diverses eines de síntesi d'alt nivell realitzen aquestes activitats en diferents ordres utilitzant diferents algorismes. Algunes eines de síntesi d'alt nivell combinen algunes d'aquestes activitats o les realitzen de manera iterativa per convergir en la solució desitjada.[14]
En general, un algorisme es pot realitzar durant molts cicles de rellotge amb pocs recursos de maquinari, o durant menys cicles de rellotge utilitzant un nombre més gran d'ALU, registres i memòries. En conseqüència, a partir d'una descripció algorítmica, un compilador HLS pot generar una varietat de microarquitectures de maquinari segons les directrius donades a l'eina. Aquesta és la mateixa compensació de la velocitat d'execució per a la complexitat del maquinari que es veu quan un programa determinat s'executa en processadors convencionals de rendiment diferent, tot i que tots funcionen aproximadament a la mateixa freqüència de rellotge.