Числа без заданного размера
Часть раздела Основы путешествия по Verilog на Coddy — урок 15 из 90.
Число Unsized — это число, записанное без указания количества bits. Когда вы пишете число без префикса размера, Verilog по умолчанию считает, что это 32 bits.
a = 'b1010; // Unsized: Verilog treats this as 32 bits
a = 32'b1010; // То же, что и выше, но явноUnsized числа используют только формат и значение: [format][value]
<strong>format</strong>— основание системы счисления:bдля binary,dдля decimal,hдля hexadecimal илиoдля octal<strong>value</strong>— само число (например,1010)
Апостроф ' все еще требуется между форматом и значением, но перед ним нет количества бит.
'b1010— 32-битное двоичное 1010'd255— 32-битное десятичное 255'hFF— 32-битное шестнадцатеричное FF'b1— 32-битное двоичное 1 (с 31 ведущим нулем)
Пример кода:
reg [7:0] data;
initial begin
data = 1010; // Без размера: 32-битное значение (может вызвать предупреждение)
data = 'd255; // Unsized: 32-bit decimal 255
data = 'hFF; // Без размера: 32-битный hex FF
endUnsized vs Sized
| Unsized | Sized | |
|---|---|---|
| Пример | 1010 или 'd255 | 8'b1010 или 8'd255 |
| Ширина в битах | 32 bits (по умолчанию) | Explicit (как указано) |
| Апостроф | Требуется с форматом | Требуется |
| Когда использовать | Простой код тестбенча | Присваивания в аппаратной части |
Потенциальная проблема
Числа Unsized могут cause неожиданное поведение при присваивании более коротким регистрам:
reg [3:0] small;
small = 'b1111; // 32-bit value, but fits in 4 bits (fine)
small = 'b10000; // 32-битное значение, но слишком большое! (предупреждение)Во втором примере 32-битное значение 10000 присваивается 4-битному регистру. Сохраняются только младшие 4 бита (0000), что может быть не тем, чего вы ожидаете.
Когда использовать unsized числа
Unsized числа удобны для:
- Простых чисел в тестбенчах
- Счетчиков циклов
- Инструкций
$display
Для реальных аппаратных присваиваний используйте sized числа, чтобы быть explicit и избежать предупреждений.
Задание
В приведенном ниже коде некоторые числа являются unsized. Измените их на sized числа (8 bits), чтобы избежать предупреждений.
Что нужно сделать:
- Измените
aна 8-bit binary число для 1010 - Измените
bна 8-bit decimal число для 255 - Измените
cна 8-bit hex число для FF
Попробуйте сами
module unsized_challenge;
reg [7:0] a, b, c;
initial begin
a = 'b1010; // Change to sized (8-bit binary)
b = 'd255; // Изменить на sized (8-битный десятичный)
c = 'hFF; // Change to sized (8-bit hex)
$display("a = %b", a);
$display("b = %b", b);
$display("c = %b", c);
$finish;
end
endmoduleВ этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Основы
1Введение
Что такое VerilogHardware против SoftwareУровни абстракции проектированияВаш первый модульКомментарии4Операторы. Часть 1
Арифметические операторыОператор остатка от деленияОператоры сравненияПовторение: простая математикаПобитовые операторы7Оператор Assign и логические вентили
Непрерывное присваиваниеAssign с операторамиВстроенные примитивы вентилейВентили AND, OR, NOTВентили XOR, XNORИтоги: Схемы на логических вентилях10Принятие решений
Оператор ifКонструкция if - elseПовторение: простой компараторОператор caseОператоры casex и casezПовторение: проектирование ALU5Операторы. Часть 2
Логические операторыОператоры редукцииОператоры сдвигаОператор конкатенацииУсловный операторПовторение — Испытание по операторам3Системы счисления
Двоичное представлениеЧисла с заданным размеромЧисла без заданного размераОтрицательные числаСпециальные значения X и ZИтоги — форматы чисел6Модули
Структура модуляВходные и выходные портыПорты InoutИнстанцирование модуляПодключение портов по имениПодключение портов по порядкуИтоги: создание модуля9Процедурные блоки
Блок alwaysБлок initialСписок чувствительностиБлокирующее присваиваниеНеблокирующее присваиваниеИтоги: always против initial