建网站联系电话四川建设行政主管部门官方网站
在 Verilog HDL 中,格式(Format)指的是代码的书写结构与排版风格,它不影响语义正确性,但对代码可读性、可维护性、团队协作、调试效率有极大影响。格式良好的 Verilog 代码可以大大减少出错概率,提升代码复用效率与综合仿真效率。
一、Verilog 格式的核心要素
1. 缩进风格
- 推荐使用 4空格缩进,不要使用制表符(Tab),以保证跨编辑器的一致性。
 - 所有块结构(如 
begin ... end,case,always)应正确缩进。 
✅ 示例:
always @(posedge clk or negedge rstn) beginif (!rstn)data_out <= 0;else if (enable)data_out <= data_in;
end
 
2. 模块结构布局规范
统一模块书写顺序如下,便于文档生成与逻辑解读:
// 模块声明
module <module_name> (input  wire clk,input  wire rstn,output wire valid
);// 参数定义
parameter WIDTH = 8;// 端口说明(如是中间变量)
input  wire        clk;
input  wire        rstn;
output wire        valid;// 内部信号
reg [WIDTH-1:0] counter;// 主逻辑块
always @(posedge clk or negedge rstn) beginif (!rstn)counter <= 0;elsecounter <= counter + 1;
endendmodule
 
3. 对齐与空格使用
- 运算符 
=,<=,==,+,-左右加空格 port list、parameter、signal推荐对齐统一宽度
✅ 示例:
assign valid   = (counter == 8'd255);
assign data_ok = valid && ready;
 
4. 代码块结构布局
4.1 if-else结构
 
if (cond) begin// ...
end else begin// ...
end
 
4.2 case结构
 
case (state)IDLE:   next_state = READ;READ:   next_state = WRITE;WRITE:  next_state = IDLE;default: next_state = IDLE;
endcase
 
4.3 FSM 状态块统一分段
// 状态寄存器
always @(posedge clk or negedge rstn)if (!rstn)state <= IDLE;elsestate <= next_state;// 状态转移
always @(*) begincase (state)IDLE:   next_state = start ? READ : IDLE;READ:   next_state = ready ? WRITE : READ;WRITE:  next_state = done ? IDLE : WRITE;default: next_state = IDLE;endcase
end
 
二、命名风格(风格虽属格式范畴,但非常关键)
| 类型 | 命名风格 | 说明 | 
|---|---|---|
| 端口名 | i_clk, o_data | i_ 表示输入,o_ 表示输出 | 
| 寄存器 | reg_data, reg_valid | 以 reg_ 开头 | 
| 线网(wire) | w_data, w_ack | 表示组合逻辑线 | 
| 状态机 | STATE_IDLE, STATE_WAIT | 全大写、可枚举 | 
| 宏定义 |  `WIDTH,  `ADDR_BITS | 全大写,统一风格 | 
三、空行与逻辑分组
合理使用空行提升可读性,建议:
| 空行前后 | 推荐操作 | 
|---|---|
module/endmodule 外层 | 空两行 | 
always/initial 块之间 | 空一行 | 
parameter 与 signal 段之间 | 空一行 | 
case 分支之间 | 可空一行以突出逻辑层次 | 
四、格式化工具推荐
为了团队规范一致,推荐使用以下格式化工具自动规整 Verilog 代码:
| 工具 | 简介 | 链接 | 
|---|---|---|
| Verible | Google 开源的 Verilog 格式化工具,支持 lint+format | https://github.com/chipsalliance/verible | 
| vlogfmt | 简单命令行 Verilog 格式化工具 | https://github.com/igorski/vlogfmt | 
| Emacs/Modesim IDE 插件 | 各种 HDL mode | Emacs HDL Mode | 
| VSCode 插件:Verilog-HDL/SystemVerilog | 自动缩进/跳转 | Visual Studio Code Extension | 
五、不良格式案例(反例)
module test(clk,rstn,din,dout);reg[7:0]data;always@(posedge clk or negedge rstn)begin if(!rstn)data<=0;else data<=din;end assign dout=data;endmodule
 
❌ 问题:
- 缩进缺失
 - 空格乱用
 always和assign写在一行- 信号无说明
 
六、建议配套格式标准文档
团队合作建议统一一份《Verilog 代码书写规范》文档,涵盖:
- 文件头部模板(含作者、模块描述)
 - 命名规则表
 - 缩进与排版标准
 - 注释规范
 - 工具与检查流程
 
示例代码片段(格式良好)
// ------------------------------
// Module : edge_detector
// Desc   : 检测上升沿
// ------------------------------
module edge_detector (input  wire clk,input  wire rstn,input  wire sig_in,output wire rise_edge
);reg sig_d;always @(posedge clk or negedge rstn) beginif (!rstn)sig_d <= 0;elsesig_d <= sig_in;
endassign rise_edge = sig_in & ~sig_d;endmodule
