在 Verilog 中,preamble[i*8 +: 8] 是一种位选择(bit-select)语法,用于从向量中提取一段连续的位。具体解释如下:
语法解析
-
preamble[i*8 +: 8]表示:-
从向量
preamble中,起始位置为i*8,向后选取 8 位(即一个字节)。 -
+:表示从起始位置向高位方向选择(-:则表示向低位方向选择)。 -
等价于
preamble[i*8 +7 : i*8](但 Verilog 中直接写这种范围可能不合法,需用+:或-:)。
-
示例说明
假设 preamble 是一个 64 位向量(如以太网前导码的 7 字节 + 1 字节 SFD):
verilog
reg [63:0] preamble = 64'h55555555555555D5; // 7字节0x55 + 1字节0xD5
-
当
i=0时:-
preamble[0*8 +: 8]→preamble[7:0]→8'hD5(SFD 字节)。
-
-
当
i=1时:-
preamble[1*8 +: 8]→preamble[15:8]→8'h55(前导码的第 6 字节)。
-
-
依此类推,
i从 0 到 7 可遍历所有字节。
为什么用 +:?
-
动态索引支持:
-
允许起始位置是变量(如
i*8),而传统写法[a:b]中的a和b必须是常量。
-
-
代码简洁性:
-
比手动计算高低位更直观,尤其适用于循环中的字节/字提取。
-
对比其他写法
| 语法 | 含义 | 限制 |
|---|---|---|
preamble[i*8 +: 8] | 从 i*8 开始选 8 位(向高位) | 起始位可为变量 |
preamble[i*8 -: 8] | 从 i*8 开始选 8 位(向低位) | 需确保 i*8 ≥ 7 |
preamble[7:0] | 固定选择第 0-7 位 | 范围必须为常量 |
典型应用场景
在以太网帧发送模块中,常用此语法逐字节处理前导码:
verilog
for (i = 0; i < 8; i = i + 1) begin
tx_byte = preamble[i*8 +: 8]; // 依次发送每个字节
// ... 将 tx_byte 发送到物理层
end
注意事项
-
起始位范围:
-
需确保
i*8 + 7不超过preamble的位宽(否则越界)。
-
-
仿真与综合:
-
所有主流 Verilog 仿真器和综合工具(如 Vivado、Quartus)均支持此语法。
-
1万+

被折叠的 条评论
为什么被折叠?



