Как перебрать все аргументы, переданные в задачу или функцию в SV? - PullRequest
0 голосов
/ 12 апреля 2019

Можно перебрать все аргументы, которые я передал системной задаче verilog или функции, такой как argv в c и @ARGV в Perl?Поскольку я понятия не имею, сколько аргументов будет передано.

test("name2", 1,2,3);    // might pass more argument than this
task test(string signal, int tog1, int tog2, int tog3);
        $display("The value are: %s, %d and %d", signal, tog1, tog3) ;    //any way to just iterate through this?

endtask

Ответы [ 2 ]

2 голосов
/ 12 апреля 2019

Прежде всего argv и @ARGV повторяют аргументы, передаваемые программе, а не функции. Verilog реализует аналогичную функциональность с plusargs. Другими словами, вы можете передавать аргументы, начинающиеся с +, и использовать plusargs функции для их поиска. Например, если вы называете изображение симуляции следующим образом:

%> simv +HELLO

во Врейлоге вы можете использовать что-то вроде следующего

initial begin
  if ($test$plusargs("HELLO")) $display("Hello argument found.");
  ...
end

Стандарт определяет 2 функции:

$test$plusargs ( string )
$value$plusargs ( user_string, variable )

Во-вторых, c не не позволяет вам просматривать аргументы функций, если только вы не используете varargs с variadic функциями. perl разрешает это, рассматривая аргументы как массив. verilog не не имеет какую-либо языковую функцию для этого.

Однако Verilog определяет набор pli функций для взаимодействия с c. Интерфейс vpi имеет функции, позволяющие просматривать аргументы задачи и функции (в «c»).

2 голосов
/ 12 апреля 2019

SystemVerilog не имеет этой функции. Задачи и аргументы вызова функции проверяются на соответствие прототипов при компиляции.

Две альтернативы, которые я могу придумать:

  1. Если все аргументы имеют одинаковый тип данных, как в вашем примере, вы можете сделать один аргумент, который является динамическим массивом. Вы можете запросить размер массива внутри функции.
  2. Вы можете объявить значения по умолчанию для аргумента, который вы не хотите передавать.

    тест задачи (строковый сигнал = "", int tog1 = -1, int tog2 = -1, int tog3 = -1); ... тест («name2», 1,2); / аргумент tog3 будет -1

...