Jak utworzyć ciąg znaków z makra przed procesorem
Mam makro preprocesora, które reprezentuje hierarchiczną ścieżkę do mojego projektu.
Przykład:
`define HPATH top.chip.block
Muszę skonstruować łańcuch, który ma wartość `HPATH
, więc w moim przykładzie łańcuch powinien być równy top.chip.block
.
Czy istnieje sposób na skonstruowanie takiego ciągu?
Żadna z następujących prób nie powiodła się:
string hpath;
hpath = "`HPATH"; // Results in hpath = "`HPATH"
hpath = \"``HPATH\"; // Doesn't compile
hpath = `HPATH; // Doesn't compile
Chcę, aby hpath
było równoznaczne z wykonaniem tego zadania hpath = "top.chip.block"
, ale używając `HPATH
zamiast ponownie podać ścieżkę.
Nie mogę użyj %m
, ponieważ potrzebuję ciągu w moim środowisku uvm najwyższego poziomu, a nie w module.
Trochę więcej tła: powodem, dla którego chcę to zrobić, jest to, że używam tylnego dostępu do rejestru w bibliotece klas uvm. Backdoor API wymaga ustawienia hdl_path do bloków w projekcie, jako ciąg znaków. Mam już ' definiuje dla ścieżek hierarchicznych i staram się ponownie użyć tych przy określaniu hdl_paths więc nie mam tej samej ścieżki zdefiniowanej dwa razy. Mój test będzie używa zarówno ścieżki hierarchicznej, jak i ścieżki łańcuchowej.
3 answers
Nie jest możliwe użycie makra ' define wewnątrz literału łańcuchowego. Według SystemVerilog LRM:
Podstawienie makra i podstawienie argumentu nie mogą występować w literałach łańcuchowych.
Jednak literał Łańcuchowy może być skonstruowany za pomocą makra, które pobiera argument i włącza cudzysłowy w makrze za pomocą`"'.
Znowu z LRM:
An '"zastępuje zwykłe znaczenie leksykalne" i wskazuje, że rozszerzenie zawiera notowanie zaznaczanie, zastępowanie rzeczywistych argumentów i rozszerzanie wbudowanych makr. Dzięki temu literały ciągów mogą być zbudowany z argumentów makro.
Więc to działa:
`define STRINGIFY(x) `"x`"
`define HPATH top.chip.block
string hpath = `STRINGIFY(`HPATH);
$display(hpath); // Output: "top.chip.block"
Przykładowy kod można uruchomić tutaj: http://www.edaplayground.com/s/4/879
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-01-10 19:19:04
Myślę, że tego właśnie szukasz.
`define HPATH `"top.chip.block`"
string hpath = `HPATH;
Jak zauważył toolic, Sekwencja escape % m poda bieżącą hierarchię, gdy zostanie użyta w instrukcji $ display, więc może to być lepsza opcja.
Wiem, że to stary wątek, ale pomyślałem, że podzielę się naszym rozwiązaniem. Użycie $sformatf pozwala na dodanie dodatkowych informacji w razie potrzeby.
`define STRINGIFY(DEFINE) $sformatf("%0s", `"DEFINE`")
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-06-25 20:56:45