第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)、下划线(_)
- 不能以数字开头
- 区分大小写:
data和Data是两个不同的标识符 - 不能使用关键字(后面会讲)
嗯,这里要注意:下划线可以出现在开头,比如 _internal_signal。但我个人不建议这么干,因为有些工具会把下划线开头的信号当作内部变量,容易混淆。
// 合法的标识符
clk_50mhz
data_in_byte
fifo_depth_1024
_private_flag // 合法,但不推荐
// 非法的标识符
2nd_stage // 数字开头,不行
data-bus // 短横线,不行
module // 关键字,不行
避坑指南:我曾经在一个项目中用了 data_in 和 data_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,编译器直接报语法错误。另外,位宽必须写,不能省略。
知识体系总览
下面这张图把本章的知识点串起来了。你可以把它当作一个快速索引:
好了,这一章的内容就这些。注释、标识符、关键字、运算符、字面量——看起来琐碎,但每个都是你写代码时绕不开的东西。我建议你把这些规则记在心里,写代码时自然就熟练了。