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.

Author: dwikle, 2013-03-13

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

 19
Author: dwikle,
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.

 1
Author: ,
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
2013-03-13 01:51:12

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`")
 0
Author: MBW,
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