《Reuse methodology manual》读书笔记:RTL编程指导

《Reuse methodology manual》读书笔记:RTL编程指导,第1张

(转)在Reuse methodology manual第五章,主要收集了一些HDL代码的规范和指导。遵照这些规范或者指导的目的是让你的代码更加的具有可读性、可修改性、可重用;这个应该是所有语言所追求的;而针对HDL代码,还要使代码适合综合和仿真。

注:下面所说的不是什么金科玉律,但是如果能够遵循的话,一定可以增加编程的效率和提高设计的质量。

1. 一般的命名规范

原则:设计自己的命名规范,并对该规则编写文档;在以后的设计中也需要保持一致。

建议:

用小写字母表示所有的信号(signal),变量(variable)和端口(port)名字;
用大写字母表示常量(constant)和用户自定义的类型(type);
用有意义的名字来表示信号,端口,函数或者参数,例如ram_addr用来表示RAM address bus.
用一致的名字表示时钟信号(clock signal);如CLK;
用一致的名字表示复位信号(reset signal);如RST;
低电平有效的信号,名字末尾添加”_b” 或者”_n”;如复位信号低电平有效,可表示为:rst_n;
参考如下:

 

《Reuse methodology manual》读书笔记:RTL编程指导,《Reuse methodology manual》读书笔记:RTL编程指导,第2张

 

用一致的顺序表示总线,如VHDL中统一用(x downto 0),Verilog HDL统一用[x:0];

合理的注释,对VHDL来说,在代码中合理描述process,funcTIon,type和subtype等

为了方便阅读,尽量保持每行不超过72个字母的长度。

用缩进的方式改善代码的可读性,谨慎使用TAB键缩进,因为不同的编辑器有不同缩进的定义,4个或8个字符

端口的定义顺序,每行只定义一个端口,先input port,后output port;顺序可以为:clk,rst,enable,other control signals,Date and address signals

参考如下:

 

《Reuse methodology manual》读书笔记:RTL编程指导,《Reuse methodology manual》读书笔记:RTL编程指导,第3张

 

注:上面的端口定义中请注意各个端口的名称以及常量的名称,当然在这里没有详细对每个端口进行注释;如果端口比较多且容易分组的时候,请对端口进行分组注释,主要的目的还是为了增加可读性。

2. 源文件头信息的内容(InformaTIonal Headers)

每个源文件都应该包含该文件的相关信息,以便读者或者将来自己的更新,所以头信息必须包含一下内容:

法律声明:保密性,版权,复制品的限制等

文件名

作者

功能描述和模块的关键属性列表

文件创建日期

修订的历史:日期,修订者,修改的表述

头文件参考如下:

 

《Reuse methodology manual》读书笔记:RTL编程指导,《Reuse methodology manual》读书笔记:RTL编程指导,第4张

3.时钟和复位信号的设计

尽量在设计中避免同时使用上升沿和下降沿触发器,如果无法避免最好将两种触发器放到不同的模块中;

避免手动例化时钟缓冲器,综合工具会自己动添加;

避免门控时钟(Gated Clock),意思说:时钟信号通过一个门电路到达触发器的时钟输入端口,这样给时钟带来一些不确定的因素,产生抖动或者延迟;

避免内部产生时钟信号,内部产生的时钟信号会限制设计的在线测试;

跨时钟域的数据传输,例如:single-bit同步器的设计,见下图;

《Reuse methodology manual》读书笔记:RTL编程指导,《Reuse methodology manual》读书笔记:RTL编程指导,第5张

 

MulTIple-bit 同步器可以用可靠的握手电路或者mulTIbit coding scheme(这个不是很懂)

4. 综合

在设计中避免任何锁存器的出现

避免组合逻辑中的反馈

 

《Reuse methodology manual》读书笔记:RTL编程指导,《Reuse methodology manual》读书笔记:RTL编程指导,第6张

 

 

定义完整的敏感信号列表,VHDL: process(sensitive list);Verilog:always(sensitive list);

5. 模块划分(Partitioning)

一个好的模块划分有以下优点:

更好的综合结果

缩短编译运行时间

可以用简单的综合策略来满足时序的要求

建议:

寄存所有模块的输出

《Reuse methodology manual》读书笔记:RTL编程指导,《Reuse methodology manual》读书笔记:RTL编程指导,第7张

将相关的组合逻辑放到一个单一模块
例如:

Bad example:

《Reuse methodology manual》读书笔记:RTL编程指导,《Reuse methodology manual》读书笔记:RTL编程指导,第8张

Good example:

《Reuse methodology manual》读书笔记:RTL编程指导,《Reuse methodology manual》读书笔记:RTL编程指导,第9张

如果两个模块(module)有不同的设计目标,一个要求面积,一个要求速度,最好将这两个模块分开设计,见下图

《Reuse methodology manual》读书笔记:RTL编程指导,《Reuse methodology manual》读书笔记:RTL编程指导,第10张

杜绝在顶层设计中例化一个门级逻辑,例如:

Bad example:

《Reuse methodology manual》读书笔记:RTL编程指导,《Reuse methodology manual》读书笔记:RTL编程指导,第11张

Good example:

《Reuse methodology manual》读书笔记:RTL编程指导,《Reuse methodology manual》读书笔记:RTL编程指导,第12张

6.总结

林林总总说了这么多,杂乱无章,内容基本上都是从书中摘录下来,没有很细的地方,只说了点怎么做,但是绝对没有说到为什么这么做。以上都是书中的经验之谈,话说经验还是自己经历了,遇到了,体会才会深刻。边实践边学习,边思考边总结,经验总会有的,体会总会有的,思想深度也会提高的。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/dianzi/2587664.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-08-08
下一篇 2022-08-08

发表评论

登录后才能评论

评论列表(0条)

保存