第1章:词法结构——注释、标识符、关键字、运算符与字面量

各位同学,咱们今天聊聊RTLA语言的词法结构。说白了,就是这门语言最基础的“砖块”该怎么写。我刚开始接触RTLA时,觉得这些细节无所谓,能跑就行。后来被坑过几次,才明白——基础不牢,地动山摇。

核心要点:词法结构是编译器理解你代码的第一道门槛。写对了,编译一次过;写错了,报错信息能让你怀疑人生。

1.1 注释:// 和 /* */

注释这东西,我个人的习惯是:能写清楚就写清楚,但别废话连篇。RTLA支持两种注释风格:

  • 单行注释:用 //,从双斜杠到行尾都算注释
  • 多行注释:用 /* */,可以跨行,但不能嵌套
// 这是单行注释,我常用于解释某一行代码的作用
reg [7:0] counter;  // 8位计数器,注意这里不要写成9位

/*
  这是多行注释
  我一般在模块开头写一段功能说明
  比如:这个模块实现了AXI4-Lite到APB的桥接
*/
module uart_top (
  input clk,
  input rst_n
);

我的小技巧:调试时临时注释掉一大段代码,用 /* */ 很方便。但注意——多行注释里不能再有 /* */,否则编译器会报错。我曾经因为这个bug查了半小时。

1.2 标识符命名规则

标识符就是你给变量、模块、信号起的名字。RTLA的规则其实挺宽松的:

  • 只能包含字母(a-z, A-Z)、数字(0-9)、下划线(_)
  • 不能以数字开头
  • 区分大小写:dataData 是两个不同的标识符
  • 不能使用关键字(后面会讲)

嗯,这里要注意:下划线可以出现在开头,比如 _internal_signal。但我个人不建议这么干,因为有些工具会把下划线开头的信号当作内部变量,容易混淆。

// 合法的标识符
clk_50mhz
data_in_byte
fifo_depth_1024
_private_flag    // 合法,但不推荐

// 非法的标识符
2nd_stage       // 数字开头,不行
data-bus        // 短横线,不行
module          // 关键字,不行

避坑指南:我曾经在一个项目中用了 data_indata_in_ 两个信号,结果代码审查时被同事骂惨了。命名要清晰,别玩文字游戏。

1.3 关键字列表

关键字是语言保留的单词,你不能拿它们当标识符用。RTLA的关键字大概有30多个,我挑几个常用的列出来:

类别 关键字
模块声明 module, endmodule, input, output, inout
数据类型 reg, wire, logic, integer, real
控制流 if, else, case, endcase, for, while
赋值 assign, always, initial
其他 begin, end, posedge, negedge, default

你想想看,如果你给一个信号起名叫 module,编译器会直接报错。我记得有个新手同事把变量命名为 input,编译了三次都没过,最后发现是关键字冲突。

1.4 运算符与分隔符

运算符就是干活的工具。RTLA的运算符跟C语言很像,但有些细节不一样:

  • 算术运算符+, -, *, /, %
  • 位运算符&, |, ^, ~
  • 逻辑运算符&&, ||, !
  • 关系运算符>, <, >=, <=, ==, !=
  • 移位运算符<<, >>
  • 拼接运算符{ }

分隔符包括:;(语句结束)、,(参数分隔)、( )(表达式分组)、[ ](位选择)。

// 运算符示例
wire [3:0] a = 4'b1010;
wire [3:0] b = 4'b1100;

wire [3:0] and_result = a & b;   // 位与:1010 & 1100 = 1000
wire [3:0] or_result  = a | b;   // 位或:1010 | 1100 = 1110
wire [7:0] concat     = {a, b};  // 拼接:10101100

注意:逻辑运算符 && 和位运算符 & 很容易搞混。逻辑与返回的是布尔值(0或1),位与返回的是按位运算的结果。我在项目中见过有人把 if (a & b) 写成 if (a && b),功能完全不一样。

1.5 字面量:整数、浮点、字符串、位向量

字面量就是你在代码里直接写出来的值。RTLA支持四种:

整数

默认是十进制。也可以用进制前缀:0b(二进制)、0o(八进制)、0x(十六进制)。

42          // 十进制
0b101010    // 二进制,等于42
0o52        // 八进制,等于42
0x2A        // 十六进制,等于42

浮点

带小数点的数字。RTLA的浮点主要用于仿真和测试,综合工具一般不支持。

3.14
2.0e-5      // 科学计数法,等于0.00002

字符串

用双引号括起来的字符序列。常用于仿真打印或状态机命名。

"hello"
"uart_tx_state"

位向量

这是数字芯片设计的核心。格式是:位宽'进制+数值

4'b1010     // 4位二进制:1010
8'hFF       // 8位十六进制:11111111
16'd1024    // 16位十进制:0000001111111111

避坑指南:写位向量时,位宽和进制之间用单引号 ',不是反引号 `。我见过有人写成 4`b1010,编译器直接报语法错误。另外,位宽必须写,不能省略。

知识体系总览

下面这张图把本章的知识点串起来了。你可以把它当作一个快速索引:

RTLA词法结构 注释 // 单行注释 /* 多行注释 */ 标识符 字母、数字、下划线 不能数字开头 关键字 module, reg, wire... 不能用作标识符 运算符与分隔符 算术、位、逻辑 关系、移位、拼接 字面量 整数、浮点、字符串 位向量(核心) 记住:位向量是数字芯片设计的灵魂

好了,这一章的内容就这些。注释、标识符、关键字、运算符、字面量——看起来琐碎,但每个都是你写代码时绕不开的东西。我建议你把这些规则记在心里,写代码时自然就熟练了。