- •3.4. Язык описания аппартуры Verilog.
- •3.4.1. Общие сведения
- •3.4.2. Операторы
- •3.4.3. Числа в Verilog.
- •3.4.3.1. Целые числа (Integers)
- •3.4.3.2. Неопределенное и высокоимпедансное состояния (X and z values)
- •3.4.5. Регистры (Registers )
- •3.4.6. Векторы (Vectors )
- •3.4.7. Массивы (Arrays )
- •3.4.8. Регистровые файлы (Memories )
- •3.4.9. Элементы с третьим состоянием (Tri-state)
- •3.4.10. Арифметические операторы (Arithmetic operators )
- •3.4.11. Логические операторы (Logical Operators)
- •3.4.12. Операторы отношения (Relational Operators)
- •3.4.13. Операторы эквивалентности (Equality )
- •3.4.14. Поразрядные Операторы (Bitwise Operators )
- •3.4.16.Операторы сдвига (Shift Operator).
- •3.4.17. Конкатенация (объединение,Concatenation )
- •3.4.18. Повторение (Replication )
- •3.4.19. Системные директивы (System Tasks )
- •3.4.20. Контроль процесса моделирования (Monitoring a Simulation).
- •3.4.21. Окончание моделирования (Ending a simulation)
- •3.4.22. Проектирование комбинационных схем: пример проектирования мультиплексора 4 в 1.
- •3.4.22.1. Реализация на уровне логических вентилей (Gate Level Implementation)
- •3.4.22.2.Реализация мультиплексора с помощью логических операторов (Logic Statement Implementation)
- •3.4.22.3. Реализация с помощью оператора выбора (Case Statement Implementation )
- •3.4.22.4. Реализация с использованием условного оператора (Conditional Operator Implementation )
- •3.4.22.5. Тестовый модуль (The Stimulus Module )
- •3.4.24. Модули проекта (Design Blocks Modules)
- •3.4.25. Порты (Ports)
- •3.4.26. Правила соединения (Connection Rules )
- •3.4.28. Инициализация (Initial Block )
- •3.4.29. Конструкция always (Always Block )
- •3.4.30. Пример проектирования последовательностного устройства: двоичный счетчик
- •3.4.31. Временной контроль (Timing Control )
- •3.4.31.1. Задержки (Delay)
- •3.4.31.2. Событийный контроль (Event-Based control)
- •3.4.31.3. Защелкивание (Triggers )
- •3.4.32.2. Оператор выбора (case statement)
- •3.4.32.3.Оператор ветвления (conditional operator. )
- •3.4.33. Циклы (Looping Constructs)
- •3.4.33.1. Цикл While (While Loop )
- •3.4.33.2. Цикл For (For Loop )
- •3.4.33.3. Цикл Repeat (Repeat Loop )
- •3.4.33.4. Вечный цикл (Forever Loop )
- •3.4.34. Работа с файлами в Verilog
- •3.4.34.1. Открытие файла (Opening a file )
- •3.4.34.2. Запись в файл (Writing to a file )
- •3.4.34.3.Закрытие файла (Closing a file )
- •3.4.35. Инициализация регистровых файлов (памяти) (Initialising Memories )
- •3.4.36. Задание векторов входных сигналов для моделирования (Verilog Input Vectors )
3.4.33.3. Цикл Repeat (Repeat Loop )
Синтакс:
looping_statement::== repeat (conditional) statement
Цикл repeat выполняется конечное число раз, условие (conditional) можеит быть константой, переменной или сигналом, но обязательно быть целым числом. Ниже приведен пример циклаrepeat
module comply;
int count;
initial begin
count = 128;
repeat (count) begin
$display("%d seconds to comply", count);
count = count - 1;
end
end
endmodule
Note: The loop will execute 128 times regardless of whether the value of count changes after entry to the loop
3.4.33.4. Вечный цикл (Forever Loop )
Синтаксис:
forever statement
Цикл forever выполняется непрерывно, пока моделирование не будет остановлено командой $finish. Ниже приведен пример вечного цикла
reg clock;
initial begin
clock = 1'b0;
forever #5 clock = ~clock;
end
initial #2000 $finish;
3.4.34. Работа с файлами в Verilog
3.4.34.1. Открытие файла (Opening a file )
Ключевые слова: $open
Синтакс: <file_handle> = $fopen("<file_name");
В процессе моделирования в языке Verilog имеется возможность записывать результаты прогона в файл, что в дальнейшем позволяет провести его более подробный анализ
Ниже приведен пример открытия файлов нва запись
integer handleA, handleB;
// an integer has 32 bits so is perfect
// for this usage
initial begin
handleA = $fopen("myfile.out);
// handleA = 0000_0000_0000_0000_0000_0000_0000_0010
handleB = $fopen("anotherfile.out");
// handleB = 0000_0000_0000_0000_0000_0000_0000_0100
end
Когда файл открыт, его можно использовать для записи. Всего допустимо открыть не более 31 файла одновременно.
3.4.34.2. Запись в файл (Writing to a file )
Ключевые слова: $fdisplay, $fmonitor, $fwrite Синтакс:
$fdisplay(<file_handles>, --same as display--); $fmonitor(<file_handles>, --same as monitor--); $fwrite(<file_handles>, --same as write--);
Для записиможет быть открыто несколько файлов, ниже приведен пример записи числа 0000_0000_0000_0000_0000_0000_0000_0011 в файлы.
integer channelsA;
initial begin
channelsA = handleA | 1;
$fdisplay(channelsA, "Hello");
end
3.4.34.3.Закрытие файла (Closing a file )
Ключевое слово: $fclose
Синтакс: $fclose(handle);
Когда используется несколько файлов, то обычно файлы, которые уже не требуются закрывают для облегчения жизни несчастной операционной системе. Для этого и служит директива $fclose, после закрытия работа с данным файлом естественно невозможна.
3.4.35. Инициализация регистровых файлов (памяти) (Initialising Memories )
Ключевые слова: $readmemb, $readmemh
Синтакс:
$readmemb("<file_name>", <memory_name>");
$readmemb("<file_name>", <memory_name>, memory_start");
$readmemb("<file_name>", <memory_name>, memory_start, memory_finish");
Для инициализации регистровых файлов используется следующая конструкция. Содержимое регистрового файла храниться в файле с форматом, приведенном ниже, все адреса 16-ричные
@003
00000011
00000100
00000101
00000110
00000111
00001000
00001001
Для улучшения читаемости возможна и такая запись
@003
00000011
00000100
00000101
@006
00000110
00000111
@008
00001000
00001001
Пример инициализации памяти приведен ниже
module testmemory;
reg [7:0] memory [9:0];
integer index;
initial begin
$readmemb("mem.dat", memory);
for(index = 0; index < 10; index = index + 1)
$display("memory[%d] = %b", index[4:0], memory[index]);
end
endmodule // testmemory
Содержимое файла файла mem.data имеет вид
1000_0001
1000_0010
0000_0000
0000_0001
0000_0010
0000_0011
0000_0100
0000_0101
0000_0110
0000_0000