词法记号

17 Mar 2025 | 6 分钟阅读

Verilog 中的词法约定与 C 编程语言相似。Verilog 语言源文本文件是词法标记流。

一个词法标记可以由一个或多个字符组成,并且每个字符都属于且仅属于一个标记。

标记可以是关键字、注释、数字、空白字符或字符串。所有行都应以分号 (;) 结尾。

  • Verilog HDL 是一种区分大小写的语言。
  • 所有关键字都使用小写。

White Space

空白字符可以包含制表符、空格、换行符和换页符。这些字符将被忽略,除非它们用于分隔其他标记。但是,字符串中的空格和制表符很重要。

注释

有两种表示注释的方式,例如:

  1. 单行注释以 // 标记开始,以回车符结束。
    例如,//这是单行语法。
  2. 多行注释以 /* 标记开始,以 */ 标记结束
    例如,/* 这是多行语法*/

数字

我们可以指定二进制、十进制、十六进制或八进制格式的常量数字。负数以 2 的补码形式表示。问号 (?) 字符是 Verilog 中 z 字符的替代形式,当用于数字时。下划线字符 (_) 在数字中的任何位置都合法,但它不能作为第一个字符。

1. 整数

Verilog HDL 允许将整数指定为:

  • 有大小或无大小的数字(无大小为 32 位)。
  • 以十进制、十六进制、二进制或八进制的基数。
  • 基数和十六进制数字 (a,b,c,d) 不区分大小写。
  • 基数、大小和值之间允许有空格。

语法

语法如下:

2. 实数

  • Verilog 支持实数常量和变量。
  • Verilog 通过四舍五入将实数转换为整数。
  • 实数不能包含 'A' 和 'X'。
  • 实数可以用十进制或科学记数法指定。
  • < 值 >.< 值 >
  • < 尾数 >E< 指数 >
  • 将实数分配给整数时,会四舍五入到最接近的整数。

3. 有符号数和无符号数

Verilog 支持这两种类型的数字,但有一些限制。在 C 语言 中,我们没有 int 和 unint 类型来表示一个数字是有符号整数还是无符号整数。

任何没有负号前缀的数字都是正数。或者间接的方式是“无符号”。

可以通过在常量数字的大小前加上负号来指定负数,从而成为有符号数。Verilog 在内部以 2 的补码格式表示负数。可以添加可选的有符号说明符来进行有符号算术。

4. 负数

通过在数字大小前加上负号 (-) 来指定负数。在 base_format 和 number 之间放置负号是非法的。

标识符

标识符是用于定义对象的名称,例如函数、模块或寄存器。标识符应以字母字符或下划线字符开头。

例如,A_Z 和 a_z。

标识符是字母、数字、下划线和 $ 字符的组合。它们最多可以长 1024 个字符。

  • 标识符必须以字母字符或下划线字符 (a-z A-Z_) 开头。
  • 标识符可以包含字母字符、数字字符、下划线和美元符号 (a-z A-Z 0-9 _ $)。
  • 标识符最多可以长 1024 个字符。

1. 转义标识符

Verilog HDL 允许通过转义标识符来使用任何字符作为标识符。

转义标识符包含标识符中的任何可打印 ASCII 字符。

  • 十进制值 33 到 126,或十六进制的 21 到 7E。
  • 转义标识符以反斜杠 (\) 开头。反斜杠转义整个标识符。
  • 转义标识符由空格字符(如逗号、括号和分号)终止,除非它们前面有空格,否则将成为转义标识符的一部分。
  • 用空格终止转义标识符。否则,标识符后面的字符将被视为标识符的一部分。

运算符

运算符是用于设置条件或操作变量的特殊字符。通常使用一个、两个,有时是三个字符来对变量执行操作。

1. 算术运算符

这些运算符执行算术运算。+ 和 - 可以用作一元 (x) 或二元 (z-y) 运算符。

算术运算中包含的运算符有加法、减法、乘法、除法和取模。

2. 关系运算符

这些运算符比较两个操作数,并返回一个单比特结果,1 或 0。关系运算中包含的运算符有:

  • == (等于)
  • != (不等于)
  • (大于)
  • >= (大于等于)
  • < (小于)
  • <= (小于等于)

3. 按位运算符

按位运算符对两个操作数进行逐位比较。按位运算中包含的运算符有:

  • & (按位与)
  • | (按位或)
  • ~ (按位非)
  • ^ (按位异或)
  • ~^ 或 ^~ (按位同或)

4. 逻辑运算符

逻辑运算符是按位运算符,仅用于单比特操作数。它们返回一个单比特值,0 或 1。它们可以处理整数或比特组、表达式,并将所有非零值视为 1。

逻辑运算符通常用于条件语句,因为它们可以与表达式一起使用。逻辑运算中包含的运算符有:

  • !(逻辑非)
  • &&(逻辑与)
  • || (逻辑或)

5. 约简运算符

约简运算符是按位运算符的一元形式,作用于操作数向量的所有比特。它们也返回一个单比特值。约简运算中包含的运算符有:

  • & (约简与)
  • | (约简或)
  • ~& (约简与非)
  • ~| (约简或非)
  • ^ (约简异或)
  • ~^ 或 ^~ (约简同或)

6. 移位运算符

移位运算符将第一个操作数按语法中指定的位数进行移位。

对于左移和右移,空位都用零填充(不使用符号扩展)。移位运算中包含的运算符有:

  • << (左移)
  • >> (右移)

7. 连接运算符

连接运算符将两个或多个操作数组合成一个更大的向量。连接运算中包含的运算符是:

  • { }(连接)

8. 重复运算符

重复运算符是创建项的多个副本。重复运算中使用的运算符是:

  • {n{item}} (项的 n 次重复)

9. 条件运算符

条件运算符会综合成一个多路复用器。它与 C/C++ 中使用的相同,并根据条件评估两个表达式中的一个。条件运算中使用的运算符是:

  • (条件) ?

操作数

操作数运算符对其进行操作或工作的表达式或值。所有表达式至少有一个操作数。

1. 字面量

字面量是 Verilog 表达式中使用的常量值操作数。Verilog 中常用的两个字面量是:

  • 字符串:字面量字符串操作数是一个由双引号 (“ ”) 包围的一维字符数组。
  • 数字:操作数的常量数字以二进制、八进制、十进制或十六进制数字指定。

2. 导线、寄存器和参数

导线 (Wires)、寄存器 (Regs) 和参数 (Parameters) 是用作 Verilog 表达式中操作数的数据类型。位选择 "x[2]" 和部分选择 "x[4:2]"

位选择部分选择用于使用方括号 "[ ]" 从导线、寄存器或参数向量中选择一个比特和多个比特。

3. 函数调用

在函数调用中,函数返回值直接在表达式中使用,而无需先将其分配给寄存器或导线。

它只是将函数调用作为一种操作数。了解函数调用返回值的比特宽度很有用。


下一主题ASIC 设计流程