返回首页
当前位置: FPGA主页 > 工具应用 >

使用SignalTap II观察reg与wire值(2)

时间:2010-02-06 22:53来源:网络 作者: 点击:
观察 wire 同样的,在 SignalTapII 观察 wire 时,有时也会因为被 QuartusII 优化掉而无法用 SignalTapII 观察。 SignalTapII_wire_not_keep.v / Verilog moduleSignalTapII_wire_not_k

观察wire
同样的,在SignalTap II观察wire时,有时也会因为被Quartus II优化掉而无法用SignalTap II观察。

SignalTapII_wire_not_keep.v / Verilog

  1. module SignalTapII_wire_not_keep (  
  2.   input        iCLK,  
  3.   input        iRST_N,  
  4.   output [3:0] oCNT  
  5. );  
  6.  
  7. wire [3:0] Cnt;    
  8. reg  [3:0] cnt;  
  9.  
  10. assign Cnt = cnt;  
  11. assign oCNT = Cnt;  
  12.  
  13. always@(posedge iCLK, negedge iRST_N) begin  
  14.   if (!iRST_N)  
  15.     cnt <= 4'h0;  
  16.   else 
  17.     cnt <= cnt + 4'h1;  
  18. end  
  19.  
  20. endmodule 


7行
wire [3:0] Cnt;

假设我想用SignalTap II去观察Cnt这个wire

signaltap2_reg4 

Cnt都是0,显然不合理,表示SignalTap II无法capture cnt这个wire的值。为什么会这样呢?

因为Cnt这个wire已经被Quartus II优化不见了!!

不过有时为了debug方便,我们就是想观察这种wire,有办法让Quartus II暂时不要启动最佳化吗?

SignalTapII_wire_keep.v / Verilog

  1. module SignalTapII_wire_keep (  
  2.   input        iCLK,  
  3.   input        iRST_N,  
  4.   output [3:0] oCNT  
  5. );  
  6.  
  7. wire [3:0] Cnt /*synthesis keep*/;    
  8. reg  [3:0] cnt;  
  9.  
  10. assign Cnt = cnt;  
  11. assign oCNT = Cnt;  
  12.  
  13. always@(posedge iCLK, negedge iRST_N) begin  
  14.   if (!iRST_N)  
  15.     cnt <= 4'h0;  
  16.   else 
  17.     cnt <= cnt + 4'h1;  
  18. end  
  19.  
  20. endmodule  


7行
wire [3:0] Cnt /*synthesis keep*/

多了/*synthesis keep*/这个synthesis attribute指示Quartus II不要对Cnt做最佳化,保留此wire以供SignalTap II观察注意必须写在分号前面,不能如下写在分号后面
wire [3:0] Cnt;/*synthesis keep*/ //错  


编译后,SignalTap II就能顺利的观察到Cnt的值!!重点是不需改top moduleinterface,只需对想观察的wire加上synthesis attribute即可。

signaltap2_reg5

Quartus II也支援Verilog 2001的語法

  1. module SignalTapII_wire_keep (  
  2.   input        iCLK,  
  3.   input        iRST_N,  
  4.   output [3:0] oCNT  
  5. );  
  6.  
  7. // Verilog 2001  
  8. (*keep*) wire [3:0] Cnt;  
  9. reg  [3:0] cnt;  
  10.  
  11. assign Cnt = cnt;  
  12. assign oCNT = Cnt;  
  13.  
  14. always@(posedge iCLK, negedge iRST_N) begin  
  15.   if (!iRST_N)  
  16.     cnt <= 4'h0;  
  17.   else 
  18.     cnt <= cnt + 4'h1;  
  19. end  
  20.  
  21. endmodule  


8行
(*keep*) wire [3:0] Cnt;

这是Verilog 2001的语法,Quartus II 8.0也能看得懂。

结语
关于避免Quartus II优化reg/*synthesis noprune*//*synthesis preserve*/还是有些差异,程序写到很大时,可能一时很难决定要用哪一个attribute,可以交替试试看,反正1/2的机会,总会对一个。会使用synthesis attribute之后,总算解掉长久以来,无法用SignalTap II观察regwire的老问题。

(责任编辑:admin)
顶一下
(1)
100%
踩一下
(0)
0%
------分隔线----------------------------
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名:密码: 验证码:点击我更换图片
推荐内容