文档介绍:第六章
RTL代码编写指南
郭炜 魏继增 郭筝 谢憬
内容大纲
编写RTL代码之前的准备
可综合RTL代码编写指南
调用Synopsys DesignWare来优化设计
编写RTL代码之前的准备
RTL代码编写前需要时候为了改进速度,会选择特殊的结构单元,如单周期乘法器、串行加法器链、复杂控制逻辑、大指令解码单元等,这些可以在RTL中直接调用Synopsys的DesignWare库
对布线的考虑
把大量信号组合起来形成一个大的逻辑,不仅会造成由于这一级组合电路太多而难以满足时序要求,而且会形成一个很大的多路选择器(Mux),造成连线过于集中,从而在一小块面积内占用大量的布线资源
多个片上RAM/ROM共用一个BIST模块,由于BIST信号将连到每一块RAM/ROM上,在这个BIST模块附近常会出现布线阻塞
内容大纲
编写RTL代码之前的准备
可综合RTL代码编写指南
调用Synopsys DesignWare来优化设计
可综合RTL代码的编写准则——命名
模块的命名
在系统设计阶段应该为每个模块进行命名,最终的顶层模块应该以芯片的名称来命名
在顶层模块中,除I/O引脚和不需要综合的模块外,其余作为次级顶层模块,
对于多处理器的设计,共享模块以(模块名_处理器名)命名
模块的命名和该模块的功能相结合
可综合RTL代码的编写准则——命名
信号的命名
所有信号的命名由小写字母、下划线和数字组成,并且以小写字母开头
低电平有效的信号后一律加下划线和字母n或b,如sysrst_n、fifofull_b
总线由高位到低位命名,如bus[31∶0]
不需要在信号名字中表明信号的方向,如用my_signal比my_signal_in更简明
命名应当尽量保持一致性,一些全局的信号(clock,reset)在每个子模块中都有相同的名字,两个子模块的接口信号也应当一致。在信号列表中,以注释形式指明信号的方向
my_module (
my_signal, // input from other_module
);
可综合RTL代码的编写准则——命名
信号的命名
在模块的例化过程中采用信号名称连形式,避免使用指明位置的形式,并且每行例化一个信号
my_module my_module_inst(
.signal (signal), //signal input from other module
.a_bus (a_bus), //address bus from core module
);
在信号列表中,将clk、reset等扇出较大的信号列在最后,统一规范,便于阅读
my_module (
signals_to_from_block_A, // description
signals_to_from_block_B, // description
reset,
clk
);
命名要尽量显得有意义,说明它的用途、目的、功能等
可综合RTL代码的编写准则——命名
同步触发器的命名
如果有异步信号需要同步,那么该同步触发器的命名建议加上“synch”,如synch_stage_1
时钟信号的命名
全局时钟以clk命名
其他时钟信号的命名需要包含相关的频率信息,如clk_32k
文件的命名
一个文件只能包含一个模块,而文件名应该与模块名相同,这样做可以方便修改设计
可综合RTL代码的编写准则——编码风格
利用缩进来显示代码的逻辑结构,缩进一致,并以Tab为单位
语句块之间由begin和end划分清楚
首行缩进使得代码结构清晰,可读性增强
同一个层次的所有语句左对齐
initial、always等语句块的begin关键词跟在本行的末尾,相应的end关键词与initial、always对齐
对于时序单元必须采用非阻塞赋值
组合逻辑采用阻塞赋值
不要将阻塞赋值和非阻塞赋值混合在一个程序块中
保证敏感列表完整,避免仿真和综合过程中出现功能错误
尽量不使用循环结构
对代码加上适当的注释
编码风格——阻塞赋值
Data_Out所赋的值将是信号Intermediate_Variable的新值,即In_A & In_B
reg Data_Out;
reg Intermediate_Variable;
always @(In_A, In_B)
begin
Intermediate_Variable = In_A & In_B;