17.10. Ввод командной строки.
Альтернативой чтению файла для получения информации для использования в симуляции является указание информации в команде вызова симулятора. Эта информация находится в форме необязательного аргумента, предоставляемого симулятору. Эти аргументы визуально отличаются от других аргументов симулятора тем, что начинаются с символа плюс (+).
Эти аргументы, называемые ниже plusargs, доступны через системные функции, описанные в разделе 17.10.1 и 17.10.2.
17.10.1. $test$plusargs (строка)
Системная функция $test$plusarg ищет в списке plusargs заданную пользователем plusarg_string. Строка указывается в аргументе системной функции как строка или вещественная переменная, которая интерпретируется как строка. Эта строка не должна включать ведущий знак плюс аргумента командной строки. Перебор plusargs, присутствующих в командной строке, выполняется в указанном порядке. Если префикс одного из предоставленных plusargs совпадает со всеми символами в предоставленной строке, функция возвращает ненулевое целое число. Если ни один plusargs из командной строки не соответствует предоставленной строке, функция возвращает целочисленное значение ноль.
Например:
Запустите симулятор с помощью команды: +HELLO
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):
- %d — десятичное преобразование
- %o — восьмеричное преобразование
- %h — шестнадцатеричное преобразование
- %b — двоичное преобразование
- %e — реальное экспоненциальное преобразование
- %f — преобразование вещественных десятичных дробей
- %g — преобразование вещественных десятичных или экспоненциальных значений
- %s — строка (без преобразования)
Первая строка из списка plusargs, предоставленного симулятору, которая совпадает с частью plusarg_string указанной строки user_string, является строкой plusarg, доступной для преобразования. Оставшаяся строка совпадающего plusarg (остаток — это часть строки plusarg после части, совпадающей с plusarg_string пользователя) должна быть преобразована из строки в формат, указанный строкой format_string, и сохранена в указанной переменной. Если остаток строки отсутствует, значение, сохраненное в переменной, должно быть либо нулем, либо пустой строкой.
Если размер переменной больше, чем значение после преобразования, то сохраненное значение добавляется нулем до ширины переменной. Если переменная не может вместить значение после преобразования, значение усекается. Если значение отрицательное, то значение считается больше, чем предоставленная переменная. Если в строке, доступной для преобразования, имеются символы, которые являются недопустимыми для указанного преобразования, в переменную записывается значение ‘bx.
`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
+TEST=5
value was 5
frequency = 8.333330
Running text number x.
+TESTNAME=bar
+TEST= not found
TESTNAME= bar.
+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) | Гиперболическая Арктангенс |