使用SignalTap II 有时无法显示reg和wire值解决Word文件下载.docx
- 文档编号:4788592
- 上传时间:2023-05-04
- 格式:DOCX
- 页数:12
- 大小:109.30KB
使用SignalTap II 有时无法显示reg和wire值解决Word文件下载.docx
《使用SignalTap II 有时无法显示reg和wire值解决Word文件下载.docx》由会员分享,可在线阅读,更多相关《使用SignalTap II 有时无法显示reg和wire值解决Word文件下载.docx(12页珍藏版)》请在冰点文库上搜索。
6.reg[3:
0]cnt;
7.
8.always@(posedgeiCLK,negedgeiRST_N)begin
9.
if
(!
iRST_N)
10.
cnt<
=4'
h0;
11.
else
12.
=cnt+4'
h1;
13.end
14.
15.endmodule
这是个很简单的计数器,我故意让cnt不做output,而想用SignalTapII去观察cnt这个reg的值。
cnt都是0,显然不合理,表示SignalTapII无法capturecnt这个reg的值。
为什么会这样呢?
若我们将SignalTapII拿掉,重新用QuartusII编译,观察其compilationreport,显示register为0。
观察RTLViewer的合成结果,真的没有register!
!
这证明了一件事情,QuartusII在合成时,发现cnt并没有需要output,而自动最佳化不合成cnt,导致SignalTapII无法观察reg,不过有时为了debug方便,我们就是想观察这种reg,有办法让QuartusII暂时不要启动最佳化吗?
使用SynthesisAttribute避免最佳化
SignalTapII_register_preserve.v/Verilog
1.moduleSignalTapII_register_preserve(
4.)
0]cnt
/*synthesisnoprune*/;
15.endmodule
6行
reg
[3:
多了/*synthesisnoprune*/这个synthesisattribute,指示QuartusII不要对cnt做最佳化,保留此register以供SignalTapII观察,注意必须写在分号前面,不能如下写在分号后面。
/*synthesisnoprune*///错!
编译后,SignalTapII就能顺利的观察到cnt的值!
重点是不需改topmodule的interface,只需对想观察的reg加上synthesisattribute即可。
QuartusII也支援Verilog2001的語法
6.//Verilog2001
7.//(*noprune*)reg[3:
8.
9.always@(posedgeiCLK,negedgeiRST_N)begin
13.
14.end
15.
16.endmodule
7行
(*noprune*)
这是Verilog2001的语法,QuartusII8.0也能看得懂。
若希望整个module的reg都不被最佳化,可将synthesisattribute放在module。
4.)
1行
module
SignalTapII_register_preserve(
input
iCLK,
iRST_N
//);
)
/*synthesispreserve*/;
观察wire同样的,在SignalTapII观察wire时,有时也会因为被QuartusII优化掉而无法用SignalTapII观察。
SignalTapII_wire_not_keep.v/VerilogmoduleSignalTapII_wire_not_k
观察wire
同样的,在SignalTapII观察wire时,有时也会因为被QuartusII优化掉而无法用SignalTapII观察。
SignalTapII_wire_not_keep.v/Verilog
1.moduleSignalTapII_wire_not_keep(
input
iCLK,
iRST_N,
4.
output[3:
0]oCNT
5.);
6.
7.wire[3:
0]Cnt;
8.reg
[3:
9.
10.assignCnt=cnt;
11.assignoCNT=Cnt;
12.
13.always@(posedgeiCLK,negedgeiRST_N)begin
14.
15.
16.
17.
18.end
19.
20.endmodule
wire
假设我想用SignalTapII去观察Cnt这个wire。
Cnt都是0,显然不合理,表示SignalTapII无法capturecnt这个wire的值。
因为Cnt这个wire已经被QuartusII优化不见了!
不过有时为了debug方便,我们就是想观察这种wire,有办法让QuartusII暂时不要启动最佳化吗?
SignalTapII_wire_keep.v/Verilog
1.moduleSignalTapII_wire_keep(
0]Cnt
/*synthesiskeep*/;
20.endmodule
加大编辑框
|
缩小编辑框
7.//Verilog2001
8.(*keep*)wire[3:
9.reg
10.
11.assignCnt=cnt;
12.assignoCNT=Cnt;
13.
14.always@(posedgeiCLK,negedgeiRST_N)begin
18.
19.end
20.
21.endmodule
8行
(*keep*)
结语
关于避免QuartusII优化reg,/*synthesisnoprune*/与/*synthesispreserve*/还是有些差异,程序写到很大时,可能一时很难决定要用哪一个attribute,可以交替试试看,反正1/2的机会,总会对一个。
会使用synthesisattribute之后,总算解掉长久以来,无法用SignalTapII观察reg与wire的老问题。
多了/*synthesiskeep*/这个synthesisattribute,指示QuartusII不要对Cnt做最佳化,保留此wire以供SignalTapII观察,注意必须写在分号前面,不能如下写在分号后面。
/*synthesiskeep*/
//错
编译后,SignalTapII就能顺利的观察到Cnt的值!
重点是不需改topmodule的interface,只需对想观察的wire加上synthesisattribute即可。
将/*synthesisnoprune*/放在module,这样整个module的reg将不被最佳化,不用再一一指定。
另外一个与reg相关的SynthesisAttribute:
/*synthesispreserve*/
跟reg相关的attribute,除了/*synthesisnoprune*/可用,还有一个/*synthesispreserve*/可用,两者的差异在于:
/*synthesisnoprune*/避免QuartusII优化掉没output的reg。
/*synthesispreserve*/避免QuartusII将reg优化为常数,或者合并重复的reg。
也可以使用Verilog2001的写法
//(*preserve*)reg[3:
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 使用SignalTap II 有时无法显示reg和wire值解决 使用 SignalTap 有时 无法 显示 reg wire 解决