蓝冠官网《Q374919》 在编写HDL代码时,蓝冠 应该首先考虑哪些问题?创建一个好的层次结构?保持同步设计?注册输入和输出?我将提出一个更基本的问题:为东西找好名字。请考虑一下,如果您花时间清楚地为各种I/ o、信号、寄存器、模块等命名,那么您的HDL编码生活会是什么样的。
在编写HDL代码时,应该首先考虑哪些问题?创建一个好的层次结构?保持同步设计?注册输入和输出?
我将提出一个更基本的问题:为东西找好名字。
请考虑一下,如果您花时间清楚地为各种I/ o、信号、寄存器、模块等命名,那么您的HDL编码生活会是什么样的。
•你会写更好的文档。
HDL代码本身有助于说明设计是如何完成它应该做的事情的。这意味着周围的评论可以集中说明为什么设计是这样构建的。
•你会写不那么明确的文档。
因为HDL名称有助于文档的编写,所以实际需要的注释更少。随着设计的改变,这些评论更新的频率也会降低,因为设计的“为什么”要比“如何”改变的频率低。
•引入更少的bug。
bug进入代码是因为我们把它们放在那里,通常是因为我们不清楚设计在做什么。好的名称能够传达设计要解决的问题的含义,蓝冠官网 因此更容易将问题装入您的头脑。然后,您将花费较少的精力将变量转换回问题域,而将更多精力用于生成正确的代码。
•您的调试会话将更容易。
出于同样的原因,当调试器显示名称直接引用问题域中项的变量时,更容易跟踪和发现错误。
•你的设计会被更频繁地重复使用。
如果一个设计对你来说更容易理解和修改,同样的道理也会适用于其他人,他们也更有可能使用它。
下面是命名重要性的另一个说明:Code Complete中的“变量名的力量”比其他任何一章都要长25%。你可以现在就停止读这篇文章,去读那一章,但我要给你简要介绍一下相关要点:
变量名应该描述它所代表的内容。
例如,将记录火箭当前高度的遥测模块中的变量称为heightOfAscent就很合适。但对于名为h或(更糟糕)x的变量则不是这样。
•变量应该指向问题域,而不是实现。
例如,命名可变高度计数器意味着火箭的高度在计数器中维护。这涉及到如何在电路中计算高度,蓝冠注册 但这可能会随着设计实现的改变而改变。如果逻辑发生了变化,或者更糟糕的是,变量名对设计的工作方式产生了误导,您不希望不得不更改变量名。
变量名应该在10到16个字符之间。
这使得变量在传达意义的同时更容易被理解(尽管你可以将其扩展到8-20个字符,但结果只会稍微糟糕一点)。当然,描述问题域的变量名可能会变得相当长(heightOfAscent已经是14个字符了),所以您必须使用一些技术来缩短它们,比如删除非前导元音(hghtOfAscnt)和删除冠词(hghtAscnt)。
变量的作用域越大,名称的描述性越强。
例如,您可以在短的generate循环中使用i作为索引,但不能用于1000行代码块(好吧,没有什么适合于这种情况)。
除了上面显示的一般原则之外,我还有VHDL代码中修饰名称的约定。我使用大小写和附加后缀,使我更容易和更快地生成有意义的、一致的名称。它也指出了信号的来源和它们的用途。以下是我使用的规则:
实体、体系结构、过程、函数、typenames: CamelCase with a initial uppercase letter。
•包装:驼包,首字母大写,以Pckg结尾。
•组件实例化:CamelCase与初始U。
•常量和泛型:所有大写下划线和_C或_G作为后缀。
•信号和变量:带有首字母小写字母和一个或多个以下后缀的驼峰字母:
- _i:输入端口
- _o:输出端口
- _s:信号本地到架构。
- _v:进程的局部变量。
- _b:低激活(互补)信号。
- _r:当前寄存器值。
- _x:时钟边缘后的下一个寄存器值。
- _a:异步信号
- _d:信号的延迟版本。
- _e:信号的启用版本。