Verilog 数据输入的规范
在 Verilog 中,常量的表示和赋值遵循特定的格式和规范,主要用于定义数据的位宽、进制和数值。以下是 Verilog 常量表示的详细讲解,以及如何正确输入和处理数据。
Verilog 常量格式
Verilog 中的常量通常按照以下格式表示:
<位宽>'<进制符号><数值>
1. 位宽
- 定义常量的位数(位宽)。
- 是一个正整数,表示常量所占用的比特数。
- 例如:
1'b1
:1 位宽度,表示二进制的1
。8'd255
:8 位宽度,表示十进制的255
。
2. 进制符号
- 表示常量的进制类型,支持以下几种:
b
:二进制(binary)o
:八进制(octal)d
:十进制(decimal)h
:十六进制(hexadecimal)
3. 数值
- 指定的具体数值,必须符合前面定义的进制类型。
- 例如:
4'b1010
:表示 4 位宽的二进制值1010
。8'd255
:表示 8 位宽的十进制值255
。16'hFF
:表示 16 位宽的十六进制值FF
。
示例解析
以下是一些常见的常量写法及其含义:
-
二进制
4'b1010; // 表示 4 位宽的二进制数:1010 (十进制值 10)
-
十进制
8'd255; // 表示 8 位宽的十进制数:255 (二进制值 11111111)
-
十六进制
16'h1A3F; // 表示 16 位宽的十六进制数:1A3F (二进制值 0001101000111111)
-
八进制
3'o7; // 表示 3 位宽的八进制数:7 (二进制值 111)
特殊符号
-
高阻态 (
1'bz
):- 表示高阻态,常用于三态缓冲器。
- 例如:
reg [3:0] data; data = 4'bzzzz; // 设置高阻态
-
未知值 (
1'bx
):- 表示未知状态,常用于仿真或调试中。
- 例如:
reg [3:0] data; data = 4'bxxxx; // 设置未知状态
常见错误和注意事项
1. 位宽不匹配
如果常量的位宽和变量的位宽不匹配,会出现以下情况:
- 如果常量比变量宽,常量会被截断,保留低位。
- 如果常量比变量窄,常量会被自动填充(0 填充或符号扩展)。
示例:
reg [3:0] data; data = 8'b10101010; // 截断,只保留低 4 位:1010 data = 2'b01; // 自动填充高位:0001
2. 赋值符号
在 Verilog 的 时序逻辑 中,必须使用 非阻塞赋值 (<=
),而不是 阻塞赋值 (=
)。
示例:
always @(posedge clk) begin data <= 4'b1010; // 正确,非阻塞赋值 // data = 4'b1010; // 错误,阻塞赋值不适用于时序逻辑 end
3. 进制错误
常量的数值必须符合定义的进制范围,否则会报错。
示例:
4'b10102; // 错误,二进制数不能含有“2” 8'hGG; // 错误,十六进制数只能使用 0-F
宽度默认值
-
如果未指定位宽,Verilog 默认常量的位宽为 32 位。
- 示例:
reg [3:0] data; data = 10; // 自动解释为 32 位的十进制数,低 4 位为:1010
- 示例:
-
如果未指定进制,默认认为是十进制。