17.10. Ввод командной строки. 17.11. Математические функции

Содержание

17.10. Ввод командной строки.

Альтернативой чтению файла для получения информации для использования в симуляции является указание информации в команде вызова симулятора. Эта информация находится в форме необязательного аргумента, предоставляемого симулятору. Эти аргументы визуально отличаются от других аргументов симулятора тем, что начинаются с символа плюс (+).

Эти аргументы, называемые ниже plusargs, доступны через системные функции, описанные в разделе 17.10.1 и 17.10.2.

17.10.1. $test$plusargs (строка)

Системная функция $test$plusarg ищет в списке plusargs заданную пользователем plusarg_string. Строка указывается в аргументе системной функции как строка или вещественная переменная, которая интерпретируется как строка. Эта строка не должна включать ведущий знак плюс аргумента командной строки. Перебор plusargs, присутствующих в командной строке, выполняется в указанном порядке. Если префикс одного из предоставленных plusargs совпадает со всеми символами в предоставленной строке, функция возвращает ненулевое целое число. Если ни один plusargs из командной строки не соответствует предоставленной строке, функция возвращает целочисленное значение ноль.

Например:

Запустите симулятор с помощью команды: +HELLO

Код Verilog выглядит следующим образом:
initial begin if ($test$plusargs("HELLO")) $display("Hello argument found.") if ($test$plusargs("HE")) $display("The HE subset string is detected."); if ($test$plusargs("H")) $display("Argument starting with H found."); if ($test$plusargs("HELLO_HERE"))$display("Long argument."); if ($test$plusargs("HI")) $display("Simple greeting."); if ($test$plusargs("LO")) $display("Does not match."); end
Это приведет к следующему результату:
Hello argument found. The HE subset string is detected. Argument starting with H found.

17.10.2 $value$plusargs(user_string, variable)

Системная функция $value$plusarg ищет в списке plusargs (как и системная функция $test$plusargs) указанную пользователем строку plusarg_string. Строка указывается в первом аргументе системной функции как строка или вещественная переменная, которая интерпретируется как строка. Эта строка не должна включать ведущий знак плюс аргумента командной строки. Перебор plusargs, присутствующих в командной строке, выполняется в указанном порядке. Если префикс одного из предоставленных plusargs совпадает со всеми символами в предоставленной строке, функция возвращает ненулевое целое число, остаток строки преобразуется к типу, указанному в user_string, и полученное значение сохраняется в предоставленной переменной. Если подходящей строки не найдено, функция возвращает целочисленное значение ноль, а предоставленная переменная не модифицируется. Когда функция возвращает ноль (0), предупреждения не выдаются.

User_string должна иметь следующий вид: «plusarg_string format_string«. Строки формата(format_string) такие же, как и в системных задачах $display. Они единственные допустимые (допустимы прописные и строчные буквы, а также ведущие 0):

  1. %d — десятичное преобразование
  2. %o — восьмеричное преобразование
  3. %h — шестнадцатеричное преобразование
  4. %b — двоичное преобразование
  5. %e — реальное экспоненциальное преобразование
  6. %f — преобразование вещественных десятичных дробей
  7. %g — преобразование вещественных десятичных или экспоненциальных значений
  8. %s — строка (без преобразования)

Первая строка из списка plusargs, предоставленного симулятору, которая совпадает с частью plusarg_string указанной строки user_string, является строкой plusarg, доступной для преобразования. Оставшаяся строка совпадающего plusarg (остаток — это часть строки plusarg после части, совпадающей с plusarg_string пользователя) должна быть преобразована из строки в формат, указанный строкой format_string, и сохранена в указанной переменной. Если остаток строки отсутствует, значение, сохраненное в переменной, должно быть либо нулем, либо пустой строкой.

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

Verilog HDL:
`define STRING reg [1024 * 8:1] module goodtasks; `STRING str; integer int; reg [31:0] vect; real realvar; initial begin if ($value$plusargs("TEST=%d",int)) $display("value was %d",int); else $display("+TEST= not found"); #100 $finish; end endmodule module ieee1364_example; real frequency; reg [8*32:1] testname; reg [64*8:1] pstring; reg clk; initial begin if ($value$plusargs("TESTNAME=%s",testname)) begin $display(" TESTNAME= %s.",testname); $finish; end if (!($value$plusargs("FREQ+%0F",frequency))) frequency = 8.33333; // 166 MHz $display("frequency = %f",frequency); pstring = "TEST%d"; if ($value$plusargs(pstring, testname)) $display("Running test number %0d.",testname); end endmodule
и добавив в командную строку инструмента параметр plusarg
+TEST=5
приведет к следующему результату:
value was 5 frequency = 8.333330 Running text number x.
Добавление в командную строку инструмента параметра plusarg
+TESTNAME=bar
приведет к следующему результату:
+TEST= not found TESTNAME= bar.
Добавление в командную строку инструмента параметра plusarg
+FREQ+9.234
приведет к следующему результату:
+TEST= not found frequency = 8.333330 Running test number 23.

17.11. Математические функции

Существуют целочисленные и вещественные математические функции. Функции математической системы могут использоваться в константных выражениях, как указано в п. 5.

17.11.1 Целочисленные математические функции

Например:
integer result; result = $clog2(n);

$clog2 — системная функция, которая возвращает потолок логарифма по основанию 2 аргумента (логарифм, округленный до целого значения). Аргумент может быть целым числом или векторным значением произвольного размера. Аргумент рассматривается как беззнаковое значение, и значение аргумента, равное 0, дает результат 0.

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

17.11.2 Вещественные математические функции

Системные функции в таблице 17-18 должны принимать вещественные аргументы и возвращать реальный результат. Их поведение должно соответствовать эквивалентной функции стандартной математической библиотеки языка Си.

Таблица 17.18. Перекрестные списки вещественных математических функций из языка Verilog в язык C

Функция VerilogЭквивалентная функция CОписание
$ln(x)log(x)Натуральный логарифм
$log10(x)log10(x)Десятичный логарифм
$exp(x)exp(x)Экспонента в степени x
$sqrt(x)sqrt(x)Квадратный корень
$pow(x,y)pow(x,y)x**y
$floor(x)пол(x)Усечение дробной части
$ceil(x)ceil(x)Усечение дробной части с добавлением 1
$sin(x)sin(x)Синус
$cos(x)cos(x)Косинус
$tan(x)tan(x)Тангенс
$asin(x)asin(x)Арксинус
$acos(x)acos(x)Арккосинус
$atan(x)atan(x)Арктангенс
$atan2(x,y)atan2(x,y)Арктангенс x/y
$hypot(x,y)hypot(x,y)sqrt(xx+yy)
$sinh(x)sinh(x)Гиперболический синус
$cosh(x)кош(x)Гиперболический косинус
$tanh(x)tanh(x)Гиперболическая тангенс
$asinh(x)asinh(x)Гиперболический арксинус
$acosh(x)акош(x)Гиперболический арккосинус
$atanh(x)atanh(x)Гиперболическая Арктангенс