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.mzph.cn/bicheng/63720.shtml

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

相关文章

WEB安全基础知识

WAF全称为Web Application Firewall&#xff08;网页应用防火墙&#xff09;是一种专门设计用来保护web应用免受各种网络攻击的安全防护措施。它位于客户端与服务器之间&#xff0c;监控和过滤HTTP流量&#xff0c;从而拦截恶意请求、识别并防御常见的web攻击。 WAF的主要功能…

qemu安装arm64架构银河麒麟

qemu虚拟化软件&#xff0c;可以在一个平台上模拟另一个硬件平台&#xff0c;可以支持多种处理器架构。 一、安装 安装教程&#xff1a;https://blog.csdn.net/qq_36035382/article/details/125308044 下载链接&#xff1a;https://qemu.weilnetz.de/w64/2024/ 我下载的是 …

188-下翻便携式6U CPCI工控机箱

一、板卡概述 下翻式CPCI便携工控机,系统采用6u cpci背板结构,1个系统槽,7个扩展槽, 满足对携带的需求,可装标准6U8槽CPCI主板,8个扩展槽, 满足客户对空间扩展的需求.可宽温服务的工作产品,15高亮度液晶显示屏,超薄88键笔记本键盘,触摸式鼠标,加固型机箱结构,使它能够适应各种复…

网页核心页面设计(第9章)

一、多个边框阴影 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content"widthdevice-…

Edge SCDN的独特优势有哪些?

强大的边缘计算能力 Edge SCDN&#xff08;边缘安全加速&#xff09;是酷盾安全推出的边缘集分布式 DDoS 防护、CC 防护、WAF 防护、BOT 行为分析为一体的安全加速解决方案。通过边缘缓存技术&#xff0c;智能调度使用户就近获取所需内容&#xff0c;为用户提供稳定快速的访问…

多线程与线程互斥

目录 引言 一、多线程设计 多线程模拟抢票 二、互斥锁 互斥量的接口 修改抢票代码 锁的原理 锁的封装&#xff1a;RAII 引言 随着信息技术的飞速发展&#xff0c;计算机软件正变得越来越复杂&#xff0c;对性能和响应速度的要求也日益提高。在这样的背景下&#xff0c;…

ZUC256 Go Go Go!!!

文章目录 背景运行效果代码 背景 因业务需要使用ZUC算法&#xff0c;GitHub上又没有对ZUC256相对应的Go语言的实现。 吃水不忘挖井人&#xff0c;在这里感谢GmSSL及BouncyCastle两个强大的密码学库&#xff01; 本ZUC256的编写&#xff0c;参考了这两个库及中科院软件院发布的…

力扣打卡12:复原IP地址

链接&#xff1a;93. 复原 IP 地址 - 力扣&#xff08;LeetCode&#xff09; 这道题需要对字符串进行操作&#xff0c;我选择了三层循环&#xff0c;其实还可以递归。 我在循环时进行了剪枝&#xff0c;比如一些情况直接跳出循环。 我的代码&#xff1a; class Solution { p…

【实践·专业课】内存管理-存储管理-文件系统

1. 基于Linux的简单区块链实现 1.1. 环境准备 确保使用的 Linux 系统&#xff08;如 Ubuntu、CentOS 等&#xff09;已安装 Python 3。 在终端输入python3命令&#xff0c;若出现 Python 解释器的版本信息等提示&#xff0c;则表示已安装&#xff1b; 若提示未找到命令&…

2个GitHub上最近比较火的Java开源项目

1. SpringBlade 微服务架构 标题 SpringBlade 微服务架构 摘要 SpringBlade 是一个由商业级项目升级优化而来的微服务架构&#xff0c;采用Spring Boot 3.2、Spring Cloud 2023等核心技术构建&#xff0c;遵循阿里巴巴编码规范&#xff0c;提供基于React和Vue的两个前端框架&am…

MongoDB 建模调优change stream实战

MongoDB开发规范 &#xff08;1&#xff09;命名原则。数据库、集合命名需要简单易懂&#xff0c;数据库名使用小写字符&#xff0c;集合名称使用统一命名风格&#xff0c;可以统一大小写或使用驼峰式命名。数据库名和集合名称均不能超过64个字符。 &#xff08;2&#xff09…

Ubuntu 环境美化

一、终端选择 zsh 参考文章使用 oh-my-zsh 美化终端 Oh My Zsh 是基于 zsh 命令行的一个扩展工具集&#xff0c;提供了丰富的扩展功能。 先安装zsh再安装Oh My Zsh 1.zsh安装 sudo apt-get install zsh 2.设置默认终端为 zsh chsh -s /bin/zsh 3.安装 oh-my-zsh 官网&…

分布式事务的前世今生-纯理论

一个可用的复杂的系统总是从可用的简单系统进化而来。反过来这句话也正确: 从零开始设计的复杂的系统从来都用不了&#xff0c;也没办法让它变的可用。 --John Gal 《系统学》 1975 1. 事务的概念 百科&#xff1a; 事务&#xff08;Transaction&#xff09;&#xff0c;一般是…

操作系统的文件系统

文件系统的基本组成 ⽂件系统是操作系统中负责管理持久数据的⼦系统&#xff0c;说简单点&#xff0c;就是负责把⽤户的⽂件存到磁盘硬件中&#xff0c; 因为即使计算机断电了&#xff0c;磁盘⾥的数据并不会丢失&#xff0c;所以可以持久化的保存⽂件。 ⽂件系统的基本数据单位…

vue使用百度富文本编辑器

1、安装 npm add vue-ueditor-wrap 或者 pnpm add vue-ueditor-wrap 进行安装 2、下载UEditor 官网&#xff1a;ueditor:rich text 富文本编辑器 - GitCode 整理好的&#xff1a;vue-ueditor: 百度编辑器JSP版 因为官方的我没用来&#xff0c;所以我自己找的另外的包…

浅谈自然语言处理技术(NLP)在银行领域的应用

自然语言处理技术(NLP)通过解析和理解海量非结构化数据,为银行领域提供了前所未有的洞察力和决策支持。这项技术的应用不仅优化了风险管理,还革新了客户服务和市场分析等多个方面。 银行系统中存在大量的非结构化信息,这些信息不仅数据量庞大,而且种类繁多,处理起来相对…

nvm安装指定版本显示不存在及nvm ls-remote 列表只出现 iojs 而没有 node.js 解决办法

在使用 nvm install 18.20.3 安装 node 时会发现一直显示不存在此版本 Version 18.20.3 not found - try nvm ls-remote to browse available versions.使用 nvm ls-remote 查看可安装列表时发现&#xff0c;列表中只有 iojs 解决方法&#xff1a; 可以使用以下命令查看可安装…

Linux磁盘存储概念(六)

本文为Ubuntu Linux操作系统- 第六弹 今天开始新的知识点&#xff0c;讲磁盘存储问题 上期回顾&#xff1a;Linux文件、目录权限问题 今天由帝皇侠陪伴大家学习&#xff01;&#xff01;&#xff01; 文章目录 磁盘数据组织低级格式化磁盘分区高级格式化 磁盘设备命名磁盘分区分…

鼠标右键单击Git Bash here不可用

最近在学习git时突然发现右键的git bash没反应&#xff0c;但是去点击应用图标就能正常运行&#xff0c;通常是因为你在安装git之后改变了它的目录名称或者位置&#xff0c;我就是因为安装后改变了一个文件夹的文件名导致不可用 在安装git时系统会默认给鼠标右键选项的git Bas…

计算机网络之NAT、代理服务、内网穿透、内网打洞

个人主页&#xff1a;C忠实粉丝 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 C忠实粉丝 原创 计算机网络之NAT、代理服务、内网穿透、内网打洞 收录于专栏【计算机网络】 本专栏旨在分享学习计算机网络的一点学习笔记&#xff0c;欢迎大家在评论区交流讨论…