std_logic czy std_ulogic?

24

Wydaje się, że świat zdecydował, że std_logic(i std_logic_vector) jest domyślnym sposobem reprezentowania bitów w VHDL. Alternatywą byłoby std_ulogic, która nie została rozwiązana.

Zaskakuje mnie to, ponieważ zwykle nie opisujesz autobusu , więc nie chcesz wielu kierowców i nie musisz rozpoznawać sygnału. Zaletą std_ulogicbyłoby to, że kompilator ostrzega cię wcześnie, jeśli masz wiele sterowników.

Pytanie: czy to tylko kwestia kulturowa / historyczna, czy też istnieją techniczne powody, aby używać std_logic?

Philippe
źródło
3
Świat jest w błędzie. Inteligentni inżynierowie używają std_ulogic, ponieważ ma poprawną semantykę.
wjl
@wjl Zinterpretuję to jako „kulturową / historyczną rzecz”. Twoja odpowiedź poniżej jest o wiele bardziej pomocna niż komentarz tutaj.
Philippe
Najpierw napisałem komentarz, a potem pomyślałem, że właściwsze byłoby pozostawienie odpowiedzi bardziej szczegółowej. Przepraszam, wydaje mi się, że brzmi to trochę nonszalancko. Ale mój komentarz jest dosłowny, ponieważ większość ludzi zaczyna od używania std_logic, ponieważ nauczyli się tego w ten sposób, a potem po pewnym czasie zaczynają zastanawiać się nad std_ulogic, szukają go, zdają sobie sprawę z jego semantyki, a następnie przechodzą na to. =)
wjl

Odpowiedzi:

16

Std_logic jest podtypem std_ulogic i ma dokładnie jedną dodatkową właściwość: jest rozwiązywane, jeśli istnieje wiele sterowników.

Niezależnie od powszechnej praktyki, std_ulogic jest poprawnym typem dla nierozdzielonych sygnałów, które wymagają logiki o wartości 9. (Często użycie „bitu” jest jeszcze bardziej poprawne - na przykład w niektórych architekturach FPGA, które nie mają czegoś takiego jak „X” lub „U”).

Zasadniczo najlepiej jest użyć odpowiedniego typu dla zadania. Często złe praktyki są propagowane przez ludzi, którzy tylko papugują styl, który widzą inni, nie rozumiejąc dlaczego.

wjl
źródło
8
Architektura może nie mieć litery „U”, ale często przydaje się symulacja tak, jakby to zrobiła, ponieważ można znaleźć nieprawidłowe inicjalizacje. +1 za „najlepszą rzeczą do zrobienia jest użycie prawidłowego typu do pracy”, ale zwykle uczymy się, gdy idziemy o to, co jest „najlepsze” :)
Martin Thompson
8

Moja historia jest następująca:

Zaczynałem (około 1999 IIRC) przez std_ulogic*cały czas - jak to jest właściwe, tylko z powodów, które opisujesz.

Następnie musiałem połączyć się z grupą wygenerowanych przez czarodzieja adresów IP dostawców, które były w std_logiccałym interfejsie. Co oznaczało konwersje w mapowaniu portów (dla _vectorelementów), więc byłem leniwy i przeszedłem do używania std_logic*.

Wydaje mi się jednak, że popełniam bardzo niewiele błędów „podwójnego kierowcy”, więc nie przegapiłem std_ulogictyle, ile bym pomyślał. A driverspolecenie Modelsim bardzo ułatwia ustalenie, kto kieruje pojazdem, gdy czasami muszę ...

Martin Thompson
źródło
Tak, rdzenie IP (a zwłaszcza rzeczy, które są automatycznie tłumaczone z Verilog) zwykle używają std_logic. Twoja odpowiedź wydaje się sugerować, że przyczyną jest głównie „kulturowa / historyczna”.
Philippe,
Nigdy nie musisz konwertować między std_logic i std_ulogic na portach. Czy chodziło Ci o konwersję między std_logic_vector i std_ulogic_vector?
wjl
@wjl: przepraszam, tak właśnie miałem na myśli. Zaktualizuję posta.
Martin Thompson
AFAIK, std_logic i std_ulogic są kompatybilne z przypisaniami, ponieważ mają ten sam typ podstawowy. Dlatego nie powinno być potrzeby ręcznej konwersji.
Val
@Val: tak powiedział wjl (i zgadzam się z tym) - ale *vectorczęści portu nadal wymagają konwersji
Martin Thompson
4

IIRC zaleca słynny Podręcznik Metodologii Reuse std_logic(_vector), więc być może grupy metodologiczne w firmach itp. Rozpowszechniają to dalej w postaci (obowiązkowych) przewodników kodowania. Osobiście +1 za użycie, std_ulogicjeśli to możliwe.

cmarqu
źródło