verilog编程规范

verilog编程规范

文章目录

  • verilog编程规范
  • 前言
  • 一、代码划分
  • 二、verilog编码
    • A
    • B
    • C
    • D
    • E
    • F
    • G


前言

高内聚,低耦合,干净清爽的代码


一、代码划分

高内聚:

  • 一个功能一个模块
  • 干净的接口
  • 提取公共的代码

低耦合:

  • 模块之间低耦合尽量用少量的线连接

模块划分:关键路径逻辑和非关键路径逻辑放在不同的模块。方便对关键路径做速度优化,非关键路径做面积优化

二、verilog编码

A

  • 设计文档和应用文档
  • 一个模块一个文件,并命名相同
  • 顶层模块只包模块之间的连线

B

  • 避免门级电路,变得不可移植
  • 避免三态门,而使用多路选择电路
  • 避免latch

C

  • 保证时钟和复位不出现gilch(竞争冒险产生的毛刺)。尽量使用同步复位
  • 单个模块的reg使用同步复位
  • 小心使用门控时钟(一般在低功耗设计中是用),门控时钟容易产生毛刺。如果要使用门控,尽量借助综合工具自动插入门控时钟。如果是手动,门控信号要从reg中给出,避免glitch
  • 避免使用模块内部产生的使用,用PLL或者mmCM
  • 一个模块中只使用一个时钟
  • 避免多周期路径和假路径(多周期路径就是一个寄存器输出到另一个寄存器输入的路径不能再一个时钟周期完成)
  • 要写可测试性设计(DFT):写功能时,就要考虑ATPG和BIST,要添加各种测试逻辑和bypass逻辑
  • 一个模块中只用一个时钟沿。如果需要两个,则分开模块或者,将该时钟进行取反后输入(取反后的使用IBUFG)
  • 跨时钟处理:要同步的信号从reg中出来。要同步的信号至少锁存两个clk。对cnt同步要用格雷码
    关于跨时钟处理,有以下代码可以比较:

100MHz时钟域下有一个单周期的脉冲,如何将其转换到80MHz时钟域下的单周期脉冲。
使用电平同步,将100MHZ的信号扩展,然后使用边沿检测。但是下面代码存在问题。

module test(  input 
i_clk1,   //100MHz  
input i_clk2,   //80MHz  
input i_pulse,  
output o_new_pulse);
reg r1_pulse;
reg r2_pulse;
wire w_pulse;
always @(posedge i_clk1)  //100Mbegin  r1_pulse <= i_pulse ;      r2_pulse <= r1_pulse;
end
assign w_pulse = r1_pulse | r2_pulse;
reg r1_new_pulse;
reg r2_new_pulse;
reg r3_new_pulse;
wire w_new_pulse;
always @(posedge i_clk2) //80Mbegin 
r1_new_pulse <= w_pulse;  
r2_new_pulse <= r1_new_pulse;  
r3_new_pulse <= r2_new_pulse;
end
assign o_new_pulse = ~r3_new_pulse & r2_new_pulse;
endmodule

问题代码在这里:assign w_pulse = r1_pulse | r2_pulse;
在这里插入图片描述
两个寄存器之间是有延迟的,通过把脉冲变成电平信号,如果出现上图的情况,会导致电平信号又断点。在80MHZ的时钟周期的采样,可能或漏。处理方式如下面说的“要同步的信号从reg中出来”。即先在当前时钟域下先展宽之后,在从reg中输出出来给别人用,这样就避免使用组合逻辑了。
因此代码修改如下

always @(posedge i_clk1)  //100Mbegin r1_pulse <= i_pulse ;    r2_pulse <= r1_pulse; w_pulse  <= r1_pulse | r2_pulse;end
reg r1_new_pulse;
reg r2_new_pulse;
reg r3_new_pulse;
wire w_new_pulse;
always @(posedge i_clk2) //80Mbegin  
r1_new_pulse <= w_pulse;  
r2_new_pulse <= r1_new_pulse; 
r3_new_pulse <= r2_new_pulse;end

小结:

会议竞争和冒险的原理,可以发现,assign B = a & b; 这如果a和b因为布线延迟的原因,那么该组合逻辑就可能产生毛刺。在写组合逻辑的时候,也尽量去考虑布线的延迟问题,是否产生的毛刺会给设计带来影响。
参阅文章 竞争和冒险

D

  • 用always@(*)
  • 注意阻塞赋值和非阻塞赋值的场合:1.不要混用。2.组合逻辑always@()用=;锁存逻辑always@()用<=.3.时钟逻辑用<=
  • 使用三段式状态机,且组合逻辑的转态跳转要用default
  • case比if的时序好,case无优先级。if有优先级。
  • if语句书写:嵌套要用begin
if(a == 1) beginif(c == 1)...else...end
else...

E

  • 模块的输入先reg再使用。模块的输出先reg再输出。使得输入的时序,输出强度和延迟好预测。这样可以获得更好的时序
    如代码:
module ins(input i_clk,input i_rst,input i_data,output o_vld
);
reg ri_data;
reg ro_vld;assign o_vld = ro_vld;always@(posedge i_clk)ri_data <= i_data;always@(posedge i_clk)ro_vld<= 1'b1;
endmodule
  • 不要驱动input
  • 保证所有output被驱动,如果没有使用则用assign 输出为0或者1
  • 要声明所有信号,反之会被综合为1bit
  • reg只能在一个always中赋值
  • 在写验证代码时,不要用内部信号,用点操作符有时候会有问题,因为内部信号在综合为网表之后就不见了,在使用ila抓数时,使用点操作符去索引内部信号,可能会报错(综合时被优化掉了名字)。
  • 设计代码时,不要使用force release initial forever === !===等

F

  • 不要在include中写目录名字,写工层的相对路径,否则移植很麻烦
  • 使用vh头文件

G

使用简洁的代码书写

c[3:0] = b[3:0] & d[3:0];
改写为
c=b&d;
// 没必要不用begin end
always@(posedge i_cllk)if(a == 1'b1) ro_data <= 1'b1;else 		  ro_data <= 1'b0;
  • 模块端口按照功能划分
  • 如果用 i_
  • 输出用 o_
  • inout用io_
  • wire用w_
  • reg用r_
  • 打拍用r_data_d1
  • 关于注释:注释的核心就是把代码删除了,看注释还能明白其功能。1.模块开头的注释,实现功能和关键特性。2.代码中的注释简明扼要。3.删除陈旧的代码和注释
  • 使用参数化parameter

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/485912.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用VScode 和 Keil搭建STM32的开发环境

目录 概述 1 Keil工具 1.1 Keil工具介绍 1.2 Keil 下载 1.3 安装Keil 1.4 Keil软件测试 2 VSCode软件 2.1 VSCode介绍 2.2 VSCode下载 2.3 安装VSCode 3 搭建STM32集成开发环境 3.1 安装Keil插件 3.2 参数配置 3.3 测试 4 配置头文件路径 4.1 参数配置 4.2 测…

【C++学习篇】map和set (set篇)

目录 1.map和set的使用 1.1序列式容器和关联式容器 2. set系列的使⽤ 2.1 set分类 2.2set类的介绍 2.3 set的构造和迭代器 2.4set的增删查 2.5 insert和迭代器遍历使⽤样例&#xff1a; 2.6 find和erase使⽤样例&#xff1a; 2.7multiset和set的差异 1.map和set的…

WGAN生成对抗网络数据生成

数据生成 | WGAN生成对抗网络数据生成 目录 数据生成 | WGAN生成对抗网络数据生成生成效果基本描述程序设计参考资料 生成效果 基本描述 1.WGAN生成对抗网络&#xff0c;数据生成&#xff0c;样本生成程序&#xff0c;MATLAB程序&#xff1b; 2.适用于MATLAB 2020版及以上版本&…

简易图书管理系统

javawebjspservlet 实体类 package com.ghx.entity;/*** author &#xff1a;guo* date &#xff1a;Created in 2024/12/6 10:13* description&#xff1a;* modified By&#xff1a;* version:*/ public class Book {private int id;private String name;private double pri…

c++笔记2

14、c的对象 对象和结构的区别&#xff1b; 结构&#xff1a;包含各种类型的变量&#xff1b; 对象&#xff1a;包含各种函数、和变量&#xff1b; 设计对象的时候引用class关键字创建类&#xff0c;和结构形状差不多&#xff1b; 将变量称之为属性&#xff0c;函数称之为方…

停止等待协议

理想传输条件有以下两个特点&#xff1a; 传输信道不产生差错不管发送发以多快的速度发送数据&#xff0c;接收方总是来得及处理收到的数据。 然而实际的网络都不具备以上两个理想条件&#xff0c;所以需要一个协议 “停止等待协议”就是每发送完一个分组就停止发送&#xf…

python | print() 函数常被忽略的几点用法

在 python 编程中&#xff0c;print() 是最为基础和常用的函数。 也正因如此&#xff0c;print() 函数的一些基础用法常常被我们初学者所忽略&#xff0c;典型的有&#xff1a;换行问题、间隔符使用及格式化输出等。 一、print() 换行问题 1、默认情况下&#xff0c;每一个 …

《鸣潮》运行时电脑提示“d3dx9_41.dll丢失”是什么原因?“缺失d3dx9_41.dll文件”的解决方法和预防方案

游戏运行时文件丢失与报错解决方案&#xff1a;《鸣潮》提示“d3dx9_41.dll丢失”怎么办&#xff1f; 大家好&#xff0c;我是一名在软件开发领域有着丰富经验的从业者。在游戏爱好者的世界里&#xff0c;遇到游戏运行时提示文件丢失或损坏的情况并不少见。今天&#xff0c;我…

性能测试需求分析(超详细总结)

&#x1f345; 点击文末小卡片 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 1、客户方提出 客户方能提出明确的性能需求&#xff0c;说明对方很重视性能测试&#xff0c;这样的企业一般是金融、电信、银行、医疗器械等&#xff1b;他们…

(长期更新)《零基础入门 ArcGIS(ArcMap) 》实验三----学校选址与路径规划(超超超详细!!!)

目录 实验三 学校选址与道路规划 3.1 实验内容及目的 3.1.1 实验内容 3.1.2 实验目的 3.2 实验方案 3.3 操作流程 3.3.1 环境设置 3.3.2 地势分析 &#xff08;1&#xff09;提取坡度: (2)重分类: 3.3.3 学校点分析 (1)欧氏距离: (2)重分类: 3.3.4 娱乐场所点分析 (1)欧氏距离…

计算机网络 —— HTTPS 协议

前一篇文章&#xff1a;计算机网络 —— HTTP 协议&#xff08;详解&#xff09;-CSDN博客 目录 前言 一、HTTPS 协议简介 二、HTTPS 工作过程 1.对称加密 2.非对称加密 3.中间人攻击 4.引入证书 三、HTTPS 常见问题 1.中间人能否篡改证书&#xff1f; 2.中间人能否调…

【调试工具】USB 转 UART 适配器(USB 转 TTL)

「USB 转 TTL 转换器」是错误的叫法&#xff0c;正确的叫法应该为 「USB 转 UART 适配器」。 Device connection 注意端口的交叉连接&#xff0c;Device1_TX<---->Device2_RX USB-to-UART adapter GND 记得接地。 使用&#xff1a; 当 TX,RX 需要电平为 0-3.3V 时&am…

116. UE5 GAS RPG 实现击杀掉落战利品功能

这一篇&#xff0c;我们实现敌人被击败后&#xff0c;掉落战利品的功能。首先&#xff0c;我们将创建一个新的结构体&#xff0c;用于定义掉落体的内容&#xff0c;方便我们设置掉落物。然后&#xff0c;我们实现敌人死亡时的掉落函数&#xff0c;并在蓝图里实现对应的逻辑&…

图像生成-扩散模型的经典之作DDPM

论文&#xff1a;https://arxiv.org/pdf/2006.11239 项目&#xff1a;https://github.com/hojonathanho/diffusion Denoising Diffusion Probabilistic Models (DDPM) 是一种生成模型&#xff0c;它通过一系列逐步添加噪声的过程将数据点映射到一个简单的先验分布&#xff08;…

【Axure视频教程】中继器表格——筛选后的条件判断

今天教大家在Axure制作中继器表格筛选以及筛选后条件交互的原型模板&#xff0c;我们可以在输入框里输入员工姓名&#xff0c;点击查询按钮后可以筛选出对应的数据&#xff0c;筛选后会进行条件判断&#xff0c;如果筛选不到任何数据&#xff0c;就会显示提示弹窗。这个原型模板…

GDPU 人工智能 期末复习

1、python基础 2、回归、KNN、K-Means、搜索方法思想及算法实现步骤 3、知识表示基本概念 4、状态空间的相关概念、表示方法及应用 5、图搜索策略及应用 6、问题归约概念、与或图搜索、博弈树搜索与剪枝 7、决策树、贝叶斯决策算法及其应用 8、神经网络与深度学习基本概念 一、…

几个Linux系统安装体验: 龙蜥服务器系统

本文介绍龙蜥服务器系统&#xff08;AnolisOS&#xff09;的安装。 下载 下载地址&#xff1a; https://openanolis.cn/download 选定版本为8.6。 本文下载的文件名称为AnolisOS-8.6-x86_64-minimal.iso&#xff0c;体积约2.2GB。另&#xff1a;AnolisOS-8.6-QU1-x86_64-dv…

Unity 设计模式-策略模式(Strategy Pattern)详解

策略模式&#xff08;Strategy Pattern&#xff09;是一种行为型设计模式&#xff0c;定义了一系列算法&#xff0c;并将每种算法封装到独立的类中&#xff0c;使得它们可以互相替换。策略模式让算法可以在不影响客户端的情况下独立变化&#xff0c;客户端通过与这些策略对象进…

阿拉丁论文助手:一键点亮学术之路

在学术研究的海洋中&#xff0c;每一位学者都渴望拥有一盏能够照亮前行道路的神灯。阿拉丁论文助手&#xff0c;正是这样一盏神奇的灯&#xff0c;它以其先进的人工智能技术和丰富的学术资源&#xff0c;为学者们的学术写作提供了全方位的支持。 一、阿拉丁论文助手简介 阿拉丁…

YOLOv10改进,YOLOv10添加U-Netv2分割网络中SDI信息融合模块,助力小目标检测

摘要 理论介绍 SDI模块的架构: 平滑卷积(SmoothConv):用于平滑特征图,帮助减少噪声并使得特征更加稳定。Hadamard积:用于在特征图中进行逐元素相乘(点乘),以加强语义信息和细节信息的融合。通道注意力(ChannelAttention):利用通道注意力机制来自动关注重要的特征通…