当前位置: 首页 > news >正文

【verilog】Verilog 工程规范编码模板

这一套【Verilog 工程规范编码模板】,适合写清晰、可维护、可综合的 RTL 代码,适用于 FPGA/ASIC 开发:


📘 Verilog 工程级编码规范模板


1️⃣ 模块结构规范

module my_module #(parameter WIDTH = 8  // 模块参数
)(input  wire clk,input  wire rst_n,input  wire [WIDTH-1:0] data_in,output reg  [WIDTH-1:0] data_out
);// ============ 内部信号定义 ============
reg [WIDTH-1:0] data_buf;// ============ 组合逻辑块 ============
always @(*) begin// 默认值(避免综合 latch)data_buf = 0;if (/* condition */)data_buf = data_in + 1;
end// ============ 时序逻辑块 ============
always @(posedge clk or negedge rst_n) beginif (!rst_n)data_out <= 0;elsedata_out <= data_buf;
endendmodule

2️⃣ 时序逻辑模板(寄存器写)

always @(posedge clk or negedge rst_n) beginif (!rst_n)q <= 0;else if (en)q <= d;
end

3️⃣ 组合逻辑模板(纯组合,用于中间变量)

always @(*) begincase (sel)2'b00: out = a;2'b01: out = b;2'b10: out = c;default: out = 0;endcase
end

4️⃣ 状态机结构模板(推荐三段式)

// 状态编码
localparam IDLE  = 2'd0,LOAD  = 2'd1,WORK  = 2'd2,DONE  = 2'd3;reg [1:0] state, state_next;// 状态跳转(组合)
always @(*) begincase (state)IDLE:  state_next = start ? LOAD : IDLE;LOAD:  state_next = WORK;WORK:  state_next = done ? DONE : WORK;DONE:  state_next = IDLE;default: state_next = IDLE;endcase
end// 状态寄存器(时序)
always @(posedge clk or negedge rst_n) beginif (!rst_n)state <= IDLE;elsestate <= state_next;
end// 输出逻辑(组合)
always @(*) begincase (state)IDLE:  do_something = 0;LOAD:  do_something = 1;WORK:  do_something = 1;DONE:  do_something = 0;default: do_something = 0;endcase
end

5️⃣ 总线打拍与同步模板

// 1拍打拍
reg [7:0] signal_d1;
always @(posedge clk or negedge rst_n) beginif (!rst_n)signal_d1 <= 0;elsesignal_d1 <= signal_in;
end

6️⃣ 通用模块命名规范(推荐)

类型前缀建议说明
输入信号in_如:in_data, in_valid
输出信号out_如:out_data, out_ready
中间寄存器_reg如:cnt_reg, state_reg
状态机状态全大写如:IDLE, WAIT, DONE
参数全大写如:DATA_WIDTH, BUF_DEPTH

✅ 编码风格建议

  • 每个 always 只负责一类功能:组合逻辑 or 时序逻辑

  • 不要在组合逻辑中写 <='(非阻塞赋值)

  • 多个 if-else 控制一个变量时,一定要确保是互斥的,或统一组合后赋值

  • 尽量避免推测 latch(即组合逻辑中没有默认值)

  • 状态机推荐三段式写法(状态跳转 + 状态寄存器 + 输出逻辑分离)


http://www.dtcms.com/a/138340.html

相关文章:

  • webgl入门实例-07顶点缓冲区基本概念
  • LabVIEW液压系统远程监控与故障诊断
  • 【创新实训个人博客】前端实现
  • 基于Flask的漏洞挖掘知识库系统设计与实现
  • Java语言实现递归调用算法
  • Java课堂6
  • 组合模式实战:用树形结构管理企业组织与文件系统
  • 【PyTorch】PyTorch中的非线性激活函数详解:原理、优缺点与实战指南
  • 自求导实现线性回归与PyTorch张量详解
  • 【第46节】windows程序的其他反调试手段中篇
  • ubuntu 向右拖动窗口后消失了、找不到了
  • 高通手机抓取sniffer log的方法
  • Python网络爬虫设计(二)
  • C++入门基础:命名空间,缺省参数,函数重载,输入输出
  • vue3 Ts axios 封装
  • Vscode 插件开发
  • 03_Americanas精益管理项目_StarRocks
  • 巧用ChatGPT生成适合小白的Python练习题,助力编程入门
  • 具身智能机器人学习路线全解析
  • Linux网络编程实战:从字节序到UDP协议栈的深度解析与开发指南
  • 游戏数据分析,力扣(游戏玩法分析 I~V)mysql+pandas
  • 识别法院PDF文件特定字段并插入数据库【正则表达式+本地化部署】
  • 锚定效应的应用-独立站优化价格打折显示-《认知偏差手册》
  • 少数服从多数悖论、黑白颠倒与众人孤立现象之如何应对(一)
  • 观察者设计模式详解:解耦通知机制的利器
  • AI+SWAT模型革命性应用!ArcGIS Pro流域水循环/水生态智能模拟实战;SWAT模型下载 安装 运行 建模流程
  • docker登录AWS ECR拉取镜像
  • Langchain构建Agent
  • 使用AI工具打造专业级PPT的完整方案,结合 DeepSeek构思、Kimi生成内容、Napkin优化设计 等工具,分阶段详细说明流程及工具使用
  • 【软件测试】性能测试概念篇