VHDL to Verilog

David Belohrad david na belohrad.ch
Pondělí Duben 19 10:46:08 CEST 2021


Ja uz jsem dlouho z VHDL pryc (systemverilog zvitezil), ale myslim, ze
ve vhdl existovala nejaka konverzni funkce (to_stdlogicvector?) ktera
brala jako parametr bit vector.

Rozdil mezi vhdl a verilog kompilatory je jako 'funkcni implementace
pascal kompilatoru' a 'nefunkcni implementace c kompilatoru'. Verilog ma
spoustu 'design flaws'. Jeden hlavni je, ze narozdil od VHDL v nem
neexistuje delta-time pri simulaci. Takze v zavislosti na tom, v jakem
poradi v souboru popisete obvod, muzete dojit k jinemu vysledku v
simulatoru. Proto bych doporucil zacinajicim, aby uplne preskocili
verilog a naucili se zrovna systemverilog. Ma obrovske mnozstvi
vyhod. Ta uplne minimalni je, ze nemusite badat, jestli musite pouzit
wire nebo reg. V SV proste pouzijete typ logic nebo bit. Dalsich vyhod
je hromada, namatkou

- SV vam dovoluje rici kompilatoru co presne chcete delat, napr ve
  verilogu existuje 'always' blok, ktery se muze vysyntetizovat bud jako
  asynchronni logika, nebo jako clockovana logika, v zavislosti na tom,
  co a jak do toho bloku napisete. SV Vam umozni rici kompilatoru, jestli
  chcete syntetizovat asynchronni nebo synchronni design tim, ze
  zadeklarujete 'always_comb' (kombinacni, async logika) nebo
  'always_ff' (synchronni logika). Ma to obrovskou vyhodu v tom, ze
  kompilator vam uz pri prekladu zahlasi chybu pokud pouzitete
  always_comb and pak popisete obvod, ktery je synchronni. Tech testu
  tam existuje spousta, napr 'unique case' , 'unique if'.


- dalsi obrovskou vyhodou je, ze SV ma v sobe jiz assert-based
  verifikaci. Vezmete treba modul, ve kterem chcete, aby pri 'startu
  integratoru' v nasledujicim hodinovem cyklu byl signal Busy_i
  aktivni. Pokud chcete toto chovani otestovat, musite napsat separatni
  testbench. V ABV (assertion based verification), ktery je soucasti SV,
  primo v kodu udelate nasledujici deklaraci (se kterou pracuje jenom
  simulator, synteza ji ignoruje):

   assert property (@(posedge ClkRs_ix.clk)
		    disable iff (ClkRs_ix.reset)
		    StartIntegration_o |=> Busy_i) else
     $error("Busy should go high when start integration");

  Co tohle dela: kdykoliv je nabezna hrana na hodinovem signalu
  ClkRs_ix.clk, a pri te nabezne hrane je signal 'StartIntegration_o' na
  logicke jednicce, potom v nasledujicim hodinovem cyklu musi byt signal
  Busy_i take logicka jednicka.

  Tady tento trivialni priklad se samozrejme da jednoduse zakodovat v
  testbenchi. Tak ten pripad rozsirme, rekneme, ze potrebujeme, aby v
  okamziku kdy prijde StartIntegration_o, aby Busy_i bylo zvednuto z
  nuly na log. jednicku, ale ze to muze nejaky cas trvat, maximalne
  rekneme do 100 hodinovych cyklu. Tohleto uz da
  v testbenchi otestovat docela praci. V ABV staci jenom trochu pozmenit ten assert:

   assert property (@(posedge ClkRs_ix.clk)
		    disable iff (ClkRs_ix.reset)
		    StartIntegration_o |-> ~Busy_i #[0:100] Busy_i) else
     $error("Busy should go high when start integration");

  Myslim, ze si dokazete predstavit jak mocny nastroj tohle je (dokaze
  treba zkontrolovat, jestli Vas stavovy automat spravne pouziva onehot
  encoding, pripadne jestli z FIFO vypadnou ty same data, co jste tam vlozil). 

Lide si casto mysli, ze systemverilog je pouze na verifikaci. NENI TO
VUBEC PRAVDA. SV klade velky duraz na verifikaci designu.
V SV MATE ALE SUBSET, KTERY JE BEZ PROBLEMU SYNTETIZOVATELNY.

Ja sam delam designy v SV a verifikaci take v SV za pouziti VUnit
(unit-testing).


Jaky je hlavni message tohoto postu? Zapomente na VHDL, zapomente na
verilog. Pokud se ucite nejaky HDL jazyk, ucte se zrovna systemverilog.


Jeste tady padl dotaz o kompilatorech - zdali je potreba kod
optimalizovat. Odpoved je ano-i-ne.

Pokud vyrabite design, kde Vam blikaji ledky, vsechno bezi na 25MHz (nebo i
100), neni v tom zadny problem. Obecne jsou kompilatory dost
dobre. Pokud ovsem zpracovavate obrovske mnozstvi dat, pouzivate DDR,
pouzivate matematicke vypocty (i treba stupidni scitani), filtraci, fft,
trigonometricke funkce, nebo pokud 
proste jenom chcete zpracovat data z nejakeho rychleho prevodniku
(500MSPS+), tak musite optimalizovat. Vysledek je pak to, ze prvni verzi
designu mate rychle hotovou, neprojde timing analyzou, a pak zacina
kolotoc uprav kodu tak, aby design prosel timingem. Zvlastni pozornost je take
potreba venovat tzv clock-domain-crossing - vygenerujete signal v jedne
hodinove domene a zpracovavate jej v jine (napr fazove posunute, nebo
uplne asynchronni).





Jaroslav Buchta <jaroslav.buchta na hascomp.cz> writes:

> Dik za info, asi nejrozumnejsi reseni bude nahradit vsude typ bit za 
> std_logic, to jede dle predpokladu
> Ale jak zkonvertovat bit na std_logic, na to jsem teda neprisel, 
> To_Std_Logic nejde std_logic(led1) hodi chybu, ze nelze zkonvertovat nit 
> na std_logic... No zustanu u verilogu, zrovna, kdyz se mi to zacalo 
> libit... :D
>
> Dne 19.04.2021 v 8:02 balu napsal(a):
>> bit a std_logic su rozne typy. Pri priradovani je zrejme nutne urobit 
>> konverziu. Alebo este lepsie, ak nie je explicitny dovod pouzit bit, 
>> treba pouzivat signaly len rovnakeho typu (napr. std_logic a 
>> std_logic_vector). Pravdepodobne nieco ako To_Std_Logic(), nikdy som 
>> to osobne nepouzil.
>>
>> Tu je potom uzitocny diagram pre vektory 
>> https://www.doulos.com/knowhow/vhdl/vhdl-vector-arithmetic-using-numeric_std/
>>
>>
>>
>> On 19/04/2021 07:33, Jaroslav Buchta wrote:
>>> Ja uz teda nevim, evidentne nejde priradit bit do std_logic_vector.
>>> Treba takhle to jde:
>>>
>>>     binout(7 downto 1) <= citac(3 downto 0) & 
>>> conv_std_logic_vector(states'pos(state), 3);
>>>     IF led1 = '1' THEN
>>>         binout(0 downto 0) <= "1";
>>>     ELSE
>>>         binout(0 downto 0) <= "0";
>>>     END IF;
>>>
>>> nebo takhle:
>>>     IF led1 = '1' THEN
>>>         binout(0) <= '1';
>>>     ELSE
>>>         binout(0) <= '0';
>>>     END IF;
>>> to celkem dava smysl, pole do pole nebo bit na jednu pozici
>>>
>>> takhle uz ne:
>>>     binout(0 downto 0) <= led1;
>>> Error (10476): VHDL error at nhk_15_buchta_v1.vhd(201): type of 
>>> identifier "led1" does not agree with its usage as "std_logic_vector" 
>>> type
>>> ani
>>>     binout(0) <= led1;
>>> Error (10476): VHDL error at nhk_15_buchta_v1.vhd(201): type of 
>>> identifier "led1" does not agree with its usage as "std_ulogic" type
>>>
>>> Tohle by vypadalo nadejne, to by slo asi i do spojeni  ale taky nejde
>>>     binout(0 downto 0) <= "1" when (led1 = '1') else "0";
>>> Error (10500): VHDL syntax error at nhk_15_buchta_v1.vhd(201) near 
>>> text "when";  expecting ";"
>>>
>>> Asi je problem v konverzi typu bit na neco kompatibilniho se 
>>> std_logic? Prece nemuze byt takovy problem pripojit nebo nastavit bit 
>>> do vektoru...
>>>
>>> Dne 18.04.2021 v 20:24 Zdeněk Aster napsal(a):
>>>>
>>>> & je skladani bitu musi sedet
>>>> out(7 downto 0) <= "00000" & citac(4) & citac(3) & citac(1);
>>>> A podminky jsou normalne and a or....
>>>>
>>>>  SIGNAL tmpcitac : std_logic_vector(3 downto 0);
>>>>
>>>> tmpcitact  <= citac(3) & citac(2) & citac(1);
>>>>
>>>> led8 <= '1' when (tmpcitac=7 ) else '0';
>>>> led7 <= '1' when (tmpcitac=86) else '0';
>>>> ...
>>>> ...
>>>> nebo pokud je to "pole" bitu
>>>>
>>>> led(7) <= '1' when (tmpcitac=7 ) else '0';
>>>> led(6) <= '1' when (tmpcitac=6 ) else '0';
>>>> ...
>>>>
>>>>
>>>> Třeba, já teda nevím přesně o co jde a jestli to má být v nějakých 
>>>> hodinách. VHDL jsem dlouho neviděl,
>>>> ale psal jsem v tom celkem dost....
>>>> Mě přišel vždycky děsný VERILOG :-)
>>>>
>>>> Zdeněk Aster
>>>>
>>>> Dne 18.04.2021 v 18:35 Jaroslav Buchta napsal(a):
>>>>> To nema byt logicka operace, ale retezeni (spojovani) bitu, 
>>>>> nazyvaji ten operator concatenation, jak jsem pochopil, logicky :-D
>>>>> Jak se teda odlisi bitove a logicke and, or ... jsem jeste 
>>>>> nepochopil ale mam podezreni, ze nijak.
>>>>> Proste potrebuju naskladat za sebe 4+3+1 bit a zobrazit na osmi 
>>>>> ledkach...
>>>>>
>>>>> Dne 18.04.2021 v 18:26 Jindroush napsal(a):
>>>>>> A vy chcete 'and' nebo '&'?
>>>>>>
>>>>>> On 18.04.2021 18:21, Jaroslav Buchta wrote:
>>>>>>> Tak se ucim VHDL, to musel vymyslet silenec ;-)
>>>>>>> Jedna vetsi nez normalni zahada...
>>>>>>>
>>>>>>> Mam signaly:
>>>>>>>
>>>>>>> binout                : OUT std_logic_vector(7 downto 0));
>>>>>>>
>>>>>>> SIGNAL citac : std_logic_vector(3 downto 0);
>>>>>>> TYPE states IS (S0, S1, S2, S3);
>>>>>>> SIGNAL state : states := S0;
>>>>>>>
>>>>>>> signal led1 : BIT;
>>>>>>>
>>>>>>> konstrukce
>>>>>>> binout <= citac & conv_std_logic_vector(states'pos(state), 3) & 
>>>>>>> led1;
>>>>>>> hodi chybu
>>>>>>> Error (10327): VHDL error at xxxx.vhd(200): can't determine 
>>>>>>> definition of operator ""&"" -- found 0 possible definitions
>>>>>>>
>>>>>>> po zmene
>>>>>>> binout <= citac & conv_std_logic_vector(states'pos(state), 3) & "1";
>>>>>>> probehne analyza i synteza OK.
>>>>>>>
>>>>>>> Blbe neco vidim, nebo v cem muze byt problem? uz zkousim vsechno 
>>>>>>> mozne asi hodinu, ty slozitejsi konverze asi problem nedelaji 
>>>>>>> kdyz to jde s konstantnim bitem??? 
>>>>>>
>>>>>
>>>>> _______________________________________________
>>>>> HW-list mailing list  -  sponsored by www.HW.cz
>>>>> Hw-list na list.hw.cz
>>>>> http://list.hw.cz/mailman/listinfo/hw-list
>>>>
>>>> _______________________________________________
>>>> HW-list mailing list  -  sponsored by www.HW.cz
>>>> Hw-list na list.hw.cz
>>>> http://list.hw.cz/mailman/listinfo/hw-list
>>>
>>>
>>> _______________________________________________
>>> HW-list mailing list  -  sponsored by www.HW.cz
>>> Hw-list na list.hw.cz
>>> http://list.hw.cz/mailman/listinfo/hw-list
>> _______________________________________________
>> HW-list mailing list  -  sponsored by www.HW.cz
>> Hw-list na list.hw.cz
>> http://list.hw.cz/mailman/listinfo/hw-list
>
>
> _______________________________________________
> HW-list mailing list  -  sponsored by www.HW.cz
> Hw-list na list.hw.cz
> http://list.hw.cz/mailman/listinfo/hw-list


Další informace o konferenci Hw-list