综合实例_Verilog设计与逻辑综合实例解析(可综合RTL)

//源自微信公众号 “数字芯片实验室”

本文介绍了一些代码中可能存在的可综合 “陷阱”。

只有输入,没有输出的模块将会综合成什么?

仅有输入且无输出的模块将会被综合成没有逻辑的模块。

为什么在综合出的逻辑中看到锁存器?

有很多原因会导致在综合出的逻辑中存在锁存器。通常在综合工具的日志中都有详细的说明。

1、always语句块中的if-else子句没有最终的else子句,并且没有初始值。

2、case语句块中没有default子句,并且在进入case语句块中没有被赋初始默认值。

什么是“组合时序环(combinatorial timing loops)”?为什么要避免?

combinatorial timing loops是指一个门或者很长的组合逻辑输出被反馈作为其中一个门的输入。这些路径通常是由于大的组合逻辑块中一个信号驱动同一个组合逻辑块中的另一个信号。

这些组合反馈回路是不被需要的:

1、由于组合反馈回路中没有时钟来打断路径,所以组合逻辑环将无限振荡

,其占空比取决于组合路径上的延迟。例如,以下代码是组合逻辑环:

 assign out1 = out1 & in1 ;

这将导致out1作为其中一个组合逻辑输入。

这些循环会导致可测试性的问题。

可以通过以下手段在早期发现组合逻辑环:

1、在使用HDL语言设计过程中定期使用linting工具。

这是迄今为止,捕获和修复组合逻辑循环的最佳和最简单的方法。

2、 在功能仿真期间,期望的输出行为没有出现在输出中,或者仿真根本没有进行,因为仿真器停止在组合逻辑环了。

3、 如果在仿真期间未检测到组合逻辑环路,许多综合工具都具有合适的报告命令,用于检测组合逻辑环的存在。

综合工具会打破关键路径分析的循环时序弧,然后继续进行静态时序分析。

组合always语句块中的敏感列表如何影响综合前后的仿真?

Verilog-1995中,在综合和仿真之间, RHS中的所有元素都应该作为组合逻辑always语句块的敏感列表的一部分。

虽然综合工具会根据不在敏感列表中的变量继续综合,但是仿真工具将忽略不在敏感列表中的变量的变化。结果是,功能仿真和综合后仿真的行为是不同的。

通常,文本编辑器(如具有Verilog语言模式的emacs)能够自动推断出正确的敏感列表变量,并自动将其添加到敏感列表中。 Linting工具也会在解析期间提供错误消息

Verilog-2001开始,这不再是一个问题。@(*)添加了所有的变量到敏感列表。例如,将RHS的所有元素都添加到敏感列表中:

Verilog-1995中:

always@(in1 or in2 or in3 or in4) begin
 out1 = (in1 ^ in2) & (in3 | in4) ;
end

Verilog-2001中:

//note the use of “,”in the place of ”or”
always@(in1,in2,in3,in4) begin
 out1 = (in1 ^ in2) & (in3 | in4) ;
end
 
or 
 
//note the use of “*”
always@(*) begin
 out1 = (in1 ^ in2) & (in3 | in4) ;
end

SystemVerilog中可以使用always_comb,如下:

always_comb 
begin
 out1 = (in1 ^ in2) & (in3 | in4) ;
end

此时,代码更加简单,也更易于维护。

你可能感兴趣的:(综合实例)