在Quartus SignalTap 工具中加入信号,发现加入的信号变成红色,如图所示的data_slave[7..0]:
这样的信号是没有办法观测的,不会根据SignalTap 的Clock和Trigger进行更新,原因是Synthesis过程将它省略,
添加综合选项(Synthesis Attribute)可以让综合器保留这些对顶层模块输入输出没有帮助的信号,常用的有:
wire[7:0] cnt/*synthesis keep*/; // Keep the Entity of Wire
reg signed[11:0] corr_i_out/*synthesis preserve*/; // Keep the Entity of Register
实际上,对于组合逻辑的输出可以用keep,而时序逻辑块的输出信号常用preserve选项。
同时,红色的无效SignalTap信号会影响SignalTap中其他的信号。这样的空头支票放入SignalTap组件之中,很大概率会影响系统的时序,比如,使得其他待观测的信号全部观察不到了!
在设计调试的时候一定要取消这样的“空头支票”。
*****************************************************************************
*****************************************************************************
************ Quartus中,综合选项preserve和noprune选项的差别:
在Quartus模板代码插入工具中,有综合选项的选项,Altera给出的形式和说明分别如下:
// Prevents Quartus Prime from optimizing away a register.
// Apply the attribute to the variable declaration for an object that infers a register.
(* preserve *) <variable_declaration>;
(* preserve *) module <module_name>(...);
// Prevents Quartus Prime from removing or optimizing a fanout free register.
// Apply the attribute to the variable declaration for an object that infers a register.
(* noprune *) <variable_declaration>;
在帮助文档中,有更详细的解释,关键点总结如下:
(1)preserve
preserve属性防止Quartus在“分析与综合”过程中缩减或者删除那个指定的寄存器,这个综合属性可以将寄存器预留给仿真器或者SignalTap,方便我们进行观测。preserve属性还可以在设计初期防止寄存器被优化消失,比如寄存器输入总是赋“逻辑1”这样的常量,“分析-综合”器会把这个寄存器的特性认为是“不关心上电后的初值”,进而综合(Synthesis)的结果将这个寄存器省略(消除)了。如果加入preserve这个选项就会使这个寄存器实体存在。
另外,preserve属性不能阻止综合器优化那些重复(duplication)或者分组捆绑(pack)的寄存器。重复和分组捆绑的详细情况保存在Analysis& Synthesis Netlist Optimizations和Fitter Netlist Optimizations报告中。更加详尽的寄存器综合选项请查看Netlist Optimizations选项。
同时,preserve选项有两个重要的局限性:
如果寄存器有preserve属性,那么它不会被综合成为状态机的元素。(就是说,有可能破坏综合器对于状态机的合成)
preserve属性不能防止综合器删除那些无扇出的寄存器。(对于无扇出的寄存器,请用noprune选项进行保留)
Verilog 2001规范中,可以这样赋予preserve属性:
(*preserve*) reg dout_reg;
还可以这样进行属性赋予:
reg dout_reg/* synthesis preserve */;
在定义module时,也可以给这个模块赋予preserve属性,这样下来,模块中的所有reg都有了preserve的综合属性,形式如下:
(* preserve *) module my_block(rst, clk, ...);
(2)noprune
noprune大概是no prune(不要修剪)的紧凑写法。该属性阻止综合器删除那些不会直接、间接驱动顶层模块output(或者inout)端口的寄存器(比如说无扇出的寄存器)。noprune属性与preserve属性不同,preserve属性会让综合器保留那些本可以简化成常量逻辑的寄存器,还有那些可以合并在一起的寄存器(逻辑值共用一个源)。
在很多情况下,我们作为设计者都想使用这些无扇出(Fan-out Free)的寄存器。比如:这个寄存器在进一步的设计中会被用来驱动一些电路(预留位置);用来送入SignalTap进行观察调试;用来驱动SignalProbe引脚。
实际上,Quartus编译器将noprune属性翻译为Preserve Fan-out Free Register Node选项交给综合器进行处理。
在Verilog 2001中的用法如法炮制:
(* noprune *) reg dout_reg;
和
reg dout_reg/* synthesis noprune */;
*************************************************************************************************************************
*************************************************************************************************************************
使用经验:
(1)有的时候,用noprune不能观测到,信号在SignalTap中为红的。这个时候用preserve属性,可以将信号观测到,但是原理图上失去了状态机。
(2)有的时候,给状态机的stat变量用preserve属性标注,这样会使得State Machine Viewer中失去该状态机,stat变量可以被观测到,但是系统工作不正常(???)。这时将其他内部reg用noprune属性标注,观测和功能都正常了。(什么原因?!?!)
来源:oschina
链接:https://my.oschina.net/u/4356887/blog/3384188