Czy ktoś może mi powiedzieć, jaka jest różnica między RTL a kodem behawioralnym Verilog? Czy istnieje wyraźne rozgraniczenie wzorów na tych dwóch poziomach?
Czy ktoś może mi powiedzieć, jaka jest różnica między RTL a kodem behawioralnym Verilog? Czy istnieje wyraźne rozgraniczenie wzorów na tych dwóch poziomach?
Odpowiedzi:
Kod behawioralny ma wyższy poziom i zwykle nie można go zsyntetyzować. Konstrukcje takie jak pętle, opóźnienia i „początkowe” instrukcje są behawioralne.
Kod RTL ma niższy poziom i jest przeznaczony do syntezy. Definiuje obwód jako kombinację połączonych rejestrów i operacji wykonywanych na sygnałach między tymi rejestrami.
Zaczerpnięte z Yahoo Answers i natychmiast znalezione w Google!
Kod „poziomu transferu rejestru” to kod opisany w kategoriach rejestrów i logiki kombinatorycznej, który znajduje się między nimi i jest przeznaczony do wykorzystania jako dane wejściowe do narzędzia syntezy. Kod przylega do syntezowalnego podzbioru [1] języka. Nie ma wyraźnych opóźnień, wszystkie czasy odnoszą się do krawędzi zegara. Na ogół unika się struktur reprezentujących zatrzaski wyzwolone przez poziom. Rejestry są zwykle taktowane niewielką liczbą zegarów, których szczegóły można podać analizatorowi czasowemu. Zazwyczaj oczekuje się, że logika kombinatoryczna [2] ustabilizuje się w ciągu jednego cyklu zegarowego, co ogranicza jej złożoność. Jest wyższy niż model poziomu bramkowego, ale nadal określa, jaką wartość ma każdy rejestr w każdym cyklu zegara.
Kod „behawioralny” to na ogół kod opisujący zachowanie na wyższym poziomie do użycia w symulacji, ale nie jest przeznaczony do syntezowania. Może być wykorzystany do symulacji opisu środowiska otaczającego projekt. Można go wykorzystać jako wczesny etap projektowania, aby uzyskać ogólny projekt przed wyprzedzeniem szczegółowego projektu RTL poszczególnych modułów.
[1] Dokładny dozwolony podzbiór różni się w zależności od narzędzi do syntezy.
[2] Jeśli nie ustabilizuje się w ciągu jednego cyklu, symulacja i synteza mogą dawać inne wyniki, a analizator synchronizacji wykaże naruszenie, chyba że zostanie wyraźnie to zabronione.
Bardziej uogólniona definicja.
Kod behawioralny: Z definicji określa zachowanie elementu cyfrowego. Nie podaje informacji, w jaki sposób zostanie zaimplementowany do rzeczywistego sprzętu (synteza). Nie poda informacji, w jaki sposób zostaną wprowadzone rejestry i bramki w celu wykonania wymaganej operacji. Bardziej przypomina pisanie algorytmu lub FSM w C.
RTL: Jest to bardziej precyzyjna forma komponentu cyfrowego. Daje informacje, w jaki sposób kod zostanie zaimplementowany jako rzeczywisty sprzęt (po syntezie). Daje również informacje, w jaki sposób dane będą przesyłane między rejestrami a bramkami.
To ten sam język, ale używane są różne style. Dzięki doświadczeniu możesz je szybko rozdzielić, oto kilka cech każdego z nich:
Behawioralny kod Verilog ogólnie przypomina bardziej sekwencyjny program komputerowy działający od góry do dołu w initial begin
bloku. Może się okazać, że nie ma portów wejściowych / wyjściowych zdefiniowanych w modułach behawioralnych najwyższego poziomu, ponieważ dane wyjściowe mogą pochodzić z urządzeń symulacyjnych, takich jak konsola $display()
lub system plików z $open
lub dumper fali z $dumpfile
i $dumpvars
. Zwróć uwagę na opóźnienia między instrukcjami zaimplementowanymi przy użyciu długiego czasu symulacji #4000
i np. Wywołania zadań wishbone_master.checked_read(addr, value)
. Dla tych konstrukcji wyższego poziomu nie jest oczywiste, jaki byłby / mógłby być syntezator technologii.
Verilog do syntezy zawsze ma porty wejściowe / wyjściowe, ponieważ bez podłączonych portów moduł nie ma skutków ubocznych i można go wyeliminować [1]. Opóźnienia prawdopodobnie realizowane przez zliczanie cykli określonego zegara. Uwaga: niektóre funkcje systemu Verilog, np. $clog2(PARAMETER)
Mogą być dozwolone w kodzie do syntezy, więc obecność $function
nie jest gwarancją. Kod do syntezy zwykle zawiera wiele niezależnych „procesów”, z których każdy zawiera listę wrażliwości. Niektóre technologie umożliwiają initial begin
blokowanie inicjowania pamięci, więc nie jest to gwarancją.
Ostatecznie projektant zna cel kodu, który piszą i odpowiednio wywołuje go za pomocą zestawu narzędzi do syntezy lub w symulatorze.
[1] z wyjątkiem niektórych bloków IP, które mogą tworzyć tylne drzwi do wewnętrznych układów mikroprocesorów, np. JTAG