veilog 语言书写规范
自己总结的verilog规则

39、时序逻辑电路中if条件下一般用<=运算符
40、if()
begin
……
end
else if()
begin
……
end
else if()
begin
input ;
reg ;
integer ;
……
begin
……
end
24、reg mema [7:0](8个1位寄存器构成组成)reg [7:0] mema(1个8为寄存器)可用mema[4]引用前者。
25、并行块:fork...join(不可用于RTL代码设计,只可用于测试代码) 顺序块begin...end
26、initial和fork...join均不可综合
括号可为空,此时不断循环,另外begin与end间被赋值的变量必须为reg型直接用=赋值
always@()
begin
#10 clk=1;
#10 clk=0;
else
例:边沿触发 always@(negedge clk)
...
11、仿真时用initial类似always,不可综合
12、例化时实参与形参顺序相同则不需写形参,若形参、实参都写则可调换顺序
13、assign并不需要在always中,也可以在外面
44、任务的定义与调用
task my_task;
input a,b;
output c,d;
一个或多个赋值表达式;
endtask(无分号)
end
可在其中使用if语句
9、always可用于描述组合逻辑电路
也可用于描述时序逻辑电路,区别在于时序电路敏感信号一般为上升沿或下降沿
verilog语言例化书写格式

verilog语言例化书写格式Verilog语言是一种硬件描述语言(HDL),在数字电路设计、逻辑仿真和综合等领域得到广泛应用。
在Verilog中,实例化是将模块实例化为实体的过程,通过实例化可以在设计中重复使用模块并连接各个模块之间的信号。
Verilog语言的例化书写格式如下:1. 定义模块首先,在设计中需要定义要实例化的模块。
模块定义包括模块名称、输入输出端口和内部信号。
例如,我们定义了一个名为"example_module"的模块,包含三个输入端口(A、B、C)和一个输出端口(D):```verilogmodule example_module(A, B, C, D);input A, B, C;output D;// internal logicendmodule```2. 实例化模块在设计中需要使用该模块时,可以进行实例化。
实例化的格式为:模块名称实例名称 ( .端口名称(信号名称), ... );例如,我们使用上述定义的"example_module"模块进行实例化,假设实例名称为"example_inst",连接的信号为A、B、C、D,实例化代码如下:```verilogexample_module example_inst(.A(signal_A),.B(signal_B),.C(signal_C),.D(signal_D));```在上述实例化代码中,通过"."符号将信号与端口进行连接。
例如,信号signal_A将与输入端口A连接起来。
3. 内部信号的连接在实例化模块时,还可以直接将内部信号连接到其他信号上。
例如,我们在实例化时,将一个内部信号internal_signal直接连接到另一个信号output_signal上:```verilogexample_module example_inst(.A(signal_A),.B(signal_B),.C(signal_C),.D(output_signal));assign internal_signal = output_signal;```通过上述的例化书写格式,我们可以在Verilog设计中有效地实例化模块,并连接各个模块之间的信号。
verilog三段式写法 -回复

verilog三段式写法-回复Verilog三段式写法及其应用[引言]Verilog是一种硬件描述语言,常用于数字系统设计和验证。
其三段式写法是一种结构化代码编写方法,使得Verilog代码更具可读性和可维护性。
本文将介绍Verilog三段式写法的基本原则和应用。
[主体]一、Verilog三段式写法的基本原则Verilog三段式写法分为模块声明段、模块实例化段和连线连接段三个部分。
遵循以下原则可以使得代码更加易读、易写和易维护。
1. 模块声明段:模块声明段用于定义模块的输入输出端口、内部信号和模块内部子模块。
在此段中,要定义输入输出端口的类型、宽度,并按照功能进行分组,以增强代码的清晰度和可读性。
2. 模块实例化段:模块实例化段用于实例化其他模块。
在此段中,以模块名为关键字,通过实例名来调用其他模块。
通过这种方式,可以方便地进行模块的复用,提高代码编写的效率。
3. 连线连接段:连线连接段用于将模块内信号和模块之间的端口进行连接。
在此段中,通过连线语句将模块内的信号与输入输出端口相连接。
这里可以使用连线运算符"->"和"<-"来表示方向,以增加代码的可读性。
二、Verilog三段式写法的应用Verilog三段式写法可以有效地帮助我们组织和管理代码,下面列举几个应用场景:1. 声明段的应用:在声明段中,我们可以按照功能和类型对端口进行分组。
例如,我们可以将输入端口和输出端口分开定义,可以使得代码更加清晰易读。
同时,在定义端口的时候,我们可以指定端口的数据类型和位数,这样可以提高代码的安全性和可读性。
2. 实例化段的应用:在实例化段,我们可以实例化其他模块,并且给实例化的模块分配实例名。
通过实例化可以方便地实现模块之间的复用和调用,提高代码的可维护性和可扩展性。
同时,实例名的设置也可以使得代码更加易读和易理解。
3. 连线连接段的应用:在连线连接段,我们可以使用连线语句将模块内的信号与输入输出端口相连接。
verilog格式说明

verilog格式说明Verilog是一种硬件描述语言(HDL),用于描述和设计数字电路。
它是一种重要的工具,广泛用于电子系统级设计(ESL)和硬件验证。
以下是Verilog的格式说明:1. 模块声明:一个Verilog文件通常包含一个或多个模块。
模块定义以关键字module开头,后跟模块名称和端口列表。
例如:module my_module (input clk, input [7:0] data, output reg result);2. 端口声明:端口列表中定义了模块的输入和输出端口。
每个端口都有一个方向和一个数据类型。
关键字input表示输入端口,output表示输出端口。
例如:input clk; // 单个输入端口input [7:0] data; // 8位宽输入端口output reg result; // 单个输出端口(带有寄存器)3. 寄存器和连线声明:在模块中,可以使用寄存器和连线来保存和传输数据。
使用关键字reg声明寄存器变量,使用关键字wire声明连线。
例如:reg [3:0] count; // 4位寄存器变量wire [7:0] sum; // 8位宽连线4. 组合逻辑:Verilog可以描述组合逻辑电路,如AND、OR、NOT等门的逻辑运算。
例如:assign result = (data1 & data2) | data3; // 使用assign语句描述组合逻辑5. 时序逻辑:时序逻辑描述了基于时钟信号的电路行为。
使用关键字always和关键字posedge或negedge表示时钟上升沿或下降沿敏感的逻辑块。
例如:always @(posedge clk) // 在时钟上升沿触发的逻辑beginif (reset) // 重置信号count <= 0;elsecount <= count + 1; // 计数器递增end这些是Verilog中一些常见的格式说明。
2024版Verilog编程规范(华为)

实现自动化测试流程,提高测试 效率和准确性。
06
代码审查与质量保证
代码审查流程介绍
提交代码
开发人员将代码提交到代码审查 系统中。
分配审查任务
系统或审查组长将审查任务分配 给审查人员。
代码审查
审查人员对代码进行逐行审查, 检查是否符合编程规范和质量要
求。
审查通过
经过多轮反馈和整改后,代码符 合要求,审查通过。
通过定期的培训、分享和宣传活动,提高开 发人员对Verilog编程规范的认识和重视程度。
引入自动化检查工具
建立持续改进机制
研究和引入自动化检查工具,对Verilog代码 进行静态分析和规范检查,进一步提高代码 质量和开发效率。
建立规范的持续改进机制,收集开发人员的 反馈和建议,及时调整和优化规范内容。
可重用性原则
模块应具有高内聚、低耦 合的特点,便于在不同项 目中重用。
可维护性原则
模块应易于理解、测试和 修改,以降低维护成本。
顶层结构设计方法
自顶向下设计
从系统整体需求出发,逐 步细化到各个模块的设计 和实现。
模块化设计
将系统划分为多个独立的 模块,每个模块承担一定 的功能,便于并行开发和 维护。
减少错误和提高代码质量
02
规范的编程习惯有助于减少编码过程中的错误,提高代码的稳
定性和可靠性。
促进知识共享和传承
03
统一的编程规范有利于知识的积累和传承,降低新人学习成本,
提高团队整体技术水平。
适用范围及对象
适用范围
本规范适用于使用Verilog语言进 行硬件描述和设计的所有场景,包 括但不限于数字电路设计、验证、 仿真等。
端口名应避免与模块内部变量名冲突。
Verilog代码书写规范

Verilog代码书写规范2.5.1 信号命名规则信号命名规则在团队开发中占据着重要地位,统一、有序的命名能大幅减少设计人员之间的冗余工作,还可便于团队成员代码的查错和验证。
比较著名的信号命名规则当推Microsoft 公司的“匈牙利”法,该命名规则的主要思想是“在变量和函数名中加入前缀以增进人们对程序的理解”。
例如所有的字符变量均以ch为前缀,若是常数变量则追加前缀c。
信号命名的整体要求为:命名字符具有一定的意义,直白易懂,且项目命名规则唯一。
对于HDL设计,设计人员还需要注意以下命名规则。
1.系统级信号的命名系统级信号指复位信号,置位信号,时钟信号等需要输送到各个模块的全局信号。
系统信号以字符串sys或syn开头;时钟信号以clk开头,并在后面添加相应的频率值;复位信号一般以rst或reset开头;置位信号为st或set开头。
典型的信号命名方式如下所示:wire [7:0] sys_dout, sys_din;wire clk_32p768MHz;wire reset;wire st_counter;2.低电平有效的信号命名低电平有效的信号后一律加下划线和字母n。
如:wire SysRst_n;wire FifoFull_n;3.过锁存器锁存后的信号经过锁存器锁存后的信号,后加下划线和字母r,与锁存前的信号区别。
如:信号CpuRamRd信号,经锁存后应命名为CpuRamRd_r。
低电平有效的信号经过锁存器锁存后,其命名应在_n后加r。
如:CpuRamRd_n信号,经锁存后应命名为CpuRamRd_nr多级锁存的信号,可多加r以标明。
如:CpuRamRd信号,经两级触发器锁存后,应命名为CpuRamRd_rr。
2.5.2 模块命名规则HDL语言的模块类似于C语言中的函数,可采用C语言函数的大多数规则。
模块的命名应该尽量用英文表达出其完成的功能。
遵循动宾结构的命名法则,函数名中动词在前,并在命名前加入函数的前缀,函数名的长度一般不少于2个字母。
verilog书写规范

verilog书写规范海思⾼校合作——QA培训资料⼀、RTL CODE 规范1.标准的⽂件头在每⼀个版块的开头⼀定要使⽤统⼀的⽂件头,其中包括作者名,模块名,创建⽇期,概要,更改记录,版权等必要信息。
统⼀使⽤以下的⽂件头:// **************************************************************// COPYRIGHT(c)2005, Hislicon Technologies Co, Ltd// All rights reserved.//// IP LIB INDEX : IP lib index just sa UTOPIA_B// IP Name : the top module_name of this ip, usually, is same// as the small ip classified name just as UTOPIA// File name : file_name of the file just as “tx_fifo.v”// Module name : module_name of this file just as “TX_FIFO”// Full name : complete Emglish nme of this abbreviated//// Author : Athor/ID// Email : Author?s email// Data :// Version : V 1.0////Abstract :// Called by : Father Module//// Modification history// ------------------------------------------------------------------------------------------------------// //// $Log$//// *********************************************************************2. 标准的module 格式(module 整体结构)对于模块的书写采⽤统⼀的格式便于项⽬内部成员的理解和维护,我们⽤批处理建⽴了⼀个MODULE模块,其内容解释如下:●端⼝定义按照输⼊,输出,双向的顺序:●模块名、模块例化名统⼀,例化名前加⼤写U_以区分(多次例化另加标识),三者关系:⽂件名:xxx .v (⼩写)模块名:XXX (⼤写)例化名:U_XXX (⼤写)IP 内部所有的模块名都要加IP名或者IP名简称作前缀,如USB_CTRL、USB_TX_FIFO。
VERILOG语言编写规范

VERILOG语言编写规范1 目的本规范的目的是提高书写代码的可读性可修改性可重用性,优化代码综合和仿真结果,指导设计工程师使用VerilogHDL规范代码和优化电路,规范化公司的ASIC设计输入从而做到1. 逻辑功能正确2.可快速仿真3. 综合结果最优如果是hardware model)4. 可读性较好。
2 范围本规范涉及Verilog HDL编码风格,编码中应注意的问题, Testbench的编码等。
本规范适用于Verilog model的任何一级( RTL behavioral, gate_level),也适用于出于仿真,综合或二者结合的目的而设计的模块。
3 定义Verilog HDL : Verilog 硬件描述语言FSM :有限状态机伪路径:静态时序分析( STA)认为是时序失败,而设计者认为是正确的路径4 引用标准和参考资料下列标准包含的条文通过在本标准中引用而构成本标准的条文在标准出版时所示版本均为有效所有标准都会被修订使用本标准的各方应探讨使用下列标准最新版本的可能性Actel HDLCoding Style GuiderSun MicrosystemsRevision 1.0VerilogStyle and Coding Guidelines5 规范内容5.1 Verilog 编码风格本章节中提到的Verilog编码规则和建议适应于 Verilog model的任何一级( RTL behavioral,gate_level) 也适用于出于仿真,综合或二者结合的目的而设计的模块。
5.1.1 命名规范选择有意义的信号和变量名,对设计是十分重要的。
命名包含信号或变量诸如出处,有效状态等基本含义下面给出一些命名的规则。
1. 用有意义而有效的名字有效的命名有时并不是要求将功能描述出来如For ( I = 0; I < 1024; I = I + 1 )Mem[I]<= #1 32’b0;For 语句中的循环指针I 就没必要用loop_index作为指针名。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
2.5.1 信号命名规则
信号命名规则在团队开发中占据着重要地位,统一、有序的命名能大幅减少设计人员之间的冗余工作,还可便于团队成员代码的查错和验证。
比较著名的信号命名规则当推Microsoft公司的“匈牙利”法,该命名规则的主要思想是“在变量和函数名中加入前缀以增进人们对程序的理解”。
例如所有的字符变量均以ch为前缀,若是常数变量则追加前缀c。
信号命名的整体要求为:命名字符具有一定的意义,直白易懂,且项目命名规则唯一。
对于HDL设计,设计人员还需要注意以下命名规则。
1.系统级信号的命名
系统级信号指复位信号,置位信号,时钟信号等需要输送到各个模块的全局信号。
系统信号以字符串sys或syn开头;时钟信号以clk开头,并在后面添加相应的频率值;复位信号一般以rst或reset开头;置位信号为st或set开头。
典型的信号命名方式如下所示:
wire [7:0] sys_dout, sys_din;
wire clk_32p768MHz;
wire reset;
wire st_counter;
2.低电平有效的信号命名
低电平有效的信号后一律加下划线和字母n。
如:
wire SysRst_n;
wire FifoFull_n;
3.过锁存器锁存后的信号
经过锁存器锁存后的信号,后加下划线和字母r,与锁存前的信号区别。
如:
信号CpuRamRd信号,经锁存后应命名为CpuRamRd_r。
低电平有效的信号经过锁存器锁存后,其命名应在_n后加r。
如:
CpuRamRd_n信号,经锁存后应命名为CpuRamRd_nr
多级锁存的信号,可多加r以标明。
如:
CpuRamRd信号,经两级触发器锁存后,应命名为CpuRamR d_rr。
2.5.2 模块命名规则
HDL语言的模块类似于C语言中的函数,可采用C语言函数的大多数规则。
模块的命名应该尽量用英文表达出其完成的功能。
遵循动宾结构的命名法则,函数名中动词在前,并在命名前加入函数的前缀,函数名的长度一般不少于2个字母。
HDL模块的命名还需要考虑以下情况:
1.模块的命名规则
在系统设计阶段应该为每个模块进行命名。
命名的方法是,将模块英文名称的各个单词首字母组合起来,形成3到5个字符的缩写。
若模块的英文名只有一个单词,可取该单词的前3个字母。
各模块的命名以3个字母为宜。
例如:
Arithmatic Logical Unit模块,命名为ALU。
Data Memory Interface模块,命名为DMI。
Decoder模块,命名为DEC。
2.模块之间接口信号的命名
所有变量命名分为两个部分,第一部分表明数据方向,其中数据发出方在前,数据接收方在后,第二部分为数据名称。
两部分之间用下划线隔离开。
第一部分全部大写,第二部分所有具有明确意义的英文名全部拼写或缩写的第一个字母大写,其余部分小写。
举例: wire CPUMMU_WrReq;
下划线左边是第一部分,代表数据方向是从CPU模块发向存储器管理单元模块(MMU)。
下划线右边Wr为Write的缩写,Req是Re quest的缩写。
两个缩写的第一个字母都大写,便于理解。
整个变量连起来的意思就是CPU发送给MMU的写请求信号。
模块上下层次间信号的命名也遵循本规定。
若某个信号从一个模块传递到多个模块,其命名应视信号的主要路径而定。
3.模块内部信号:
模块内部的信号由几个单词连接而成,缩写要求能基本表明本单词的含义;单词除常用的缩写方法外(如:Clock->Clk, Write->Wr, Rea d->Rd等),一律取该单词的前几个字母(如:Frequency->Freq, Variable->Var 等);每个缩写单词的第一个字母大写;若遇两个大写字母相邻,中间添加一个下划线(如DivN_Cntr);举例: SdramWrEn_n;
FlashAddrLatchEn;
2.5.3 代码格式规范
1. 分节书写格式
各节之间加1到多行空格。
如每个always,initial语句都是一节。
每节基本上完成一个特定的功能,即用于描述某几个信号的产生。
在每节之前有几行注释对该节代码加以描述,至少列出本节中所描述信号的含义。
行首不要使用空格来对齐,而是用Tab键,Tab键的宽度设为4个字符宽度。
行尾不要有多余的空格。
2. 注释的规范
使用//进行的注释行以分号结束;使用/* */进行的注释,/*和*/各占用一行,并且顶头;例如:
// Edge detector used to synchronize the input signal;
对于函数,应该从“功能”,“参数”,“返回值”、“主要思路”、“调用方法”、“日期”六个方面用如下格式注释:
// 程序说明开始
// ================================================ ================//
// 功能:完成两个输入数的相加。
// 参数:strByDelete,strToDelete
// 输入参数
// 输出参数
// 主要思路:本算法主要采用2级流水线完成相加
// 日期:起始日期,如:2007/8/21.9:40--2007/8/23.21:45
// 版本:
// 程序编写人员:
// 程序调试记录:
// ================================================ ================//
// 模块说明结束
此外,在注释说明中,需要注意以下细节:
在注释中应该详细说明模块的主要实现思路,特别要注明自己的一些想法,如果有必要则应该写明对想法产生的来由。
在注释中详细注明函数的适用方法,对于输入参数的要求以及输出数据的格式。
在注释中要强调调用时的危险方面,可能出错的地方。
对日期的注释要求记录从开始编写模块到模块测试结束之间的日期。
对模块注释开始到模块命名之间应该有一组用来标识的特殊字符串。
如果算法比较复杂,或算法中的变量定义与位置有关,则要求对变量的定义进行图解。
对难以理解的算法能图解尽量图解。
3.空格的使用:
不同变量,以及变量与符号、变量与括号之间都应当保留一个空格。
Verilog关键字与其它任何字符串之间都应当保留一个空格。
如: always @ ( ...... )
使用大括号和小括号时,前括号的后边和后括号的前边应当留有一个空格。
逻辑运算符、算术运算符、比较运算符等运算符的两侧各留一个空格,与变量分隔开来;单操作数运算符例外,直接位于操作数前,不使用空格。
使用//进行的注释,在//后应当有一个空格;注释行的末尾不要有多余的空格。
例:
assign SramAddrBus = { AddrBus[31:24], AddrBus[7:0] }; assign DivCntr[3:0] = DivCntr[3:0] + 4'b0001;
assign Result = ~Operand;
4.begin…end的书写规范
同一个层次的所有语句左端对齐;initial、always等语句块的begin 关键词跟在本行的末尾,相应的end关键词与initial、always对齐;这样做的好处是避免因begin独占一行而造成行数太多;如:always @ ( posedge SysClk or negedge SysRst ) begin if( !SysRst ) DataOut <= 4'b0000;
else if( LdEn ) begin
DataOut <= DataIn;
End
else
DataOut <= DataOut + 4'b0001;
end
不同层次之间的语句使用Tab键进行缩进,每加深一层缩进一个Ta b;在endmodule,endtask,endcase等标记一个代码块结束的关
键词后面要加上一行注释说明这个代码块的名称。
2.5.4 模块调用规范
在Verilog中,有两种模块调用的方法,一种是位置映射法,严格按照模块定义的端口顺序来连接,不用注明原模块定义时规定的端口名,其语法为:
模块名(连接端口1信号名, 连接端口2信号名, 连接端口3信号名,…);
另一种为信号映射法,即利用“.”符号,表明原模块定义时的端口名,其语法为:
模块名(.端口1信号名(连接端口1信号名),
.端口2信号名(连接端口2信号名),
.端口3信号名(连接端口3信号名),…);
显然,信号映射法同时将信号名和被引用端口名列出来,不必严格遵守端口顺序,不仅降低了代码易错性,还提高了程序的可读性和可移植性。
因此,在良好的代码中,严禁使用位置调用法,全部采用信号映射法。