- 17.2.1 Открытие и закрытие файлов $fopen и $fclose
- 17.2.2 Задачи системы вывода файлов
- 17.2.3 Форматирование данных в строку $swrite
- 17.2.4 Чтение данных из файла
- 17.2.4.1 Чтение по одному символу $fgetc
- 17.2.4.2 Чтение строки $fgets
- 17.2.4.3 Чтение форматированных данных $fscanf и $sscanf
- 17.2.4.4 Чтение двоичных данных $fread
- 17.2.5 Позиционирование в файлах $ftell, $fseek, $rewind
- 17.2.6 Очистка выходного буфера $fflush
- 17.2.7 Статус ошибки ввода/вывода $ferror
- 17.2.8 Обнаружение EOF $feof
- 17.2.9 Загрузка данных памяти из файла $readmemb и $readmemh
- 17.2.10 Загрузка данных синхронизации из файла SDF $sdf_annotate
Системные задачи и функции для операций с файлами делятся на следующие категории:
- Функции и задачи, открывающие и закрывающие файлы
- Задачи, выводящие значения в файлы
- Задачи, выводящие значения в переменные
- Задачи и функции, которые считывают значения из файлов и загружают в переменные или память
17.2.1 Открытие и закрытие файлов $fopen и $fclose
Синтаксис системных задач $fopen и $fclose показан в Синтаксисе 17-4.
file_open_function ::=
multi_channel_descriptor = $fopen ( " file_name " ) ;
| fd = $fopen ( " file_name " , type ) ;
file_close_task ::=
$fclose ( multi_channel_descriptor ) ;
| $fclose ( fd ) ;
$fopen — это функция, которая открывает файл, указанный в качестве аргумента filename, и возвращает либо 32-битный многоканальный дескриптор, либо 32-битный дескриптор файла, что определяется отсутствием или наличием аргумента type.
filename — символьная строка или reg, содержащий символьную строку с именем открываемого файла.
type — символьная строка или reg, содержащий символьную строку одной из форм в таблице 17-7, которая указывает, как должен быть открыт файл. Если type опущен, файл открывается для записи, и возвращается многоканальный дескриптор mcd. Если type указан, файл открывается, как указано в значении типа, и возвращается дескриптор файла fd.
Аргумент | Описание |
---|---|
«r» или «rb» | Открыт для чтения |
«w» или «wb» | Усечение до нулевой длины или создание для записи |
«a» или «ab» | Добавить, открыть для записи в конце файла (EOF), или создать для записи |
«r+», «r+b» или «rb+». | Открыт для обновления (чтение и запись) |
«w+», «w+b» или «wb+». | Усечение или создание для обновления |
«a+», «a+b» или «ab+». | Добавить, открыть или создать для обновления в EOF |
Многоканальный дескриптор mcd — это 32-битный reg, в котором установлен один бит, указывающий, какой файл открыт. Младший бит (бит 0) mcd всегда ссылается на стандартный вывод. Вывод направляется на два или более файлов, открытых многоканальными дескрипторами, путем побитового OR- объединения их mcd и записи в результирующее значение.
Старший бит (бит 31) многоканального дескриптора зарезервирован и всегда должен быть очищен, что ограничивает реализацию не более чем 31 файлом, открытым для вывода через многоканальные дескрипторы.
Дескриптор файла fd — это 32-битное значение. Старший бит (бит 31) fd зарезервирован и всегда должен быть установлен. Это позволяет реализациям функций ввода и вывода файлов определить, как был открыт файл. Остальные биты содержат небольшое число, указывающее на то, какой файл открыт. Три дескриптора файлов открыты заранее. STDIN, STDOUT и STDERR, которые имеют значения 32’h8000_0000, 32’h8000_0001, и 32’h8000_0002, соответственно. STDIN предварительно открыт для чтения, а STDOUT и STDERR предварительно открываются для добавления.
В отличие от многоканальных дескрипторов, файловые дескрипторы не могут быть объединены с помощью побитового ИЛИ, чтобы направить вывод в несколько файлов. Вместо этого, файлы открываются через дескриптор файла для ввода, вывода и одновременно ввода и вывода, а также для операций добавления, на основе значения type, в соответствии с таблицей 17-7.
Если файл не может быть открыт (либо файл не существует и type указан «r», «rb», «r+», «r+b» или «rb+», либо права доступа не позволяют открыть файл по данному пути), для mcd или fd возвращается ноль. Приложения могут вызвать $ferror, чтобы определить причину последней ошибки (см. 17.2.7).
Буква «b» в приведенных выше типах существует для того, чтобы отличать двоичные файлы от текстовых. Многие системы (например, Unix) не делают различий между двоичными и текстовыми файлами, и в этих системах символ «b» игнорируется. Однако некоторые системы (например, машины под управлением Windows NT) выполняют сопоставление данных с определенными двоичными значениями, записанными в файлы и считанными из файлов, которые открыты для текстового доступа.
$fclose — это cистемная задача, которая закрывает файл, указанный fd, или закрывает файл(ы), указанный(ые) многоканальным дескриптором mcd. Дальнейший вывод в любой дескриптор(ы) файла, закрытый(ые) командой $fclose, или ввод из него(их) запрещен. Активный операции $fmonitor и/или $fstrobe над дескриптором файла или многоканальным дескриптором неявно отменяются операцией $fclose. Функция $fopen должна повторно использовать каналы, которые были закрыты.
ПРИМЕЧАНИЕ: Количество одновременно открытых каналов ввода и вывода зависит от операционной системы. Некоторые операционные системы не поддерживают открытие файлов для обновления.
17.2.2 Задачи системы вывода файлов
Синтаксис системных задач $display, $write, $monitor и $strobe показан в Синтаксисе 17-5.
file_output_tasks ::=
file_output_task_name ( multi_channel_descriptor [ , list_of_arguments ] ) ;
| file_output_task_name ( fd [ , list_of_arguments ] ) ;
file_output_task_name ::=
$fdisplay | $fdisplayb | $fdisplayh | $fdisplayo
| $fwrite | $fwriteb | $fwriteh | $fwriteo
| $fstrobe | $fstrobeb | $fstrobeh | $fstrobeo
| $fmonitor | $fmonitorb | $fmonitorh | $fmonitoro
Каждая из четырех задач форматированного отображения — $display, $write, $monitor и $strobe (см. 17.1) — имеет аналог, который пишет в определенные файлы, а не в стандартный вывод. Эти задачи — $fdisplay, $fwrite, $fmonitor и $fstrobe — принимают аргументы того же типа, что и задачи, на которых они основаны, за одним исключением. Первый аргумент должен быть либо многоканальным дескриптором, либо дескриптором файла, который указывает, куда направить вывод файла. Многоканальные дескрипторы подробно описаны в разделе 17.2.1. Многоканальный дескриптор — это либо переменная, либо результат выражения, имеющий форму 32-битного беззнакового целого значения.
Системные задачи $fstrobe и $fmonitor работают так же, как и их аналоги $strobe и $monitor, за исключением того, что они пишут в файлы, используя для управления многоканальный дескриптор. В отличие от $monitor, любое количество задачи $fmonitor могут быть настроены на одновременную активность. Однако не существует аналога $monitoron и $monitoroff. Задача $fclose используется для отмены активной задачи $fstrobe или $fmonitor. Например:
integer
messages, broadcast,
cpu_chann, alu_chann, mem_chann;
initial begin
cpu_chann = $fopen("cpu.dat");
if (cpu_chann == 0) $finish;
alu_chann = $fopen("alu.dat");
if (alu_chann == 0) $finish;
mem_chann = $fopen("mem.dat");
if (mem_chann == 0) $finish;
messages = cpu_chann | alu_chann | mem_chann;
// трансляция включает стандартный вывод
broadcast = 1 | messages;
end
$fdisplay( broadcast, "Сброс системы в момент времени %d", $time );
$fdisplay( messages, "Произошла ошибка на адресной шине", " в момент времени %d, address = %h", $time, address );
forever @(posedge clock)
$fdisplay( alu_chann, "acc= %h f=%h a=%h b=%h", acc, f, a, b );
17.2.3 Форматирование данных в строку $swrite
Синтаксис для семейства задач $swrite и системной задачи $sformat показан в Синтаксисе 17-6.
string_output_tasks ::=
string_output_task_name ( output_reg , list_of_arguments ) ;
string_output_task_name ::=
$swrite | $swriteb | $swriteh | $swriteo
variable_format_string_output_task ::=
$sformat ( output_reg , format_string , list_of_arguments ) ;
Семейство задач $swrite основано на семействе задач $fwrite и принимает те же типы аргументов, что и задачи, на которых оно основано, за одним исключением: Первым аргументом $swrite должна быть переменная reg, в которую должна быть записана результирующая строка, а не переменная, указывающая файл, в который должна быть записана результирующая строка.
Системная задача $sformat похожа на системную задачу $swrite, с одним существенным отличием.
В отличие от семейства системных задач вывода display и write, $sformat всегда интерпретирует свой второй аргумент, и только второй, как строку формата. Этот аргумент формата может быть статической строкой, такой как «data is %d», или может быть переменной reg, содержимое которой интерпретируется как строка формата. Никакие другие аргументы не интерпретируются как форматные строки. $sformat поддерживает все спецификаторы формата, поддерживаемые $display, как описано в разделе 17.1.1.2.
Оставшиеся аргументы $sformat обрабатываются с использованием любых спецификаторов формата в строке format_string, пока все такие спецификаторы формата не будут исчерпаны. Если для спецификаторов формата недостаточно аргументов или их слишком много, то приложение выдает предупреждение и продолжает выполнение. Приложение, если возможно, может статически определить несоответствие спецификаторов формата и количества аргументов и выдать сообщение об ошибке во время компиляции.
ПРИМЕЧАНИЕ — Если строка format_string является reg, ее значение может быть невозможно определить во время компиляции.
Переменная output_reg назначается с помощью правил назначения строк переменным, как указано в п. 5.2.3.
17.2.4 Чтение данных из файла
Файлы, открытые с помощью файловых дескрипторов, могут быть прочитаны только в том случае, если они были открыты с помощью type r или r+ значения. Дополнительные сведения об открытии файлов см. в разделе 17.2.1.
17.2.4.1 Чтение по одному символу $fgetc
Например:
c = $fgetc( fd );
Считывает байт из файла, указанного fd. Если при чтении из файла произошла ошибка, то c устанавливается в EOF (-1). Код определяет ширину reg больше 8 бит, чтобы возвращаемое значение $fgetc EOF (-1) можно было отличить от символьного кода 0xFF. Приложения могут вызывать $ferror для определения причины последней ошибки (см. 17.2.7).
code = $ungetc( c, fd );
Вставляет символ, указанный c, в буфер, указанный файловым дескриптором fd. Символ c будет возвращен следующим вызовом $fgetc на этом файловом дескрипторе. Сам файл остается неизменным. Если при вводе символа в файловый дескриптор произошла ошибка, то код устанавливается в EOF. В противном случае код устанавливается в ноль. Приложения могут вызвать $ferror для определения причины последней ошибки (см. 17.2.7).
ПРИМЕЧАНИЕ — особенности базовой реализации файлового ввода-вывода в хост-системе ограничивают количество символов, которые могут быть вытеснены обратно в поток. Такие операции, как $fseek, могут стереть все вытесненные символы.
17.2.4.2 Чтение строки $fgets
integer code;
code = $fgets( str, fd );
Читает символы из файла, указанного fd, в reg str до тех пор, пока str не будет заполнен, или пока не будет прочитан и передан в str символ новой строки, или пока не будет встречено условие EOF. Если длина str не равна целому числу байт, то старший неполный байт не используется для определения размера.
Если при чтении из файла произошла ошибка, то code устанавливается в ноль. В противном случае в code возвращается количество прочитанных символов. Приложения могут вызвать $ferror для определения причины последней ошибки (см. 17.2.7).
17.2.4.3 Чтение форматированных данных $fscanf и $sscanf
integer code ;
code = $fscanf ( fd, format, args );
code = $sscanf ( str, format, args );
$fscanf — системная функция, которая читает данные из файлов, указанных файловым дескриптором fd.
$sscanf — системная функция, которая считывает данные из строки reg.
Обе функции считывают символы, интерпретируют их в соответствии с форматом и сохраняют результаты. В качестве аргументов обе принимают управляющую строку, формат и набор аргументов, указывающих, куда поместить результаты. Если для формата недостаточно аргументов, поведение не определено. Если формат исчерпан, а аргументы остались, лишние аргументы игнорируются.
Если аргумент слишком мал, чтобы вместить преобразованный входной сигнал, то, как правило, передаются младшие значащие биты. Можно использовать аргументы любой длины, поддерживаемой Verilog. Однако если местом назначения является real или realtime, то передается значение +Inf (или -Inf). Формат может быть строковой константой или reg, содержащим строковую константу. Строка содержит спецификации преобразования, которые направляют преобразование входных данных в аргументы. Управляющая строка может содержать следующее:
1) Символы белого пространства (пробелы, табуляции, новые строки или форм-фиды), которые, за исключением одного случая, описанного ниже, приводят к считыванию ввода до следующего символа, не являющегося пробелом. Для $sscanf нулевые символы также считаются пробелами.
2) Обычный символ (не %), который должен совпадать со следующим символом входного потока.
3) Спецификации преобразования, состоящие из символа %, необязательного символа подавления присваивания *, строки десятичных цифр, задающей необязательную числовую максимальную ширину поля, и кода преобразования.
Спецификация преобразования направляет преобразование следующего поля ввода. Результат помещается в переменную, указанную в соответствующем аргументе, если только запрет присваивания не был обозначен символом *. В этом случае аргумент не указывается.
Подавление присваивания обеспечивает способ описания поля ввода, которое должно быть пропущено. Поле ввода определяется как строка непробельных символов. Оно продолжается до следующего неподходящего символа или до исчерпания максимальной ширины поля, если она задана. Для всех дескрипторов, кроме символа c, белое пространство перед полем ввода игнорируется.
- % — В этот момент на входе ожидается один %. Присвоение не производится.
- b — Соответствует двоичному числу, состоящее из последовательности из набора 0,1,X,x,Z,z,?, и _.
- o — Соответствует восьмеричному числу, состоящее из последовательности символов из набора 0,1,2,3,4,5,6,7,X,x,Z,z,?, и _.
- d — Соответствует десятичному числу, состоящее из необязательного знака из набора + или -, за которым следует последовательность символов из набора 0,1,2,3,4,5,6,7,8,9, и _, или одиночное значение из набора x,X,z,Z,?
- h или x — Соответствует шестнадцатеричному числу, состоящее из последовательности символов из набора 0,1,2,3,4,5,6,7,8,9,a,A,b,B,c,C,d,D,e,E,f,F,x,X,z,Z,? и _.
- f, e или g — Соответствует числу с плавающей точкой. Формат числа с плавающей точкой — это необязательный знак (+ или -), за которым следует строка цифр из набора 0,1,2,3,4,5,6,7,8,9, опционально содержащая символ десятичной точки (.), за которой следует необязательная часть экспоненты, включая e или E, за которой следует необязательный знак, за которым следует строка цифр из набора 0,1,2,3,4,5,6,7,8,9.
- v — Соответствует чистому уровню сигнала, состоящему из последовательности трех символов, как указано в разделе 17.1.1.5. Это преобразование не является чрезвычайно полезным, так как значения силы действительно могут быть полностью присвоены только сетям, а $fscanf может присваивать значения только reg (если значения присвоены reg, они преобразуются в эквивалент 4).
- t — Соответствует числу с плавающей точкой. Формат числа с плавающей точкой — это необязательный знак (+ или -), за которым следует строка цифр из набора 0,1,2,3,4,5,6,7,8,9, опционально содержащая символ десятичной точки (.), за которой следует необязательная экспоненциальная часть, включающая e или E, за которой следует необязательный знак, за которым следует строка цифр из набора 0,1,2,3,4,5,6,7,8,9. Затем сопоставленное значение масштабируется и округляется в соответствии с текущей шкалой времени, заданной параметром $timeformat. Например, если шкала времени `timescale 1ns/100ps, а формат времени $timeformat(-3,2,» ms»,10);, то значение, считанное с помощью функции $sscanf(«10.345», «%t», t) вернет 10350000.0.
- c — Соответствует одному символу, возврающее 8-битное значение ASCII.
- s — Соответствует строке, которая представляет собой последовательность символов, не являющихся пробелами.
- u — Соответствует неформатированным (двоичным) данным. Приложение должно передать достаточное количество данных из входных данных для заполнения целевого reg. Обычно данные получаются из совпадающей $fwrite(«%u»,data) или из внешнего приложения, написанного на другом языке программирования, таком как C, Perl или FORTRAN. Приложение должно передать двоичные данные с двумя значениями из входного потока в reg назначения, расширив их до формата с четырьмя значениями. Эта управляющая последовательность может быть использована с любой из существующих задач системы ввода, хотя предпочтительнее использовать $fscanf. Поскольку входные данные не могут представлять x или z, невозможно получить x или z в результирующем reg. Этот спецификатор форматирования предназначен для поддержки передачи данных во внешние программы и из них, которые не имеют представления о x и z. Приложениям, требующим сохранения x и z, рекомендуется использовать спецификацию формата ввода-вывода %z. Данные должны быть считаны из файла в собственном формате endian базовой системы (т.е. в том же порядке endian, как если бы использовался PLI и системный вызов read(2) языка C). Для POSIX-приложений может потребоваться открыть файлы для неформатированного ввода-вывода со спецификаторами «rb», «rb+» или «r+b», чтобы системная реализация ввода-вывода не изменяла шаблоны в неформатированном потоке, соответствующие специальным символам.
- z — Спецификация форматирования %z (или %Z) определена для чтения данных без форматирования (двоичные значения). Приложение должно передать 4-х значное двоичное представление указанных данных из входного потока в конечный reg. Эта управляющая последовательность может быть использована с любой из существующих задач системы ввода, хотя предпочтительнее использовать $fscanf. Этот спецификатор форматирования предназначен для поддержки передачи данных во внешние программы и из них, которые распознают и поддерживают концепцию x и z. Приложениям, которые не требуют сохранения x и z, рекомендуется использовать спецификацию формата ввода-вывода %u. Данные должны быть прочитаны из файла в собственном формате endian базовой системы (т.е. в том же порядке endian, как если бы использовался PLI, данные были в структуре s_vpi_vecval (см. рисунок 27-8 в разделе 27.14(VPI)), а для чтения данных с диска использовался системный вызов read(2) языка C). Для POSIX-приложений может потребоваться открыть файлы для неформатированного ввода-вывода со спецификаторами «rb», «rb+» или «r+b», чтобы системная реализация ввода-вывода не изменяла шаблоны в неформатированном потоке, соответствующие специальным символам.
- m — Возвращает текущий иерархический путь в виде строки. Не считывает данные из входного файла или аргумента str.
Если после % следует недопустимый символ преобразования, результаты операции зависят от реализации.
Если строка формата или аргумент str в $sscanf содержит неизвестные биты (x или z), то системная задача возвращает EOF.
Если во время ввода встречается EOF, преобразование завершается. Если EOF встречается до того, как были считаны все символы, соответствующие текущей директиве (кроме пробела, где это разрешено), выполнение текущей директивы завершается сбоем ввода. В противном случае, если выполнение текущей директивы не завершилось с ошибкой совпадения, выполнение следующей директивы (если она есть) завершается с ошибкой ввода.
Если преобразование завершается на противоречивом входном символе, то противоречивый входной символ остается непрочитанным во входном потоке. Пробел в конце строки (включая символы новой строки) остается непрочитанным, если он не сопоставлен с директивой. Успех буквальных совпадений и подавленных присваиваний не может быть определен напрямую.
Число успешно сопоставленных и присвоенных элементов ввода возвращается в code. Это число может быть равно 0 в случае раннего сбоя сопоставления между входным символом и управляющей строкой. Если ввод заканчивается до первого сбоя сопоставления или преобразования, возвращается EOF. Приложения могут вызывать $ferror для определения причины последней ошибки (см. 17.2.7).
17.2.4.4 Чтение двоичных данных $fread
integer code ;
code = $fread( myreg, fd);
code = $fread( mem, fd);
code = $fread( mem, fd, start);
code = $fread( mem, fd, start, count);
code = $fread( mem, fd, , count);
Считывает двоичные данные из файла, указанного fd, в reg myreg или память mem.
start — необязательный аргумент. Если он присутствует, то start используется как адрес первого элемента в загружаемой памяти. Если он отсутствует, то будет использована самая нижняя нумерованная ячейка памяти.
count — необязательный аргумент. Если он присутствует, то count — это максимальное количество мест в памяти, которые будут загружены. Если count не указан, память будет заполнена теми данными, которые доступны.
start и count игнорируются, если $fread загружает reg.
Если в системном задании не указана информация об адресации, а в файле данных нет спецификаций адресов, то начальным адресом по умолчанию является наименьший адрес, указанный в объявлении памяти. Последовательные слова загружаются по старшему адресу до тех пор, пока либо память не будет заполнена, либо файл данных не будет полностью прочитан. Если в задании указан начальный адрес без конечного адреса, то загрузка начинается с указанного начального адреса и продолжается до самого высокого адреса, указанного в объявлении памяти.
start — это адрес в памяти. Для start = 12 и памяти up[10:20], первые данные будут загружены по адресу up[12]. Для памяти down[20:10] первым загруженным местом будет down[12], затем down[13].
Данные в файле должны быть прочитаны побайтно для выполнения запроса. Память шириной 8 бит загружается с использованием 1 байта на слово памяти, а память шириной 9 бит загружается с использованием 2 байт на слово памяти. Данные считываются из файла в порядке big endian. Первый считанный байт используется для заполнения наиболее значимого места в элементе памяти. Если ширина памяти не делится на 8 (8, 16, 24, 32), то не все данные из файла загружаются в память из-за усечения.
Данные, загруженные из файла, воспринимаются как данные «2 значения». Установленный в данных бит интерпретируется как 1, а не установленный бит интерпретируется как 0. Невозможно прочитать значение x или z с помощью $fread.
Если при чтении из файла произошла ошибка, то код устанавливается в ноль. В противном случае в code возвращается количество прочитанных символов. Приложения могут вызвать $ferror для определения причины последней ошибки (см. 17.2.7).
ПРИМЕЧАНИЕ — Не существует «двоичного» режима и «ASCII» режима. Можно свободно перемежать двоичные и форматированные команды чтения из одного и того же файла.
17.2.5 Позиционирование в файлах $ftell, $fseek, $rewind
Например:
integer pos ;
pos = $ftell ( fd );
Возвращает в pos смещение от начала файла текущего байта файла fd, который должен быть прочитан или записан последующей операцией над этим дескриптором файла.
Это значение может быть использовано последующими вызовами $fseek для перепозиционирования файла в эту точку. Любая перестановка отменяет все операции $ungetc. Если произошла ошибка, возвращается EOF. Приложения могут вызвать $ferror для определения причины последней ошибки (см. 17.2.7).
code = $fseek ( fd, offset, operation );
code = $rewind ( fd );
Устанавливает позицию следующей операции ввода или вывода в файле, указанном fd. Новая позиция находится на знаковом расстоянии, смещенном на байт от начала, от текущей позиции или от конца файла, в соответствии со значением операции 0, 1 и 2, как показано ниже:
- 0 устанавливает позицию равной байту смещения
- 1 устанавливает положение на текущее местоположение плюс смещение
- 2 устанавливает позицию на EOF плюс смещение
$rewind эквивалентен $fseek (fd,0,0);
Перемещение текущей позиции файла с помощью $fseek или $rewind отменяет все операции $ungetc.
$fseek() — это системная функция, позволяет установить индикатор позиции файла за пределами конца существующих данных в файле. Если впоследствии данные будут записаны в эту точку, последующие чтения данных в пробеле будут возвращать ноль до тех пор, пока данные не будут действительно записаны в пробел. Сама по себе функция $fseek не увеличивает размер файла.
Когда файл открыт для добавления (то есть, когда тип «a» или «a+»), невозможно перезаписать информацию, уже находящуюся в файле. С помощью $fseek можно переместить указатель файла в любую позицию в файле, но когда вывод записывается в файл, текущий указатель файла не принимается во внимание. Весь вывод записывается в конец файла и заставляет переместить указатель файла в конец вывода.
Если при перепозиционировании файла произошла ошибка, то код устанавливается в -1. В противном случае код устанавливается в 0. Приложения могут вызвать $ferror, чтобы определить причину последней ошибки (см. 17.2.7).
17.2.6 Очистка выходного буфера $fflush
$fflush( mcd );
$fflush( fd );
$fflush();
Записывает любой буферизованный вывод в файл(ы), указанный(ые) mcd, в файл, указанный fd, или, если $fflush вызывается без аргументов, во все открытые файлы.
17.2.7 Статус ошибки ввода/вывода $ferror
integer errno;
errno = $ferror( fd, str );
Строковое описание типа ошибки, с которой столкнулась последняя операция ввода-вывода файла, записывается в строку str, ширина которой должна быть не менее 640 бит. Интегральное значение кода ошибки возвращается в errno. Если последняя операция не привела к ошибке, возвращаемое значение равно нулю, а reg str должен быть очищен.
17.2.8 Обнаружение EOF $feof
integer code;
code = $feof( fd );
Возвращает ненулевое значение, если ранее было обнаружено EOF при чтении входного файла fd. В противном случае возвращается ноль.
17.2.9 Загрузка данных памяти из файла $readmemb и $readmemh
Синтаксис системных задач $readmemb и $readmemh показан в Синтаксисе 17-7.
load_memory_tasks ::=
$readmemb ( " file_name " , memory_name [ , start_addr [ , finish_addr ] ] ) ;
| $readmemh ( " file_name " , memory_name [ , start_addr [ , finish_addr ] ] ) ;
Две системные задачи — $readmemb и $readmemh — считывают и загружают данные из указанного текстового файла в указанную память. Любая из этих задач может быть выполнена в любое время во время моделирования. Считываемый текстовый файл должен содержать только следующее:
- Белое пространство (пробелы, новые строки, табуляции и форм-фиды)
- Комментарии (допускаются оба типа комментариев)
- Двоичные или шестнадцатеричные числа
Числа не должны иметь ни указанной длины, ни базового формата. Для $readmemb каждое число должно быть двоичным. Для $readmemh числа должны быть шестнадцатеричными. Неизвестное значение (x или X), значение высокого импеданса (z или Z) и знак подчеркивания (_) могут быть использованы при указании числа, как в исходном описании Verilog HDL. Для разделения чисел следует использовать пробел и/или комментарии.
В последующем обсуждении термин адрес относится к индексу в массиве, который моделирует память.
По мере чтения файла каждое встреченное число присваивается последовательному элементу памяти в виде слова. Адресация контролируется как путем указания начального и/или конечного адресов в вызове системной задачи, так и путем указания адресов в файле данных.
Когда адреса появляются в файле данных, их формат представляет собой символ at (@), за которым следует шестнадцатеричное число, как показано ниже:
@hh…h
В номере допускаются как прописные, так и строчные цифры. Между символом @ и номером не допускается пробел. В файле данных можно использовать столько спецификаций адресов, сколько необходимо. Когда системная задача встречает спецификацию адреса, она загружает последующие данные, начиная с этого адреса памяти.
Если в системном задании не указана информация об адресации, а в файле данных нет спецификаций адресов, то начальным адресом по умолчанию будет наименьший адрес в памяти. Последовательные слова загружаются до тех пор, пока либо не будет достигнут самый высокий адрес в памяти, либо файл данных не будет полностью прочитан. Если адрес начала указан в задании без адреса окончания, то загрузка начинается с указанного адреса начала и продолжается вверх к самому высокому адресу в памяти. В обоих случаях загрузка должна продолжаться вверх даже после уточнения адреса в файле данных.
Если в качестве аргументов задания указаны начальный и конечный адреса, то загрузка начинается с начального адреса и продолжается до конечного адреса. Если начальный адрес больше конечного, то между последовательными загрузками адрес будет уменьшаться, а не увеличиваться. Загрузка должна продолжаться в этом направлении даже после уточнения адреса в файле данных.
Если информация об адресации указана как в системном задании, так и в файле данных, адреса в файле данных должны находиться в диапазоне адресов, указанных аргументами системного задания. В противном случае выдается сообщение об ошибке, и операция загрузки завершается.
Предупреждение выдается, если количество слов данных в файле отличается от количества слов в диапазоне, подразумеваемом адресами от начала до конца, и в файле данных нет спецификаций адресов.
reg [7:0] mem[1:256];
initial $readmemh("mem.data", mem);
initial $readmemh("mem.data", mem, 16);
initial $readmemh("mem.data", mem, 128, 1);
Первый оператор загружает память в момент времени моделирования 0, начиная с адреса памяти 1. Второй оператор начинает загрузку с адреса 16 и продолжает ее по адресу 256. В третьем и последнем операторе загрузка начинается с адреса 128 и продолжается вниз до 1.
В третьем случае, когда загрузка завершена, выполняется окончательная проверка, чтобы убедиться, что в файле содержится ровно 128 номеров. Если проверка не удалась, выдается предупреждающее сообщение.
17.2.10 Загрузка данных синхронизации из файла SDF $sdf_annotate
Синтаксис для системной задачи $sdf_annotate показан в Синтаксисе 17-8.
sdf_annotate_task ::=
$sdf_annotate ("sdf_file" [ , [ module_instance ] [ , [ "config_file" ]
[ , [ "log_file" ] [ , [ "mtm_spec" ]
[ , [ "scale_factors" ] [ , [ "scale_type" ] ] ] ] ] ] ] );
$sdf_annotate — это системная задача, которая считывает временные данные из файла SDF в указанную область проекта.
sdf_file Является символьной строкой или представляет собой reg, содержащий символьную строку с именем открываемого файла.
module_instance — необязательный аргумент, указывающий область видимости, в которой следует аннотировать информацию в SDF-файле. Аннотатор SDF использует уровень иерархии указанного экземпляра для выполнения аннотации. Разрешается использовать индексы массивов. Если module_instance не указан, аннотатор SDF использует модуль, содержащий вызов системной задачи $sdf_annotate, в качестве module_instance для аннотирования.
config_file Необязательный аргумент в виде символьной строки, содержащий имя файла конфигурации. Информация в этом файле может быть использована для обеспечения детального контроля над многими аспектами аннотации.
log_file необязательный аргумент символьной строки, задающий имя файла журнала, используемого при аннотировании SDF. Каждая отдельная аннотация временных данных из файла SDF приводит к записи в файле журнала.
mtm_spec Необязательный аргумент символьной строки, указывающий, какой член тройки min/ typ/max должен быть аннотирован. Легальные значения для этой строки описаны в таблице 17-8. Он переопределяет любые ключевые слова MTM_SPEC в конфигурационном файле.
Ключевое слово | Описание |
---|---|
MAXIMUM | Обозначает максимальное значение |
MINIMUM | Обозначает минимальное значение |
TOOL_CONTROL (по умолчанию) | Обозначает значение, выбранное симулятором |
TYPICAL | Обозначает типичное значение |
scale_factors — необязательный аргумент символьной строки, указывающий масштабные коэффициенты, которые будут использоваться при аннотировании временных значений. Например, «1.6:1.4:1.2» означает, что минимальные значения будут умножены на 1.6, типичные — на 1.4, а максимальные — на 1.2. Значения по умолчанию — 1.0:1.0:1.0. Аргумент scale_factors перекрывает все ключевые слова SCALE_FACTORS в конфигурационном файле.
scale_type — необязательный аргумент символьной строки, указывающий, как коэффициенты масштаба должны применяться к тройкам min/typ/max. Правильные значения для этой строки показаны в таблице 17-9. Она переопределяет любые ключевые слова SCALE_TYPE в конфигурационном файле.
Ключевое слово | Описание |
---|---|
FROM_MAXIMUM | Применяет масштабируемые коэффициенты к максимальному значению |
FROM_MINIMUM | Применяет масштабируемые коэффициенты к минимальному значению |
FROM_MTM (по умолчанию) | Применяет масштабируемые коэффициенты к значениям min/typ/max |
FROM_TYPICAL | Применяет масштабируемые коэффициенты к типичному значению |