目录
设计的可综合性
可综合值得是设计的代码能转化为具体的电路网表结构。综合就是将 Verilog 语言描述的行为级或功能级电路模型转化为 RTL 级功能块或门级电路网表的过程。
综合的流程
综合的过程:
- Verilog HDL 行为级或功能级电路建模
- RTL 级功能块
- 逻辑优化
- 优化后的门级网表
其中前两条为 RTL 级综合,后两条为门级综合,是目标工艺面积和定时约束。
注意要点
在进行可综合的设计中,为避免设计出不可综合的语句,应注意以下事项:
- 不使用初始化语句(initial);不使用带有延时的描述(如 #50);不适用循环次数不确定的循环语句(如 forever、while 等)。
- 尽可能采用同步方式设计电路,除非是关键路径的设计,一般不采用条用门级元件来描述设计的方法,建议采用行为语句完成设计。
- 组合逻辑和时序逻辑实现的电路尽量分配到不同的 always 过程块中,always 块过程只有两种状态:执行状态和等待状态。当特定的条件到来时,或进入到执行状态,执行完毕或者遇到停止信号,则终止执行,进入到等待状态。
- 一个 always 过程中只允许描述对应于一个时钟信号的同步时序逻辑。多个 always 过程之间可通过信号线进行通信和协调,比如利用握手机制。
- 尽量使用器件的全局端作为系统的总复位,因为该引脚的驱动能力最强,到所有逻辑单元的延时也基本相同。同样的道理,应尽量使用器件的全局时钟端作为系统外部时钟输入端。
- 在 Verilog 模块中,任务 task 通常被综合成组合逻辑的形式,函数 function 在调用时通常也被综合成一个独立的组合电路逻辑,因此尽可能的少用 task 和 function。
常见不可被综合的语句:
fork-join、initial、forever、while、repeat 以及 assign 语句持续赋值中,等式左边含有变量的位选择的时候,也是不可被综合的。
流水线设计技术
在系统工作时为了尽可能的提高系统运行速度,保证数据的快速传输,流水线的设计是一种常见的设计方法。但是,如果在某些复杂逻辑功能的完成需要较长的延时,就会使系统难以运行在高的频率上。这种情况下,可使用流水线技术,即在长延时的逻辑功能块中插入触发器,使复杂的逻辑操作分步完成,减小每一部分的延时,从而使系统的运行频率得以提高。但是流水线的弊端在于增加了寄存器逻辑,进而消耗了更多的芯片内部资源。相当于用资源换速率,在资源允许的前提下,适当加入流水线的操作,可以显著提高系统的运行频率。
以下为流水线操作的概念示意图,可以看出虽然消耗了更多的寄存器,但是速率却有了显著的提升。
以一个简单的例子说明,实现一个 8 位全加器,分别进行非流水线实现方式、两级流水线方式实现、四级流水线方式实现,以四级流水线方式实现的系统比不使用流水线方式实现的系统的运行频率可以提高 30%!
资源共享
尽量减少系统好用的器件资源也是在设计电路时追求的目标,资源共享就是一个比较好的解决方案,尤其是将一些好用资源较多的模块进行共享,能有效降低整个系统耗用的资源。
方案一:
用 2 个加法器和 1 个 MUX 实现
module add(
input sel,
input [3:0] a,b,c,d,
output reg [4:0] sum
);
always @(*)
begin
if (sel) begin
sum = a + b;
end
else begin
sum = c + d;
end
end
endmodule
方案二:
用 1 个加法器和 2 个 MUX 实现
module add(
input sel,
input [3:0] a,b,c,d,
output reg [4:0] sum
);
reg [3:0] atmp,btmp;
always @(*)
begin
if (sel) begin
atmp = a;
btmp = b;
end
else begin
atmp = c;
btmp = c;
end
sum = atmp + btmp;
end
endmodule
可以看出上面两个方案都可以实现相同的功能,但是他们所使用的资源是不一样的,方案一用 2 个加法器和 1 个 MUX 实现,方案二用 1 个加法器和 2 个 MUX 实现,两个加法共享了一个加法器,而加法器耗用的资源比 MUX 多,因此方案二更节省资源,这只是一个小的模块,如果在比较大的工程项目中,资源会比较紧张,资源共享就显得有必要。
在节省资源的设计中应注意:
- 尽量共享复杂的运算单元,可以采用函数和任务来定义这些共享的数据处理模块。
- 可用加括号等方式控制综合的结果,尽量实现资源的共享,重用已计算过的结果。
阻塞赋值与非阻塞赋值
在设计电路时,使用阻塞赋值和非阻塞赋值要点:
- 当用 always 块来描述组合逻辑时,既可以用阻塞赋值也可以用非阻塞赋值,建议用阻塞赋值。
- 设计时序逻辑电路时,尽量使用非阻塞赋值方式。
- 描述锁存器(latch),尽量使用非阻塞赋值。
- 若在同一个 always 过程块中既位时序逻辑建模,又为组合逻辑建模买最好使用非阻塞赋值方式。
- 在一个 always 块中,最好不要混合使用阻塞赋值和非阻塞赋值;对于同一个变量,不能既进行阻塞赋值,又进行非阻塞赋值,这样在综合时会出错。
- 不能在两个及两个以上的 always 过程中对同一个变量赋值,这样会引起冲突,在综合会出错。