Unsized Numbers
Parte da seção Fundamentos do Journey de Verilog da Coddy. Lição 15 de 90.
Um número Unsized é um número escrito sem especificar quantos bits ele possui. Quando você escreve um número sem um prefixo de tamanho, o Verilog presume que ele tem 32 bits por padrão.
a = 'b1010; // Unsized: Verilog treats this as 32 bits
a = 32'b1010; // Igual ao acima, mas explícitoUnsized numbers usam apenas o formato e o valor: [format][value]
<strong>format</strong>: a base do número:bpara binary,dpara decimal,hpara hexadecimal ouopara octal<strong>value</strong>: o número propriamente dito (por exemplo,1010)
O apóstrofo ' ainda é necessário entre o formato e o valor, mas não há uma contagem de bits antes dele.
'b1010: binário de 32 bits 1010'd255: decimal de 32 bits 255'hFF: hexadecimal de 32 bits FF'b1: binário de 32 bits 1 (com 31 zeros à esquerda)
Exemplo de código:
reg [7:0] data;
initial begin
data = 1010; // Não dimensionado: valor de 32 bits (pode causar aviso)
data = 'd255; // Unsized: 32-bit decimal 255
data = 'hFF; // Não dimensionado: hex de 32 bits FF
endUnsized vs Sized
| Unsized | Sized | |
|---|---|---|
| Exemplo | 1010 ou 'd255 | 8'b1010 ou 8'd255 |
| Largura em bits | 32 bits (padrão) | explicit (conforme especificado) |
| Apóstrofo | Obrigatório com o formato | Obrigatório |
| Quando usar | Código simples de testbench | Atribuições de hardware |
Problema potencial
Números Unsized podem causar um comportamento inesperado quando atribuídos a registradores menores:
reg [3:0] small;
small = 'b1111; // 32-bit value, but fits in 4 bits (fine)
small = 'b10000; // valor de 32 bits, mas grande demais! (aviso)O segundo exemplo atribui um valor de 32 bits 10000 a um registrador de 4 bits. Somente os 4 bits inferiores são mantidos (0000), o que pode não ser o que você espera.
Quando Usar Números Unsized
Números Unsized são convenientes para:
- Números simples em testbenches
- Contadores de loop
- Instruções
$display
Para atribuições de hardware reais, use números com tamanho definido para ser explícito e evitar avisos.
Desafio
No código abaixo, alguns números não têm tamanho definido. Change-os para números com tamanho definido (8 bits) para evitar avisos.
O que fazer:
- Change
apara um número binary de 8 bits para 1010 - Change
bpara um número decimal de 8 bits para 255 - Change
cpara um número hex de 8 bits para FF
Experimente você mesmo
module unsized_challenge;
reg [7:0] a, b, c;
initial begin
a = 'b1010; // Change to sized (8-bit binary)
b = 'd255; // Altere para dimensionado (decimal de 8 bits)
c = 'hFF; // Change to sized (8-bit hex)
$display("a = %b", a);
$display("b = %b", b);
$display("c = %b", c);
$finish;
end
endmoduleEsta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.
Todas as lições de Fundamentos
1Introdução
O que é VerilogHardware vs. SoftwareSeu primeiro móduloComentáriosNíveis de abstração de projeto4Operators Part 1
Arithmetic OperatorsModulo OperatorComparison OperatorsRecap - Simple MathBitwise Operators7Assign And Gates
Continuous AssignmentAssign With OperatorsBuilt In Gate PrimitivesAND OR NOT GatesXOR XNOR GatesRecap - Logic Gate Circuit10Decision Making
If StatementIf - ElseRecap - Simple ComparatorCase StatementCasex And CasezRecap - ALU Design5Operators Part 2
Logical OperatorsReduction OperatorsShift OperatorsConcatenation OperatorConditional OperatorRecap - Operator Challenge3Number System
Binary RepresentationSized NumbersUnsized NumbersNegative NumbersSpecial Values X And ZRecap - Number Formats6Modules
Module StructureInput And Output PortsInout PortsModule InstantiationPort Mapping By NamePort Mapping By OrderRecap - Build A Module9Procedural Blocks
Always BlockInitial BlockSensitivity ListBlocking AssignmentNon Blocking AssignmentRecap - Always vs Initial15Traffic Light Controller
Defining The StatesState Machine LogicPratique por conta própria: Compilador de Verilog online