0. verilog HDL 命名规则
类型 | 命名方式 | 实例 |
---|---|---|
顶层文件 | 对象+功能+top | video_online_top.v |
逻辑控制文件 | 对象+ctr | ddr_ctr.v |
驱动程序 | 对象+功能+dri | lcd+dri.v |
参数文件 | 对象+para | lcd+para.v |
模块接口 | 特征域+文件名+u | mcb_read; c3+mcb+read+u.v |
端口注释 | 对象+通道+方向 | input video_vs_i |
时钟信号 | 对象+功能+特征 | phy_txclk_i; sys_50mhz_i |
复位信号 | 对象+功能+极性+特征 | phy_rst_n_i; sys_rst_n_i |
延迟信号 | 对象+功能+特征1+特征2 | fram_sync_i_r0 |
特性功能计数 | 对象(+功能)(+对象)+cnt | line_cnt;rd_cnt;mem_wr_cnt |
一般计数器 | cnt+序号 | cnt0 |
时许同步信号 | 对象+功能+特征 | line_sync_i |
使能信号 | (对象)+功能+en | wr_en; fifo_wr_en |
1. Verilog HDL 文件头编写规范
- 1.文件头需要包含版本信息
- 2.包含个人信息及文件的描述
- 3.包含版本的记录
/* ========================
Filename ﹕
Author ﹕
Description ﹕
Called by ﹕
Revision History ﹕
Revision 1.0
Email ﹕
Company ﹕ Robsense Technology .Inc
Copyright(c) 2015, xxxx Technology Inc, All right reserved
========================= */
2. Module 列表编写规范
`timescale 1ns/1ns
model Verilog_Template
(
//global clock
input clk, //50MHz
input rst_n, //global reset
//user interface
output [7:0] led_data //board test led
);
endmodel;
- 1.无论是否仿真,module前必须写
`timescale 1ns/1ns
- 2.全局时钟及复位卸载最前,分别命名为clk 及 rst_n (多时钟时可用 clk_50, clk_24区分)
- 3.相关的信号根据时钟、复位、时能、控制端的顺序规划再一起,同时必须有注释
- 4.所有输入/输出、信号命名等,都必须严格对齐
- 5.所有信号注释必须全部对齐
- 6.为了解决不同编辑器的兼容,TAB用4个空格来代替
- 7.禁止使用中文注释
- ×8.有必要的情况下,需要让逗号也对齐
3.always模块编写规范
//----------------------
//Generate for is delay signal
localparam DELAY_TOP = 28'd50_000000; 1s
reg[27:0] delay_cnt;
always@(posedage clk or nogedage rst_n)
begin
if(!rst_n)
delay_cnt <= 0;
else if(delay_cnt < DELAY_TOP - 1'b1)
delay_cnt <= delay_cnt + 1'b1;
else
delay_cnt <= 0;
end
//counter for 1s delay is completed
wire delay_1s = (delay_cnt == DELAY_TOP -1'b1)? 1'b1 : 1b'0;
- 1.每一个always模块,必须自称体系,且都必须又功能介绍
- 2.相关寄存器定义,必须写在当前always模块前
- 3.相关的宏定义,也必须写在当前always模块前
- 4.所有的if, else必须对齐
- 5.else必须写完整
- 6.信号位宽必须写完整
- 7.每一个逻辑符号前后都要空一格
- 8.单/总连出(delay_1s),写在always模块最后
4.Module的例化编写规范
//------------------
//Generate water led display
led_input_display
#(
.LED_WIDTH (8)
)
u_led_input_display
(
//global clock
.clk (clk),
.rst_n (rst_n),
//led interface
.led_en (1'b1),
.led_value (led_value),
.led_data (led_date)
);
对于Moduel的例化,相当于C语言中的调用函数,需要注意信号列表的格式:
+ 1.每一个Module再例化前必须又module的功能说明
+ 2.Module的例化名采用u_xx的格式
+ 3.信号列表及wire都必须完全对齐
+ 4.相关信号必须写在一起,并且有注释
5.Testbench代码设计风格
1.Testbench文件头编写规范
具体设计格式参照Verilog代码风格。
2.Module列表编写规范
`timescale 1ns/1ns
module Testbench_tb;
wire [7:0] led_data; //led test
endmodule
Testbench 不同于Verilog HDL的地方是没有输入/输出类的信号定义,每个激励都是再当前文件中生成的,唯一与外界通信的wire是直连接道需要测试的Module上的。还应该遵循规范:
+ 1.Module前必须写`timescale 1ns/1ns
+ 2.Module后紧跟Testbench需要输出的信号(当模块多时, 紧跟当前modul)
+ 3.相关信号必须卸载一起,并且注释。
+ ×4.设计wire测试信号,测试脚本更加清晰。